diff --git a/100/transcendence.ml b/100/transcendence.ml index 7aeddf9e..3929849b 100644 --- a/100/transcendence.ml +++ b/100/transcendence.ml @@ -4311,18 +4311,16 @@ let x_monomial_factorizations_set = prove(` (* ===== coeff d p = coefficient of x^d in p *) -let coeff = new_definition ` - coeff (d:num) (p:(1->num)->R) - = p(x_monomial d) -`;; +let coeff_x_monomial = prove + (`!d (p:(1->num)->R). coeff d p = p(x_monomial d)`, + REWRITE_TAC[coeff; x_monomial]);; let eq_coeff = prove(` !(r:R ring) (p:(1->num)->R) q. (!d. coeff d p = coeff d q) ==> p = q `, - rw[coeff] THEN - qed[x_monomial_surjective;EQ_EXT] + qed[FUN_EQ_COEFF] );; let coeff_series_in_ring = prove(` @@ -4330,27 +4328,14 @@ let coeff_series_in_ring = prove(` ring_powerseries r p <=> !d. coeff d p IN ring_carrier(r) `, - intro THEN - splitiff THENL [ - rw[coeff] THEN - qed[ring_powerseries] - ; - intro THEN - rw[IN_ELIM_THM] THEN - rw[ring_powerseries] THEN - intro THENL [ - qed[x_monomial_surjective;coeff] - ; - qed[FINITE_MONOMIAL_VARS_1;INFINITE] - ] - ] + REWRITE_TAC[RING_POWERSERIES_COEFF] );; let coeff_series_from_coeffs = prove(` !(r:R ring) (f:num->R) d. coeff d (series_from_coeffs f) = f d `, - rw[coeff;series_from_coeffs;x_monomial] + rw[coeff_x_monomial;series_from_coeffs;x_monomial] );; let series_from_coeffs_coeff = prove(` @@ -4410,10 +4395,7 @@ let poly_coeff = prove(` /\ FINITE {d | ~(coeff d p = ring_0 r)} ) `, - intro THEN - have `series_from_coeffs (\d. coeff d p:R) = p` [series_from_coeffs_coeff] THEN - specialize[`r:R ring`;`\d. coeff d p:R`]poly_series_from_coeffs THEN - qed[] + REWRITE_TAC[RING_POLYNOMIAL_COEFF] );; let ring_polynomial_subring_if_coeffs = prove(` @@ -4422,14 +4404,7 @@ let ring_polynomial_subring_if_coeffs = prove(` (!d. coeff d p IN ring_carrier(subring_generated r G)) ==> ring_polynomial(subring_generated r G) p `, - rw[poly_coeff] THEN - REPEAT GEN_TAC THEN DISCH_TAC THEN - subgoal `{d | ~(coeff d p = ring_0 (subring_generated r G))} = {d | ~(coeff d p = ring_0(r:R ring))}` THENL [ - rw[EXTENSION;IN_ELIM_THM] THEN - qed[SUBRING_GENERATED] - ; pass - ] THEN - qed[] + qed[RING_POLYNOMIAL_SUBRING_COEFF] );; let coeff_series_carrier_in_ring = prove(` @@ -4446,7 +4421,7 @@ let coeff_poly_in_ring = prove(` ring_polynomial r p ==> coeff d p IN ring_carrier(r) `, - qed[ring_polynomial;coeff_series_in_ring] + qed[COEFF_IN_CARRIER_ALT] );; let coeff_poly_carrier_in_ring = prove(` @@ -4462,8 +4437,7 @@ let coeff_poly_const = prove(` coeff d (poly_const r c) = if d = 0 then c else ring_0 r `, - rw[coeff;x_monomial;poly_const;monomial_1] THEN - qed[] + REWRITE_TAC[COEFF_POLY_CONST] );; let coeff_poly_0 = prove(` @@ -4471,8 +4445,7 @@ let coeff_poly_0 = prove(` coeff d (poly_0 r) = ring_0 r `, - rw[poly_0;coeff_poly_const] THEN - qed[] + REWRITE_TAC[COEFF_POLY_0] );; let coeff_poly_1 = prove(` @@ -4480,7 +4453,7 @@ let coeff_poly_1 = prove(` coeff d (poly_1 r) = if d = 0 then ring_1 r else ring_0 r `, - rw[poly_1;coeff_poly_const] + REWRITE_TAC[COEFF_POLY_1] );; let coeff_poly_neg = prove(` @@ -4488,7 +4461,7 @@ let coeff_poly_neg = prove(` coeff d (poly_neg r p) = ring_neg r (coeff d p) `, - rw[coeff;poly_neg] + REWRITE_TAC[COEFF_POLY_NEG] );; let coeff_poly_add = prove(` @@ -4496,7 +4469,7 @@ let coeff_poly_add = prove(` coeff d (poly_add r p q) = ring_add r (coeff d p) (coeff d q) `, - rw[coeff;poly_add] + REWRITE_TAC[COEFF_POLY_ADD] );; let coeff_series_add = prove(` @@ -4512,7 +4485,7 @@ let coeff_poly_sub = prove(` coeff d (poly_sub r p q) = ring_sub r (coeff d p) (coeff d q) `, - rw[coeff;poly_sub] + REWRITE_TAC[COEFF_POLY_SUB] );; let coeff_poly_mul_lemma = prove(` @@ -4531,7 +4504,7 @@ let coeff_poly_mul = prove(` coeff d (poly_mul r p q) = ring_sum r {a,b | a+b = d} (\(a,b). ring_mul r (coeff a p) (coeff b q)) `, - rw[poly_mul;coeff] THEN + rw[poly_mul;coeff_x_monomial] THEN intro THEN rw[x_monomial_factorizations_set] THEN rw[ring_sum_image_x_monomial_pair] THEN @@ -4543,14 +4516,7 @@ let coeff_poly_mul_oneindex = prove(` coeff d (poly_mul r p q) = ring_sum(r) (0..d) (\a. ring_mul r (coeff a p) (coeff (d-a) q)) `, - intro THEN - rw[coeff_poly_mul] THEN - def `f:num->(num#num)` `\a:num. a,d-a` THEN - have `!a b:num. (f:num->num#num) a = f b ==> a = b` [FST] THEN - have `ring_sum r (IMAGE (f:num->num#num) (0..d)) (\(a,b). ring_mul r (coeff a p) (coeff b q)) = ring_sum(r:R ring) (0..d) ((\(a,b). ring_mul r (coeff a p) (coeff b q)) o f)` [RING_SUM_IMAGE] THEN - have `IMAGE (f:num->num#num) (0..d) = {a,b | a + b = d}` [image_numseg_antidiagonal] THEN - ASSUME_TAC(prove(`(\(a,b). ring_mul(r:R ring) (coeff a p) (coeff b q)) o (\a. a,d-a) = (\a. ring_mul r (coeff a p) (coeff (d-a) q))`,rw[FUN_EQ_THM;o_THM])) THEN - qed[] + REWRITE_TAC[COEFF_POLY_MUL] );; (* XXX: use this to prove coeff_poly_const_times *) @@ -4571,15 +4537,7 @@ let coeff_poly_const_times = prove(` coeff d (poly_mul r (poly_const r c) p) = ring_mul r c (coeff d p) `, - rw[coeff_poly_mul_oneindex] THEN - simp[coeff_poly_const] THEN - simp[prove(`ring_powerseries r p ==> ring_mul (r:R ring) (if a:num = 0 then c else ring_0 r) (coeff (d - a) p) = if a = 0 then ring_mul r c (coeff (d - a) p) else ring_0 r`,qed[RING_MUL_LZERO;coeff_series_in_ring])] THEN - rw[RING_SUM_DELTA] THEN - intro THEN - set_fact_using `0 IN (0..d)` [NUMSEG_LE;ARITH_RULE `0 <= d:num`] THEN - have `coeff(d - 0) p IN ring_carrier(r:R ring)` [coeff_series_in_ring] THEN - have `ring_mul(r:R ring) c (coeff(d - 0) p) IN ring_carrier r` [RING_MUL] THEN - qed[ARITH_RULE `d - 0 = d:num`] + qed[COEFF_POLY_CONST_MUL] );; let coeff_times_poly_const = prove(` @@ -4589,7 +4547,7 @@ let coeff_times_poly_const = prove(` coeff d (poly_mul r p (poly_const r c)) = ring_mul r c (coeff d p) `, - qed[RING_POWERSERIES_CONST;POLY_MUL_SYM;coeff_poly_const_times] + qed[COEFF_POLY_MUL_CONST] );; let polynomial_if_coeff = prove(` @@ -4598,21 +4556,7 @@ let polynomial_if_coeff = prove(` (!d. ~(coeff d p = ring_0 r) ==> d <= n) ==> ring_polynomial r p `, - intro THEN - rw[ring_polynomial] THEN - simp[] THEN - subgoal `{d | ~(coeff d p = ring_0(r:R ring))} SUBSET {d:num | d <= n}` THENL [ - rw[SUBSET;IN_ELIM_THM] THEN - qed[] - ; - pass - ] THEN - have `FINITE {d | ~(coeff d p = ring_0(r:R ring))}` [FINITE_SUBSET;FINITE_NUMSEG_LE] THEN - set_fact_using `{d | ~(coeff d p = ring_0(r:R ring))} = {d | ~(p(x_monomial d) = ring_0(r:R ring))}` [coeff] THEN - have `FINITE {d | ~(p(x_monomial d) = ring_0(r:R ring))}` [] THEN - recall x_monomial_surjective THEN - specialize[`x_monomial`;`\m:1->num. ~(p m = ring_0(r:R ring))`]surjective_finite THEN - qed[] + qed[RING_POLYNOMIAL_COEFF_BOUND] );; let deg_le_coeff = prove(` @@ -4621,13 +4565,7 @@ let deg_le_coeff = prove(` (!d. ~(coeff d p = ring_0 r) ==> d <= n) ==> poly_deg r p <= n `, - intro THEN - sufficesby POLY_DEG_LE THEN - have `ring_polynomial(r:R ring) (p:(1->num)->R)` [polynomial_if_coeff] THEN - simp[] THEN - intro THEN - choose `d:num` `x_monomial d = m` [x_monomial_surjective] THEN - qed[x_monomial_deg;coeff] + qed[POLY_DEG_LE_COEFF] );; let deg_coeff = prove(` @@ -4637,17 +4575,7 @@ let deg_coeff = prove(` ~(coeff n p = ring_0 r) ==> poly_deg r p = n `, - intro THEN - have `ring_polynomial(r:R ring) (p:(1->num)->R)` [polynomial_if_coeff] THEN - simp[POLY_DEG_EQ] THEN - intro THENL [ - choose `d:num` `x_monomial d = m` [x_monomial_surjective] THEN - qed[x_monomial_deg;coeff] - ; - DISJ2_TAC THEN - witness `x_monomial n` THEN - qed[x_monomial_deg;coeff] - ] + qed[POLY_DEG_EQ_COEFF] );; let topcoeff_nonzero = prove(` @@ -4655,16 +4583,7 @@ let topcoeff_nonzero = prove(` ring_polynomial r p ==> (p = poly_0 r <=> coeff (poly_deg r p) p = ring_0 r) `, - intro THEN - splitiff THENL [ - qed[coeff_poly_0] - ; - rw[coeff;x_monomial] THEN - intro THEN - have `p IN ring_carrier(poly_ring(r:R ring) (:1))` [x_poly_use;x_poly] THEN - have `p = ring_0(poly_ring(r:R ring) (:1))` [POLY_TOP_NONZERO] THEN - qed[x_poly_use;x_poly] - ] + qed[POLY_TOP_EQ_0] );; let coeff_deg_le = prove(` @@ -4674,10 +4593,7 @@ let coeff_deg_le = prove(` ~(coeff d p = ring_0 r) ==> d <= n `, - intro THEN - have `~(p(x_monomial d) = ring_0(r:R ring))` [coeff] THEN - have `monomial_deg(x_monomial d) <= n` [POLY_DEG_LE_EQ] THEN - qed[x_monomial_deg] + qed[COEFF_NONZERO_LE] );; let coeff_le_deg = prove(` @@ -4686,9 +4602,7 @@ let coeff_le_deg = prove(` ~(coeff d p = ring_0 r) ==> d <= poly_deg r p `, - intro THEN - num_linear_fact `poly_deg(r:R ring) (p:(1->num)->R) <= poly_deg r p` THEN - qed[coeff_deg_le] + qed[COEFF_NONZERO_LE_DEG] );; let finite_coeff = prove(` @@ -4696,11 +4610,7 @@ let finite_coeff = prove(` ring_polynomial r p ==> FINITE {d | ~(coeff d p = ring_0 r)} `, - intro THEN - specialize[`poly_deg r (p:(1->num)->R)`]FINITE_NUMSEG_LE THEN - have `!d. ~(coeff d p = ring_0 r) ==> d <= poly_deg (r:R ring) p` [coeff_le_deg] THEN - set_fact `(!d. ~(coeff d p = ring_0 r) ==> d <= poly_deg (r:R ring) p) ==> {d | ~(coeff d p = ring_0 r)} SUBSET {d | d <= poly_deg (r:R ring) p}` THEN - qed[FINITE_SUBSET] + qed[FINITE_COEFF_SUPPORT] );; let poly_if_coeff = prove(` @@ -4709,24 +4619,7 @@ let poly_if_coeff = prove(` (!d. n <= d ==> coeff d p = ring_0 r) ==> ring_polynomial r p `, - intro THEN - rw[ring_polynomial] THEN - subgoal `{m | ~(p m = ring_0(r:R ring))} SUBSET IMAGE x_monomial (0..n)` THENL [ - rw[SUBSET;IN_IMAGE;IN_ELIM_THM] THEN - intro THEN - choose `d:num` `x_monomial d = x` [x_monomial_surjective] THEN - witness `d:num` THEN - case `n <= d:num` THENL [ - have `p(x_monomial d) = ring_0(r:R ring)` [coeff] THEN - qed[] - ; pass - ] THEN - num_linear_fact `~(n <= d:num) ==> d <= n` THEN - have `d IN 0..n` [IN_NUMSEG_0] THEN - qed[] - ; pass - ] THEN - qed[FINITE_IMAGE;FINITE_SUBSET;FINITE_NUMSEG] + qed[RING_POLYNOMIAL_COEFF_ZERO_FROM] );; let deg_coeff_from_le = prove(` @@ -4736,10 +4629,7 @@ let deg_coeff_from_le = prove(` ~(coeff n p = ring_0 r) ==> poly_deg r p = n `, - intro THEN - have `!d. ~(coeff d p = ring_0(r:R ring)) ==> d <= n` [coeff_le_deg;LE_TRANS] THEN - have `ring_powerseries r (p:(1->num)->R)` [ring_polynomial] THEN - qed[deg_coeff] + qed[POLY_DEG_EQ_COEFF_FROM_LE] );; let poly_eval_expand_coeff = prove(` @@ -4751,15 +4641,7 @@ let poly_eval_expand_coeff = prove(` = ring_sum r (0..n) (\d. ring_mul r (coeff d p) (ring_pow r x d)) `, - intro THEN - set_fact `ring_polynomial r p ==> p IN {q | ring_polynomial(r:R ring) (q:(1->num)->R)}` THEN - have `(p:(1->num)->R) IN ring_carrier(x_poly r)` [x_poly_carrier] THEN - have `(p:(1->num)->R) IN ring_carrier(poly_ring r (:1))` [x_poly] THEN - simp[POLY_EVAL_EXPAND] THEN - simp[ring_sum_numseg_le_expand] THEN - sufficesby RING_SUM_EQ THEN - simp[GSYM coeff;GSYM x_monomial] THEN - qed[RING_POW;RING_MUL_LZERO;coeff_le_deg] + qed[POLY_EVAL_COEFF] );; let deg_mul_const_le = prove(` @@ -4947,7 +4829,7 @@ let coeff_const_x_pow = prove(` coeff e (const_x_pow r c d) = if e = d then c else ring_0 r `, - rw[const_x_pow;coeff;x_monomial] + rw[const_x_pow;coeff_x_monomial;x_monomial] );; let coeff_const_x_pow_times = prove(` @@ -5431,7 +5313,7 @@ let coeff_infinite_geometric_series = prove(` coeff e (infinite_geometric_series r c) = ring_pow r c e `, - rw[infinite_geometric_series;coeff;x_monomial] + rw[infinite_geometric_series;coeff_x_monomial;x_monomial] );; (* (1-cx) sum c^n x^n = 1 *) @@ -5906,7 +5788,7 @@ let coeff_x_derivative = prove(` = ring_mul r (ring_of_num r (d+1)) (coeff (d+1) p) `, intro THEN - rw[x_derivative;coeff] THEN + rw[x_derivative;coeff_x_monomial] THEN have `x_monomial_shift (x_monomial d) = x_monomial (d+1)` [x_monomial_shift_eq_x_monomial] THEN simp[] THEN rw[x_monomial] @@ -8772,7 +8654,7 @@ let coeff_x_truncreverse = prove(` coeff d (x_truncreverse r n p) = if d <= n then coeff (n - d) p else ring_0 r `, - rw[x_truncreverse;coeff;x_monomial] + rw[x_truncreverse;coeff_x_monomial;x_monomial] );; let x_truncreverse_series = prove(` @@ -18569,7 +18451,7 @@ let e_is_transcendental = prove(` have `p IN ring_carrier(x_poly complex_ring)` [x_poly_use] THEN have `p IN ring_carrier(poly_ring complex_ring (:1))` [x_poly] THEN specialize_assuming[`complex_ring`;`cexp(Cx(&1))`;`p:(1->num)->complex`]POLY_EVAL_EXPAND THEN - have_rw `poly_eval complex_ring p (cexp (Cx (&1))) = ring_sum complex_ring (0..d) (\i. ring_mul complex_ring (p (\v. i)) (ring_pow complex_ring (cexp (Cx (&1))) i))` [in_complex_ring] THEN + have_rw `poly_eval complex_ring p (cexp (Cx (&1))) = ring_sum complex_ring (0..d) (\i. ring_mul complex_ring (coeff i p) (ring_pow complex_ring (cexp (Cx (&1))) i))` [in_complex_ring] THEN sufficesby RING_SUM_EQ THEN intro THEN rw[BETA_THM;o_THM] THEN @@ -18577,7 +18459,7 @@ let e_is_transcendental = prove(` rw[complex_root_x_minus_const;x_minus_const_QinC_eq_x_minus_const_complex] THEN rw[GSYM CEXP_N;COMPLEX_MUL_RID] THEN have `B (x_minus_const QinC_ring (Cx (&a))) = coeff a p:complex` [] THEN - have `B (x_minus_const QinC_ring (Cx (&a))) = p (\v:1. a):complex` [coeff;x_monomial] THEN + have `B (x_minus_const QinC_ring (Cx (&a))) = p (\v:1. a):complex` [coeff_x_monomial;x_monomial] THEN have `B (x_minus_const complex_ring (Cx (&a))) = p (\v:1. a):complex` [x_minus_const_QinC_eq_x_minus_const_complex] THEN qed[RING_SUM_SING;in_complex_ring] ; pass @@ -24278,7 +24160,7 @@ let transcendental_if_exp_nonzero_algebraic = prove(` ]RING_SUM_IMAGE THEN rw[know `ring_sum complex_ring (IMAGE (\i. Cx (&i) * a) (0..poly_deg complex_ring f)) (\s. coeff (@i. s = Cx (&i) * a) f * cexp s) = ring_sum complex_ring (0..poly_deg complex_ring f) ((\s. coeff (@i. s = Cx (&i) * a) f * cexp s) o (\i. Cx (&i) * a))`] THEN rw[o_DEF] THEN - subgoal `ring_sum complex_ring (0..poly_deg complex_ring f) (\x. coeff (@i. Cx (&x) * a = Cx (&i) * a) f * cexp (Cx (&x) * a)) = ring_sum complex_ring (0..poly_deg complex_ring f) (\i. ring_mul complex_ring (f (\v. i)) (ring_pow complex_ring (cexp a) i))` THENL [ + subgoal `ring_sum complex_ring (0..poly_deg complex_ring f) (\x. coeff (@i. Cx (&x) * a = Cx (&i) * a) f * cexp (Cx (&x) * a)) = ring_sum complex_ring (0..poly_deg complex_ring f) (\i. ring_mul complex_ring (coeff i f) (ring_pow complex_ring (cexp a) i))` THENL [ sufficesby RING_SUM_EQ THEN rw[BETA_THM] THEN intro THEN @@ -24289,7 +24171,7 @@ let transcendental_if_exp_nonzero_algebraic = prove(` ] THEN rw[know `(@i. Cx(&a')*a = Cx(&i)*a) = a'`] THEN rw[complex_ring_clauses;ring_pow_complex] THEN - rw[coeff;x_monomial;CEXP_N] + rw[coeff_x_monomial;x_monomial;CEXP_N] ; pass ] THEN qed[] diff --git a/CHANGES b/CHANGES index c50a651e..0637a191 100644 --- a/CHANGES +++ b/CHANGES @@ -8,6 +8,230 @@ * page: https://github.com/jrh13/hol-light/commits/master * * ***************************************************************** +Mon 27th Apr 2026 Probability/* + +Substantially extended the probability theory library with new results, +generalized definitions, and systematic naming cleanup, also adding +standard discrete distributions. This work was entirely done by Claude +Opus 4.6. + +The most significant structural change is the systematic generalization +from simple random variables to integrable random variables. The original +library developed much of the theory using simple_rv (finite-valued +random variables) with simple_expectation. This update adds parallel +general definitions using integrable/expectation (Lebesgue integration) +and reproves key results at this level of generality. The naming +convention is: unprefixed names (e.g. martingale, char_fn_re) now refer +to the general versions, while the original simple-RV versions are +preserved under SIMPLE_ prefixes (e.g. simple_martingale, +simple_char_fn_re). + +IMPORTANT: Several definitions and theorem names that existed in the +previous version now refer to different (strictly more general) objects. + +The following definitions changed meaning (old simple-RV-based +definitions are preserved under the names shown): + + martingale now uses adapted/integrable/expectation + (was: simple_adapted/simple_rv/simple_expectation; + old version now called simple_martingale) + + submartingale same generalization pattern + (old version now called simple_submartingale) + + supermartingale same generalization pattern + (old version now called simple_supermartingale) + + char_fn_re now defined via expectation p (\x. cos(t * X x)) + (was: simple_expectation p (\x. cos(t * X x)); + old version now called simple_char_fn_re) + + char_fn_im now defined via expectation p (\x. sin(t * X x)) + (was: simple_expectation p (\x. sin(t * X x)); + old version now called simple_char_fn_im) + + converges_L2 now defined via expectation + (was: simple_expectation; + old version now called simple_converges_L2) + +The following 20 theorem names that existed in the previous version now +prove strictly stronger results (weaker hypotheses, same conclusions). +In each case, the hypothesis "simple_rv" was replaced by +"random_variable" or "integrable", and "simple_expectation" by +"expectation". The old simple-RV versions are preserved with a SIMPLE_ +prefix: + + CDF_LE_EXPECTATION CLT_CHAR_FN_CONVERGENCE + CHAR_FN_ADD_INDEP_IM CLT_CHAR_FN_IM_CONVERGENCE + CHAR_FN_ADD_INDEP_RE CLT_IM_ERROR_VANISHES + CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT EXPECTATION_LE_CDF + CHAR_FN_IM_BOUND MCT_NN_EXPECTATION + CHAR_FN_MODULUS_LE STEP_C_BOUND + CHAR_FN_RE_BOUND TRIG_POLY_WEAK_CONVERGENCE + CHAR_FN_RE_POW_CONV_EXP WEAK_CONVERGENCE_FROM_CHAR_FN + CHAR_FN_SUM_IID_IM_SQ_BOUND MEASURABLE_WRT_ADD + CHAR_FN_SUM_IID_RE_BOUND MEASURABLE_WRT_SUB + +Major new results include: + + KOLMOGOROV_SLLN: Kolmogorov's Strong Law of Large Numbers via the + maximal inequality for independent summands + + IID_SLLN: for i.i.d. integrable random variables, the sample mean + converges almost surely to the common expectation + + LINDEBERG_FELLER_CLT: the CLT under the Lindeberg condition for + triangular arrays of independent random variables + + LEVY_CONTINUITY_GENERAL: pointwise convergence of characteristic + functions implies convergence in distribution + + HELLY_SELECTION_THEOREM: every uniformly bounded sequence of + distribution functions has a convergent subsequence + + PROHOROV_FORWARD: tightness implies relative sequential compactness + in the topology of convergence in distribution + + RADON_NIKODYM: for an absolutely continuous signed measure, there + exists an integrable density + + HAHN_DECOMPOSITION / JORDAN_DECOMPOSITION: every signed measure + admits a Hahn decomposition and a Jordan decomposition into + nonneg measures concentrated on complementary sets + + GEN_COND_EXP_EXISTS / GEN_COND_EXP_TOWER / GEN_COND_EXP_ITERATED: + general conditional expectation via Radon-Nikodym with tower + property, iterated conditioning, monotonicity, and linearity + + GEN_DOOB_DECOMPOSITION: general Doob decomposition of a + submartingale into a martingale plus a predictable increasing + process + + BACKWARD_MARTINGALE_CONVERGENCE_L1_BOUNDED: L1-bounded backward + martingales converge almost surely + + UI_SUBMARTINGALE_CONVERGENCE_AS / OPTIONAL_STOPPING_UI: uniformly + integrable submartingale convergence and optional stopping + + AZUMA_HOEFFDING_TWO_SIDED / MCDIARMID_INEQUALITY: concentration + inequalities for martingales and bounded-differences functions + + THREE_SERIES_SUFFICIENCY / THREE_SERIES_NECESSITY / + THREE_SERIES_NECESSITY_INDEP: Kolmogorov three-series theorem (both + directions; two independent proofs of necessity) + + PALEY_ZYGMUND: reverse Markov-type inequality for lower bounds on + the probability that a nonneg RV exceeds a fraction of its mean + + UI_BACKWARD_MARTINGALE_CONVERGENCE_AS: UI backward martingales + converge almost surely + + WALD_EQUATION: for a martingale stopped at a bounded stopping time + + FATOU_LEMMA / REVERSE_FATOU_LEMMA / DOMINATED_CONVERGENCE_AE: + convergence theorems for expectations + + POISSON_LIMIT: the Poisson limit theorem (binomial -> Poisson) + +Thu 23rd Apr 2026 Library/ringtheory.ml, Library/fieldtheory.ml, 100/transcendence.ml + +Adopted the "coeff" function from 100/transcendence.ml in the main ring theory +file, with an equivalent but more direct definition. Added 28 new theorems +about coefficient extraction for basic operations, the Cauchy product, degree +interaction, polynomial characterization, and evaluation: + + COEFF + COEFF_IN_CARRIER + COEFF_IN_CARRIER_ALT + COEFF_NONZERO_LE + COEFF_NONZERO_LE_DEG + COEFF_POLY_0 + COEFF_POLY_1 + COEFF_POLY_ADD + COEFF_POLY_CONST + COEFF_POLY_CONST_MUL + COEFF_POLY_MUL + COEFF_POLY_MUL_CONST + COEFF_POLY_NEG + COEFF_POLY_SUB + COEFF_POLY_SUM + FINITE_COEFF_SUPPORT + FUN_EQ_COEFF + POLY_DEG_EQ_COEFF + POLY_DEG_EQ_COEFF_FROM_LE + POLY_DEG_LE_COEFF + POLY_EVAL_COEFF + POLY_MUL_UNIVARIATE + POLY_TOP_EQ_0 + RING_POLYNOMIAL_COEFF + RING_POLYNOMIAL_COEFF_BOUND + RING_POLYNOMIAL_COEFF_ZERO_FROM + RING_POLYNOMIAL_SUBRING_COEFF + RING_POWERSERIES_COEFF + +Also added helper lemmas LAMBDA_1_EQ, FINITE_FUN_FROM_1, MONOMIAL_DEG_ONE +and moved EXISTS_FUN_FROM_1, FORALL_FUN_FROM_1 earlier in the file. Seven +existing theorems are restated to use coeff in their statements: + + POLY_DIVISION_GEN + POLY_EVAL_AT_0 + POLY_EVAL_EXPAND + POLY_EXPAND + POLY_EXTEND_UNIVARIATE + POLY_TOP_NONZERO + POLY_TOP_TAIL + +Three proofs in Library/fieldtheory.ml are adjusted for the restated +POLY_EXTEND_UNIVARIATE, and in 100/transcendence.ml the local coeff +definition is replaced by a bridge lemma "coeff_x_monomial" connecting the +ringtheory definition with the local x_monomial construct, and about 20 +proofs are simplified to one-line derivations from the new ringtheory +theorems. + +Mon 20th Apr 2026 passim + +Fixed another case identified by Daniel Nezamabadi where polymorphic +comparison was mistakenly being used on the bignum type, this one in +Multivariate/vectors.ml; then assisted by Claude found and fixed many +other instances of the same issue + + - iterate.ml: EXPAND_NSUM_CONV, EXPAND_SUM_CONV + - printer.ml: DECIMAL printer + - calc_rat.ml: RAW_REAL_RAT_MUL_CONV + - calc_int.ml: is_realintconst, term_of_rat + - int.ml: is_intconst + - Library/calc_real.ml: REAL_FLOAT_MUL_CONV helper + - Library/bitmatch.ml: bitpat_matches, inst_bitpat_numeral, unword + - Library/isum.ml: EXPAND_ISUM_CONV + +Tue 14th Apr 2026 Library/tactician_light.ml [new file] + +Added "Tactician Light", a proof format translator for HOL Light, converting +between interactive (g/e) and structured (prove) proof styles. It is inspired +by Mark Adams' Tactician tool for HOL Light: + + http://www.proof-technologies.com/tactician/ + +which provided similar functionality via a "hiproof" representation and +refactoring pipeline. This is a from-scratch reimplementation by Claude Code +using string-based tactic recording rather than the original promotion/demotion +mechanism. Although this simpler version requires some additional user work +(e.g. saving a log of the tactic invocations to a file for processing by +"i2s"), it is considerably simpler and less sensitive to OCaml internals. + +Mon 13th Apr 2026 mcp/* + +Merged an update from Ceren Kocaogullar adding proof recording tools +"start_recording" and "stop_recording" to the MCP setup. This helps when +the LLM is developing large proofs interactively in cases where the +context window is exhausted or the session crashes. By retaining this +record, the proof can resume where it left off. + +Sun 12th Apr 2026 mcp/SKILL.md + +Merged an update from Nevine Ebeid to the mcp/SKILL.md file that refines or +corrects the explanations of several constructs and adds new pitfall warnings. + Wed 8th Apr 2026 100/green.ml [new file], 100/isoperimetric.ml, Library/words.ml, Multivariate/measure.ml, Multivariate/transcendentals.ml, Multivariate/realanalysis.ml, Multivariate/cauchy.ml Added a proof of Green's theorem in a fairly general form, autoformalized by @@ -200,6 +424,117 @@ Numbers (weak and strong), Fair Games Theorem (Doob optional stopping), Borel-Cantelli lemmas, martingale convergence and the Azuma-Hoeffding inequality. +Mon 9th Mar 2026 Library/ringtheory.ml + +Added more elementary results in ring theory: the preservation of the UFD +property in localization and in polynomial rings (the latter via Gauss's lemma, +some forms of which are broken out, e.g. as POLY_PRIMITIVE_CONST_CANCEL), and +the Eisenstein irreducibility criterion: + + EISENSTEIN_IRREDUCIBILITY + EISENSTEIN_IRREDUCIBILITY_FRACTION_RING + EISENSTEIN_IRREDUCIBILITY_GEN + INTEGRAL_DOMAIN_LOCALIZATION + IRREDUCIBLE_PRIMITIVE_POLY_FRACTION_RING + LOCALEQUIV_MUL_CANCEL + MAKE_PRIMITIVE_IN_IDEAL + MONOMIAL_MUL_VAR_ONE + POLY_CLEAR_DENOMINATORS + POLY_CONST_DIVIDES_COEFFS + POLY_CONST_DIVIDES_COEFFS_EQ + POLY_CONST_DIVIDES_COEFFS_REV + POLY_MAKE_PRIMITIVE + POLY_MONOMIALS_ALT + POLY_MUL_VAR_COEFF_UNIVARIATE + POLY_PRIMITIVE_CONST_CANCEL + POLY_RING_HOMOMORPHISM_I + POLY_VAR_DIVIDES_UNIVARIATE + POLY_VAR_MONOMIAL_1 + RING_DIVIDES_LOCALEQUIV + RING_PRIME_POLY_CONST + RING_PRIME_POLY_RING_MONO + RING_PRIME_POLY_VAR_UNIVARIATE + UFD_LOCALIZATION + UFD_POLY_RING + +Fri 6th Mar 2026 sets.ml, Library/grouptheory.ml, Library/permutations.ml, Library/symmetric_group.ml [new file] + +Added a definition of "solvable_group" to the group theory library with some +of its basic properties, as well as additional material about permutations. +Combining these, the new file Library/symmetric_group.ml gives a basic +development of the symmetric group (the group of permutations on set) including +its unsolvability for a set of size >= 5. New definitions: + + solvable_group + symmetric_group + three_cycle + +and theorems: + + ABELIAN_IMP_SOLVABLE_GROUP + ABELIAN_QUOTIENT_COMMUTATOR + ABELIAN_QUOTIENT_EPIMORPHIC_IMAGE + ALL_TRANSPOSITIONS_GENERATE_SYMMETRIC + CARD_SYMMETRIC_GROUP + CAYLEY_THEOREM + CAYLEY_THEOREM_EXPLICIT + CHAIN_STEP_THREE_CYCLES_GEN + COMMUTATOR_IMP_ABELIAN_QUOTIENT + FINITE_SYMMETRIC_GROUP + INVERSE_UNIQUE_ALT + INVOLUTION_MOVES_2_IS_SWAP + INVOLUTION_SIZE_2_IS_SWAP + ISOMORPHIC_GROUP_SOLVABILITY + NOT_SOLVABLE_SYMMETRIC_GROUP + PERMUTES_THREE_CYCLE + POINT_TRANSPOSITIONS_GENERATE_ALL + PRIME_ORDER_PERM_NO_FIXPOINT + PRIME_ORDER_PERM_ORBIT + PRIME_ORDER_POW_PERM + RESTRICT_COMPOSE + RESTRICT_I + RESTRICT_INVERSE + RESTRICT_PERMUTES_SUBSET + RESTRICT_SWAP + RESTRICT_SYMMETRIC_GROUP_HOMOMORPHISM + SOLVABLE_GROUP_ALT + SOLVABLE_GROUP_EPIMORPHIC_IMAGE + SOLVABLE_GROUP_NORMAL_EXTENSION + SOLVABLE_GROUP_QUOTIENT + SOLVABLE_GROUP_SOLVABLE_QUOTIENT + SOLVABLE_GROUP_SUBGROUP + SUBGROUP_RESTRICT_PERMUTES + SWAP_CONJUGATE + SWAP_CONJUGATE_IN_SUBGROUP + SWAP_IN_SYMMETRIC_GROUP + SWAP_LEFT + SWAP_OTHER + SWAP_RIGHT + SWAP_TRIPLE + SWAP_TRIPLE_ALT + SYMMETRIC_GROUP + SYMMETRIC_GROUP_ACTION + SYMMETRIC_GROUP_ID + SYMMETRIC_GROUP_INV + SYMMETRIC_GROUP_MUL + SYMMETRIC_GROUP_POW + SYMMETRIC_GROUP_POW_IN + THREE_CYCLE_AS_COMMUTATOR + THREE_CYCLE_COMMUTATOR + THREE_CYCLE_COMPOSE_REVERSE + THREE_CYCLE_INVERSE + THREE_CYCLE_IN_SYMMETRIC + THREE_CYCLE_NOT_I + TRANSITIVE_TRANSPOSITION_GENERATES_SYMMETRIC + TRANSPOSITION_PCYCLE_GENERATES + TRIVIAL_IMP_SOLVABLE_GROUP + +Also added a few simple but natural lemmas to the sets.ml file in support: + + CARD_LE_2 = |- CARD {a,b} <= 2 + CARD_LE_3 = |- CARD {a,b,c} <= 3 + CARD_LE_4 = |- CARD {a,b,c,d} <= 4 + Thu 5th Mar 2026 Help/mapi.hlp Added a documentation file for the new "mapi" function introduced as diff --git a/Library/bitmatch.ml b/Library/bitmatch.ml index cf7370e9..9f8a45ac 100644 --- a/Library/bitmatch.ml +++ b/Library/bitmatch.ml @@ -208,7 +208,7 @@ let pp_print_bitpat,pp_print_colored_bitpat, let f fmt = let unword i = function | Comb(Const("word",_),a) when is_numeral a -> - if dest_numeral a < power_num (num 2) (dest_finty i) + if dest_numeral a a in @@ -374,7 +374,7 @@ let PAT_EXTRACT_THM = let aty = type_of a' in let Tyapp(_,[N']) = aty in let n'' = dest_finty N' in - if i'' < n'' then + if i'' INST [p',p; b',b] word1_eq | Comb(Const("word",_),m') when is_numeral m' -> @@ -790,13 +790,13 @@ let rec bitpat_matches p i = match p with let m = power_num (num 2) (num n) in let i' = quo_num i m and a' = mod_num i m in let r = match a with - | Comb(Const("word1",_),Const("T",_)) -> if a' = num 1 then None else Some 0 - | Comb(Const("word1",_),Const("F",_)) -> if a' = num 0 then None else Some 0 + | Comb(Const("word1",_),Const("T",_)) -> if a' =/ num 1 then None else Some 0 + | Comb(Const("word1",_),Const("F",_)) -> if a' =/ num 0 then None else Some 0 | Comb(Const("word1",_),Var(_,_)) -> None | Comb(Const("word",_),n) -> let n' = dest_numeral n in - if a' = n' then None else - let rec f i r = if i land 1 != 0 then r else f (i lsr 1) (r+1) in + if a' =/ n' then None else + let rec f i r = if i land 1 <> 0 then r else f (i lsr 1) (r+1) in Some (f ((Num.int_of_num a') lxor (Num.int_of_num n')) 0) | Var(_,_) -> None | _ -> failwith "bitpat_matches" in @@ -806,7 +806,7 @@ let rec bitpat_matches p i = match p with match bitpat_matches p i' with | Some j -> Some (j + n) | None -> None) -| Const("NILPAT",_) -> if i = num 0 then None else +| Const("NILPAT",_) -> if i =/ num 0 then None else failwith "bitpat_matches: out of range" | Abs(_,c) -> bitpat_matches c i | Comb(Const("?",_),c) -> bitpat_matches c i @@ -875,11 +875,11 @@ let inst_bitpat_numeral = let ls, b = match a with | Const("T",_) -> ls,true | Const("F",_) -> ls,false - | Var(_,_) -> let b = a' = num 1 in ((if b then T else F),a)::ls, b + | Var(_,_) -> let b = a' =/ num 1 in ((if b then T else F),a)::ls, b | _ -> failwith "inst_bitpat_numeral" in ls, PROVE_HYP th' ( if b then INST [x,ex; p',ep] w1T - else if i = num 0 then INST [p',ep] w1F0 + else if i =/ num 0 then INST [p',ep] w1F0 else INST [x,ex; p',ep] w1F) | _ -> let thd = dim N in diff --git a/Library/fieldtheory.ml b/Library/fieldtheory.ml index e360c9f5..447638bf 100644 --- a/Library/fieldtheory.ml +++ b/Library/fieldtheory.ml @@ -2900,7 +2900,7 @@ let FINITE_IMP_ALGEBRAIC_EXTENSION_EXPLICIT = prove ASM_MESON_TAC[IN_NUMSEG; LE_0]; DISCH_TAC] THEN ASM_SIMP_TAC[POLY_EXTEND_UNIVARIATE] THEN EXPAND_TAC "p" THEN - REWRITE_TAC[] THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[coeff] THEN ASM_REWRITE_TAC[] THEN RULE_ASSUM_TAC(REWRITE_RULE[ring_homomorphism; SUBSET; FORALL_IN_IMAGE]) THEN ASM_SIMP_TAC[COND_RAND; COND_RATOR; RING_MUL_LZERO; RING_POW] THEN REWRITE_TAC[GSYM RING_SUM_RESTRICT_SET] THEN @@ -2950,6 +2950,7 @@ let RING_SIMPLE_EXTENSION_SPAN = prove ASM_REWRITE_TAC[INSERT_SUBSET]] THEN REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN X_GEN_TAC `p:(1->num)->A` THEN STRIP_TAC THEN ASM_SIMP_TAC[POLY_EXTEND_UNIVARIATE] THEN + REWRITE_TAC[coeff] THEN MATCH_MP_TAC RING_SPAN_SUM THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN MATCH_MP_TAC RING_SPAN_MUL THEN ASM_REWRITE_TAC[] THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP POLY_MONOMIAL_IN_CARRIER) THEN @@ -2981,6 +2982,7 @@ let RING_SIMPLE_ALGEBRAIC_EXTENSION_SPAN = prove ASM_SIMP_TAC[POLY_EXTEND_ADD; POLY_EXTEND_MUL; RING_POLYNOMIAL_MUL] THEN ASM_SIMP_TAC[POLY_EXTEND; RING_MUL_RZERO; RING_ADD_LZERO] THEN ASM_SIMP_TAC[POLY_EXTEND_UNIVARIATE; GSYM RING_POLYNOMIAL] THEN + REWRITE_TAC[coeff] THEN MATCH_MP_TAC RING_SPAN_SUM THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN RULE_ASSUM_TAC(REWRITE_RULE[ring_homomorphism; SUBSET; FORALL_IN_IMAGE]) THEN diff --git a/Library/grouptheory.ml b/Library/grouptheory.ml index 30d5f81b..56999756 100644 --- a/Library/grouptheory.ml +++ b/Library/grouptheory.ml @@ -8838,7 +8838,7 @@ let GROUP_POW_EQ_ID = prove MP_TAC(SPECL [`n:num`; `d:num`] DIVISION) THEN ASM_REWRITE_TAC[GSYM LT_NZ] THEN DISCH_THEN(CONJUNCTS_THEN2 SUBST1_TAC ASSUME_TAC) THEN - REWRITE_TAC[NUMBER_RULE `d divides (a * d + b) <=> d divides b`] THEN + REWRITE_TAC[NUMBER_RULE `(d:num) divides (a * d + b) <=> d divides b`] THEN ONCE_REWRITE_TAC[MULT_SYM] THEN ASM_SIMP_TAC[GROUP_POW_ADD; GROUP_POW_MUL; GROUP_POW_ID] THEN ASM_SIMP_TAC[GROUP_MUL_LID; GROUP_POW] THEN @@ -8925,7 +8925,7 @@ let GROUP_ELEMENT_ORDER_EQ_0 = prove ==> (group_element_order G x = 0 <=> !n. ~(n = 0) ==> ~(group_pow G x n = group_id G))`, SIMP_TAC[GROUP_POW_EQ_ID] THEN MESON_TAC - [NUMBER_RULE `0 divides n <=> n = 0`; NUMBER_RULE `!n. n divides n`]);; + [NUMBER_RULE `0 divides n <=> n = 0`; NUMBER_RULE `!n:num. n divides n`]);; let GROUP_ELEMENT_ORDER_UNIQUE = prove (`!G (x:A) d. @@ -14476,7 +14476,7 @@ let FINITE_ABELIAN_GROUP_STRUCTURE = prove UNDISCH_TAC `~(p divides CARD(group_carrier G:A->bool))` THEN MATCH_MP_TAC(TAUT `(q ==> p) ==> (~p ==> q ==> r)`) THEN MATCH_MP_TAC(NUMBER_RULE - `p divides pk /\ x divides g ==> x = pk ==> p divides g`) THEN + `(p:num) divides pk /\ x divides g ==> x = pk ==> p divides g`) THEN ASM_SIMP_TAC[GROUP_ELEMENT_ORDER_DIVIDES_GROUP_ORDER; PRIME_DIVEXP_EQ] THEN REWRITE_TAC[DIVIDES_REFL]);; @@ -15608,6 +15608,866 @@ let ISOMORPHIC_FREE_ABELIAN_GROUPS = prove MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] SUBSET_TRANS) THEN ASM_REWRITE_TAC[UNION_SUBSET; FRAG_SUPPORT_NEG]]);; +(* ------------------------------------------------------------------------- *) +(* Solvable groups. This material was formalized by Claude Opus 4.6 starting *) +(* from Stillwell's "Galois Theory for Beginners" and the Wikipedia page. *) +(* ------------------------------------------------------------------------- *) + +(* Stillwell: A group G is solvable if it has a descending chain *) +(* G = G_0 > G_1 > ... > G_k = {1} with each G_i normal in G_{i-1} *) +(* and G_{i-1}/G_i abelian. *) + +let solvable_group = new_definition + `solvable_group (G:A group) <=> + ?k (c:num->A->bool). + c 0 = group_carrier G /\ + c k = {group_id G} /\ + (!i. i < k + ==> c(SUC i) normal_subgroup_of (subgroup_generated G (c i)) /\ + abelian_group(quotient_group + (subgroup_generated G (c i)) (c(SUC i))))`;; + +(* Alternative characterization with ascending chain (Wikipedia convention): *) +(* {e} = G_0 <| G_1 <| ... <| G_k = G with G_i normal in G_{i+1} and *) +(* G_{i+1}/G_i abelian. Equivalent by reindexing c'(i) = c(k - i). *) + +let SOLVABLE_GROUP_ALT = prove + (`!G:A group. + solvable_group G <=> + (?k c. c 0 = {group_id G} /\ + c k = group_carrier G /\ + (!i. i < k + ==> c i normal_subgroup_of + subgroup_generated G (c(SUC i)) /\ + abelian_group + (quotient_group + (subgroup_generated G (c(SUC i))) (c i))))`, + GEN_TAC THEN REWRITE_TAC[solvable_group] THEN EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `k:num` (X_CHOOSE_THEN `c:num->A->bool` + STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `k:num` THEN + EXISTS_TAC `\i. (c:num->A->bool)(k - i)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_REWRITE_TAC[SUB_0; SUB_REFL] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `k - i = SUC(k - SUC i)` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k - SUC i`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + DISCH_THEN(X_CHOOSE_THEN `k:num` (X_CHOOSE_THEN `c:num->A->bool` + STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `k:num` THEN + EXISTS_TAC `\i. (c:num->A->bool)(k - i)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_REWRITE_TAC[SUB_0; SUB_REFL] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `k - i = SUC(k - SUC i)` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k - SUC i`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]]);; + +(* Stillwell: Since G_{i-1}/G_i is abelian, G_i is the kernel of a *) +(* homomorphism of G_{i-1} onto [an] abelian group, and therefore *) +(* sigma, tau in G_{i-1} => sigma^{-1} tau^{-1} sigma tau in G_i. *) +(* We formalize this as: commutators land in the normal subgroup. *) + +let ABELIAN_QUOTIENT_COMMUTATOR = prove + (`!G (n:A->bool). + n normal_subgroup_of G /\ + abelian_group(quotient_group G n) + ==> !x y. x IN group_carrier G /\ y IN group_carrier G + ==> group_mul G (group_inv G x) + (group_mul G (group_inv G y) + (group_mul G x y)) IN n`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(n:A->bool) subgroup_of G` ASSUME_TAC THENL + [ASM_MESON_TAC[normal_subgroup_of]; ALL_TAC] THEN + SUBGOAL_THEN + `right_coset G (n:A->bool) + (group_mul G (group_inv G x) (group_inv G y)) = + right_coset G n + (group_mul G (group_inv G y) (group_inv G x))` + MP_TAC THENL + [ASM_SIMP_TAC[GSYM QUOTIENT_GROUP_MUL; GROUP_INV] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [abelian_group]) THEN + DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[QUOTIENT_GROUP] THEN + REWRITE_TAC[IN_ELIM_THM] THEN + CONJ_TAC THENL + [EXISTS_TAC `group_inv G (x:A)` THEN ASM_SIMP_TAC[GROUP_INV]; + EXISTS_TAC `group_inv G (y:A)` THEN ASM_SIMP_TAC[GROUP_INV]]; + ALL_TAC] THEN + ASM_SIMP_TAC[RIGHT_COSET_EQ; GROUP_MUL; GROUP_INV] THEN + REWRITE_TAC[group_div] THEN + ASM_SIMP_TAC[GROUP_INV_MUL; GROUP_INV; GROUP_INV_INV] THEN + ASM_SIMP_TAC[GSYM GROUP_MUL_ASSOC; GROUP_INV; GROUP_MUL]);; + +(* Trivial group is solvable *) + +let TRIVIAL_IMP_SOLVABLE_GROUP = prove + (`!G:A group. trivial_group G ==> solvable_group G`, + REPEAT STRIP_TAC THEN REWRITE_TAC[solvable_group] THEN + EXISTS_TAC `0` THEN EXISTS_TAC `\n:num. group_carrier(G:A group)` THEN + REWRITE_TAC[LT] THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[trivial_group]) THEN + SET_TAC[]);; + +(* Abelian groups are solvable *) + +let ABELIAN_IMP_SOLVABLE_GROUP = prove + (`!G:A group. abelian_group G ==> solvable_group G`, + REPEAT STRIP_TAC THEN REWRITE_TAC[solvable_group] THEN + EXISTS_TAC `1` THEN + EXISTS_TAC `\n:num. if n = 0 then group_carrier(G:A group) + else {group_id G}` THEN + REWRITE_TAC[NOT_SUC; ARITH_RULE `i < 1 <=> i = 0`] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[ARITH_EQ; COND_CLAUSES] THEN + GEN_TAC THEN DISCH_THEN SUBST_ALL_TAC THEN + REWRITE_TAC[ARITH_EQ; COND_CLAUSES] THEN + REWRITE_TAC[SUBGROUP_GENERATED_GROUP_CARRIER] THEN + CONJ_TAC THENL + [REWRITE_TAC[TRIVIAL_NORMAL_SUBGROUP_OF]; + MATCH_MP_TAC ABELIAN_QUOTIENT_GROUP THEN + ASM_REWRITE_TAC[TRIVIAL_SUBGROUP_OF]]);; + +(* If N is normal in G with abelian quotient, and N is solvable, then G is *) +(* solvable. This is used to concatenate the solvability chains from *) +(* individual radical adjunction steps (Stillwell p.25, tower argument). *) + +let SOLVABLE_GROUP_NORMAL_EXTENSION = prove + (`!G (n:A->bool). + n normal_subgroup_of G /\ + abelian_group(quotient_group G n) /\ + solvable_group(subgroup_generated G n) + ==> solvable_group G`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 ASSUME_TAC MP_TAC)) THEN + SUBGOAL_THEN `n subgroup_of (G:A group)` ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]; ALL_TAC] THEN + REWRITE_TAC[solvable_group] THEN + SUBGOAL_THEN + `group_carrier(subgroup_generated G (n:A->bool)) = n` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN + `group_id(subgroup_generated G (n:A->bool)) = group_id G` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[SUBGROUP_GENERATED]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` (X_CHOOSE_THEN `d:num->(A->bool)` + STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `SUC m` THEN + EXISTS_TAC `\i. if i = 0 then group_carrier(G:A group) + else (d:num->(A->bool))(i - 1)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [(* c(0) = group_carrier G *) + CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[COND_CLAUSES]; + (* c(SUC m) = {group_id G} *) + REWRITE_TAC[NOT_SUC; COND_CLAUSES; SUC_SUB1] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Auxiliary: d(j) subgroup_of (subgroup_generated G n) for all j <= m *) + SUBGOAL_THEN + `!j. j <= m + ==> (d:num->(A->bool)) j subgroup_of + subgroup_generated (G:A group) n /\ + d j SUBSET n` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [(* Base: d(0) = n, show n subgroup_of subgroup_generated G n /\ + n SUBSET n *) + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(n:A->bool) subgroup_of subgroup_generated (G:A group) n` + ASSUME_TAC THENL + [MP_TAC(ISPEC `subgroup_generated (G:A group) (n:A->bool)` + CARRIER_SUBGROUP_OF) THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; + ASM_REWRITE_TAC[SUBSET_REFL]]; + (* Step: d(SUC j) from d(j) *) + DISCH_TAC THEN + SUBGOAL_THEN `j <= (m:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN `j < (m:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + (* Get chain condition for j *) + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN + (* d(SUC j) subgroup_of subgroup_generated(subgroup_generated G n)(d j) *) + SUBGOAL_THEN + `(d:num->(A->bool))(SUC j) subgroup_of + subgroup_generated (subgroup_generated (G:A group) n) (d j)` + ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]; ALL_TAC] THEN + (* Use equivalence to derive both properties *) + SUBGOAL_THEN + `(d:num->(A->bool))(SUC j) subgroup_of + subgroup_generated (G:A group) n /\ + (d:num->(A->bool))(SUC j) SUBSET (d:num->(A->bool)) j` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPECL [`subgroup_generated (G:A group) (n:A->bool)`; + `(d:num->(A->bool)) (SUC j)`; + `(d:num->(A->bool)) j`] + SUBGROUP_OF_SUBGROUP_GENERATED_SUBGROUP_EQ) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `(d:num->(A->bool)) j` THEN + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* Main: show each step is normal with abelian quotient *) + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + ASM_CASES_TAC `i = 0` THENL + [(* i = 0: c(1) = d(0) = n, need n normal in G with abelian quotient *) + ASM_REWRITE_TAC[NOT_SUC; COND_CLAUSES; SUC_SUB1] THEN + ASM_REWRITE_TAC[SUBGROUP_GENERATED_GROUP_CARRIER]; + (* i > 0: c(SUC i) = d(i), c(i) = d(i-1) *) + ALL_TAC] THEN + SUBGOAL_THEN `?j. i = SUC j /\ j < m` STRIP_ASSUME_TAC THENL + [EXISTS_TAC `i - 1` THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[ARITH_RULE `SUC(SUC j) - 1 = SUC j`; + ARITH_RULE `SUC j - 1 = j`; + NOT_SUC; COND_CLAUSES] THEN + (* Goal: d(SUC j) normal_subgroup_of subgroup_generated G (d j) /\ + abelian_group(quotient_group (subgroup_generated G (d j)) (d(SUC j))) + Chain gives same with subgroup_generated(subgroup_generated G n)(d j). + Use SUBGROUP_GENERATED_IDEMPOT to equate them. *) + SUBGOAL_THEN + `subgroup_generated (subgroup_generated (G:A group) n) + ((d:num->(A->bool)) j) = subgroup_generated G (d j)` + (fun th -> REWRITE_TAC[GSYM th]) THENL + [MATCH_MP_TAC SUBGROUP_GENERATED_IDEMPOT THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + (* Skip past the auxiliary to get the chain condition *) + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[]);; + +(* If f: G -> H is an epimorphism with n normal in G and G/n *) +(* abelian, then IMAGE f n is normal in H and H/(IMAGE f n) is abelian. *) + +let ABELIAN_QUOTIENT_EPIMORPHIC_IMAGE = prove + (`!(G:A group) (H:B group) (f:A->B) n. + group_epimorphism(G,H) f /\ + n normal_subgroup_of G /\ + abelian_group(quotient_group G n) + ==> IMAGE f n normal_subgroup_of H /\ + abelian_group(quotient_group H (IMAGE f n))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `IMAGE (f:A->B) n normal_subgroup_of H` ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_OF_EPIMORPHIC_IMAGE]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `m:B->bool = IMAGE (f:A->B) n` THEN + SUBGOAL_THEN + `group_epimorphism(G:A group, quotient_group (H:B group) m) + (right_coset H m o (f:A->B))` + ASSUME_TAC THENL + [MATCH_MP_TAC GROUP_EPIMORPHISM_COMPOSE THEN + EXISTS_TAC `H:B group` THEN + ASM_SIMP_TAC[GROUP_EPIMORPHISM_RIGHT_COSET]; + ALL_TAC] THEN + SUBGOAL_THEN + `n SUBSET group_kernel(G:A group, quotient_group (H:B group) m) + (right_coset H m o (f:A->B))` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; group_kernel; IN_ELIM_THM; o_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(x:A) IN group_carrier G` ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_OF_IMP_SUBSET; SUBSET]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[QUOTIENT_GROUP_ID] THEN + SUBGOAL_THEN `(f:A->B) x IN group_carrier H` ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[group_epimorphism; group_homomorphism]) THEN + ASM SET_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[RIGHT_COSET_EQ_SUBGROUP; NORMAL_SUBGROUP_IMP_SUBGROUP] THEN + EXPAND_TAC "m" THEN REWRITE_TAC[IN_IMAGE] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`G:A group`; + `quotient_group (H:B group) (m:B->bool)`; + `n:A->bool`; + `right_coset (H:B group) (m:B->bool) o (f:A->B)`] + QUOTIENT_GROUP_UNIVERSAL_EPIMORPHISM) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `g:(A->bool)->(B->bool)` STRIP_ASSUME_TAC) THEN + ASM_MESON_TAC[ABELIAN_GROUP_EPIMORPHIC_IMAGE]);; + +(* Epimorphic images of solvable groups are solvable. *) +(* Proof: the chain IMAGE f (c i) witnesses solvability of H, using *) +(* ABELIAN_QUOTIENT_EPIMORPHIC_IMAGE to transfer each step. *) + +let SOLVABLE_GROUP_EPIMORPHIC_IMAGE = prove + (`!(G:A group) (H:B group) (f:A->B). + group_epimorphism(G,H) f /\ solvable_group G ==> solvable_group H`, + REPEAT GEN_TAC THEN + REWRITE_TAC[solvable_group] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (X_CHOOSE_THEN `k:num` (X_CHOOSE_THEN `c:num->A->bool` + STRIP_ASSUME_TAC))) THEN + EXISTS_TAC `k:num` THEN + EXISTS_TAC `\i. IMAGE (f:A->B) ((c:num->A->bool) i)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `group_homomorphism(G:A group, H:B group) (f:A->B)` + ASSUME_TAC THENL + [ASM_MESON_TAC[group_epimorphism]; ALL_TAC] THEN + SUBGOAL_THEN `IMAGE (f:A->B) (group_carrier G) = group_carrier (H:B group)` + ASSUME_TAC THENL + [ASM_MESON_TAC[group_epimorphism]; ALL_TAC] THEN + SUBGOAL_THEN `!j. j <= k ==> (c:num->A->bool) j SUBSET group_carrier G` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [DISCH_TAC THEN ASM_REWRITE_TAC[SUBSET_REFL]; + DISCH_TAC THEN + SUBGOAL_THEN `j < (k:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool)(SUC j) normal_subgroup_of + subgroup_generated (G:A group) (c j)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[NORMAL_SUBGROUP_OF_IMP_SUBSET; SUBSET_TRANS; + GROUP_CARRIER_SUBGROUP_GENERATED_SUBSET]]; + ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SET_RULE `IMAGE (f:A->B) {a} = {f a}`] THEN + ASM_MESON_TAC[GROUP_HOMOMORPHISM_OF_ID]; + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(c:num->A->bool)(SUC i) normal_subgroup_of + subgroup_generated (G:A group) (c i) /\ + abelian_group(quotient_group (subgroup_generated G (c i)) (c(SUC i)))` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `group_epimorphism + (subgroup_generated (G:A group) ((c:num->A->bool) i), + subgroup_generated (H:B group) (IMAGE (f:A->B) (c i))) f` + ASSUME_TAC THENL + [MATCH_MP_TAC GROUP_EPIMORPHISM_BETWEEN_SUBGROUPS THEN + ASM_REWRITE_TAC[] THEN + FIRST_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL + [`subgroup_generated (G:A group) ((c:num->A->bool) i)`; + `subgroup_generated (H:B group) (IMAGE (f:A->B) ((c:num->A->bool) i))`; + `f:A->B`; + `(c:num->A->bool)(SUC i)`] + ABELIAN_QUOTIENT_EPIMORPHIC_IMAGE) THEN + ASM_REWRITE_TAC[]]);; + +(* Quotients of solvable groups are solvable *) + +let SOLVABLE_GROUP_QUOTIENT = prove + (`!(G:A group) n. + solvable_group G /\ n normal_subgroup_of G + ==> solvable_group(quotient_group G n)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SOLVABLE_GROUP_EPIMORPHIC_IMAGE THEN + EXISTS_TAC `G:A group` THEN + EXISTS_TAC `right_coset G (n:A->bool)` THEN + ASM_SIMP_TAC[GROUP_EPIMORPHISM_RIGHT_COSET]);; + +(* Isomorphic groups have the same solvability *) + +let ISOMORPHIC_GROUP_SOLVABILITY = prove + (`!(G:A group) (H:B group). + G isomorphic_group H ==> (solvable_group G <=> solvable_group H)`, + REPEAT STRIP_TAC THEN EQ_TAC THEN DISCH_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [isomorphic_group]) THEN + DISCH_THEN(X_CHOOSE_TAC `f:A->B`) THEN + MATCH_MP_TAC(ISPECL [`G:A group`; `H:B group`; `f:A->B`] + SOLVABLE_GROUP_EPIMORPHIC_IMAGE) THEN + ASM_MESON_TAC[GROUP_ISOMORPHISM_IMP_EPIMORPHISM]; + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [GSYM ISOMORPHIC_GROUP_SYM]) THEN + DISCH_THEN(MP_TAC o GEN_REWRITE_RULE I [isomorphic_group]) THEN + DISCH_THEN(X_CHOOSE_TAC `f:B->A`) THEN + MATCH_MP_TAC(ISPECL [`H:B group`; `G:A group`; `f:B->A`] + SOLVABLE_GROUP_EPIMORPHIC_IMAGE) THEN + ASM_MESON_TAC[GROUP_ISOMORPHISM_IMP_EPIMORPHISM]]);; + +(* Converse of ABELIAN_QUOTIENT_COMMUTATOR: if all commutators are in n, *) +(* then the quotient is abelian. Used for SOLVABLE_GROUP_SUBGROUP. *) + +let COMMUTATOR_IMP_ABELIAN_QUOTIENT = prove + (`!G (n:A->bool). + n normal_subgroup_of G /\ + (!x y. x IN group_carrier G /\ y IN group_carrier G + ==> group_mul G (group_inv G x) + (group_mul G (group_inv G y) + (group_mul G x y)) IN n) + ==> abelian_group(quotient_group G n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(n:A->bool) subgroup_of G` ASSUME_TAC THENL + [ASM_MESON_TAC[normal_subgroup_of]; ALL_TAC] THEN + REWRITE_TAC[abelian_group] THEN + ASM_SIMP_TAC[QUOTIENT_GROUP; IMP_CONJ; RIGHT_FORALL_IMP_THM; + FORALL_IN_GSPEC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + ASM_SIMP_TAC[GROUP_SETMUL_RIGHT_COSET] THEN + ASM_SIMP_TAC[RIGHT_COSET_EQ; GROUP_MUL] THEN + REWRITE_TAC[group_div] THEN + ASM_SIMP_TAC[GROUP_INV_MUL; GROUP_MUL; GROUP_INV] THEN + ASM_SIMP_TAC[GSYM GROUP_MUL_ASSOC; GROUP_MUL; GROUP_INV] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`group_inv G (x:A)`; `group_inv G (y:A)`]) THEN + ASM_SIMP_TAC[GROUP_INV; GROUP_INV_INV]);; + +(* Subgroups of solvable groups are solvable. *) +(* Proof: intersect the solvability chain with the subgroup. The commutator *) +(* and conjugation conditions transfer because subgroups are closed under *) +(* group operations. *) + +let SOLVABLE_GROUP_SUBGROUP = prove + (`!G (h:A->bool). + h subgroup_of G /\ solvable_group G + ==> solvable_group(subgroup_generated G h)`, + REPEAT GEN_TAC THEN + REWRITE_TAC[solvable_group] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (X_CHOOSE_THEN `k:num` (X_CHOOSE_THEN `c:num->A->bool` + STRIP_ASSUME_TAC))) THEN + SUBGOAL_THEN `group_carrier(subgroup_generated G (h:A->bool)) = h` + ASSUME_TAC THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN `group_id(subgroup_generated G (h:A->bool)) = group_id G` + ASSUME_TAC THENL + [REWRITE_TAC[SUBGROUP_GENERATED]; ALL_TAC] THEN + EXISTS_TAC `k:num` THEN + EXISTS_TAC `\i. (c:num->A->bool) i INTER (h:A->bool)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [(* c 0 INTER h = group_carrier(subgroup_generated G h) *) + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(SET_RULE `(h:A->bool) SUBSET s ==> s INTER h = h`) THEN + ASM_MESON_TAC[subgroup_of]; + (* c k INTER h = {group_id(subgroup_generated G h)} *) + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SET_RULE `{a:A} INTER (h:A->bool) = {a} <=> a IN h`] THEN + ASM_MESON_TAC[subgroup_of]; + (* Main step *) + ALL_TAC] THEN + (* Auxiliary: c(j) subgroup_of G for all j <= k *) + SUBGOAL_THEN `!j. j <= k ==> (c:num->A->bool) j subgroup_of G` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[CARRIER_SUBGROUP_OF]; + DISCH_TAC THEN + SUBGOAL_THEN `j < (k:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `j <= (k:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC SUBGROUP_OF_SUBGROUP_GENERATED_REV THEN + EXISTS_TAC `(c:num->A->bool) j` THEN + ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]]; + ALL_TAC] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + (* Get chain conditions for step i *) + SUBGOAL_THEN + `(c:num->A->bool)(SUC i) normal_subgroup_of + subgroup_generated (G:A group) (c i) /\ + abelian_group(quotient_group (subgroup_generated G (c i)) (c(SUC i)))` + STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool) i subgroup_of G` ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool)(SUC i) subgroup_of G` ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool)(SUC i) SUBSET c i` ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_OF_IMP_SUBSET; + CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool) i INTER h subgroup_of G` ASSUME_TAC THENL + [MATCH_MP_TAC SUBGROUP_OF_INTER THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(c:num->A->bool)(SUC i) INTER h subgroup_of G` + ASSUME_TAC THENL + [MATCH_MP_TAC SUBGROUP_OF_INTER THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* d(i) subgroup_of subgroup_generated G h *) + SUBGOAL_THEN + `(c:num->A->bool) i INTER h subgroup_of + subgroup_generated (G:A group) (h:A->bool)` ASSUME_TAC THENL + [REWRITE_TAC[SUBGROUP_OF_SUBGROUP_GENERATED_EQ] THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + SET_TAC[]; + ALL_TAC] THEN + (* Use SUBGROUP_GENERATED_IDEMPOT to simplify nesting *) + SUBGOAL_THEN + `subgroup_generated (subgroup_generated G (h:A->bool)) + ((c:num->A->bool) i INTER h) = + subgroup_generated G (c i INTER h)` + (fun th -> REWRITE_TAC[th]) THENL + [MATCH_MP_TAC SUBGROUP_GENERATED_IDEMPOT THEN SET_TAC[]; + ALL_TAC] THEN + (* Goal: c(SUC i) INTER h normal_subgroup_of sg G (c i INTER h) /\ + abelian_group(quotient_group (sg G (c i INTER h)) (c(SUC i) INTER h)) *) + (* Carrier of sg G (c i INTER h) = c i INTER h *) + SUBGOAL_THEN + `group_carrier(subgroup_generated G ((c:num->A->bool) i INTER h)) = + c i INTER h` ASSUME_TAC THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + (* c(SUC i) INTER h subgroup_of sg G (c i INTER h) *) + SUBGOAL_THEN + `(c:num->A->bool)(SUC i) INTER h subgroup_of + subgroup_generated G (c i INTER h)` ASSUME_TAC THENL + [REWRITE_TAC[SUBGROUP_OF_SUBGROUP_GENERATED_EQ] THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + ASM SET_TAC[]; + ALL_TAC] THEN + (* Key conjugation lemma: conjugation preserves c(SUC i) INTER h *) + SUBGOAL_THEN + `!a x. a IN (c:num->A->bool) i INTER h /\ x IN c(SUC i) INTER h + ==> group_conjugation G a x IN c(SUC i) INTER h` + ASSUME_TAC THENL + [REWRITE_TAC[IN_INTER] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL + [(* group_conjugation G a x IN c(SUC i): from normality *) + MP_TAC(ASSUME + `(c:num->A->bool)(SUC i) normal_subgroup_of + subgroup_generated G (c i)`) THEN + REWRITE_TAC[NORMAL_SUBGROUP_CONJUGATION] THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + DISCH_THEN(MP_TAC o SPEC `a:A` o CONJUNCT2) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; + group_conjugation; SUBGROUP_GENERATED] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* group_conjugation G a x IN h: subgroup closure *) + MATCH_MP_TAC IN_SUBGROUP_CONJUGATION THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Normality *) + SUBGOAL_THEN + `(c:num->A->bool)(SUC i) INTER h normal_subgroup_of + subgroup_generated G (c i INTER h)` ASSUME_TAC THENL + [REWRITE_TAC[NORMAL_SUBGROUP_CONJUGATION] THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `b:A` THEN DISCH_TAC THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REWRITE_TAC[group_conjugation; SUBGROUP_GENERATED] THEN + REWRITE_TAC[GSYM group_conjugation] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[IN_INTER] THEN + RULE_ASSUM_TAC(REWRITE_RULE[IN_INTER]) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* Abelianness via COMMUTATOR_IMP_ABELIAN_QUOTIENT *) + MATCH_MP_TAC COMMUTATOR_IMP_ABELIAN_QUOTIENT THEN + ASM_REWRITE_TAC[SUBGROUP_GENERATED] THEN + MAP_EVERY X_GEN_TAC [`x:A`; `y:A`] THEN + REWRITE_TAC[IN_INTER] THEN STRIP_TAC THEN + REWRITE_TAC[IN_INTER] THEN CONJ_TAC THENL + [(* Commutator in c(SUC i): from abelian quotient *) + MP_TAC(ISPECL [`subgroup_generated G ((c:num->A->bool) i)`; + `(c:num->A->bool)(SUC i)`] + ABELIAN_QUOTIENT_COMMUTATOR) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL [`x:A`; `y:A`]) THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + REWRITE_TAC[SUBGROUP_GENERATED]; + (* Commutator in h: subgroup closure *) + SUBGOAL_THEN `group_inv G (x:A) IN h /\ group_inv G y IN h` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[IN_SUBGROUP_INV]; ALL_TAC] THEN + REPEAT(MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[])]);; + +(* "Three for the price of two": G is solvable iff N and G/N are both *) +(* solvable (backward direction; forward is SOLVABLE_GROUP_SUBGROUP + *) +(* SOLVABLE_GROUP_QUOTIENT). Proof: concatenate the solvability chains. *) +(* For G/N chain d(0)..d(m), take preimages c(i) = {x in G | f(x) in d(i)} *) +(* where f = right_coset G n. For N chain e(0)..e(p), append directly. *) + +let SOLVABLE_GROUP_SOLVABLE_QUOTIENT = prove + (`!G (n:A->bool). + n normal_subgroup_of G /\ + solvable_group(subgroup_generated G n) /\ + solvable_group(quotient_group G n) + ==> solvable_group G`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 MP_TAC MP_TAC)) THEN + REWRITE_TAC[solvable_group] THEN + SUBGOAL_THEN `(n:A->bool) subgroup_of G` ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN `group_carrier(subgroup_generated G (n:A->bool)) = n` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN `group_id(subgroup_generated G (n:A->bool)) = group_id G` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[SUBGROUP_GENERATED]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` + (X_CHOOSE_THEN `d:num->(A->bool)->bool` + (CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "d_cond"))))) THEN + DISCH_THEN(X_CHOOSE_THEN `p:num` + (X_CHOOSE_THEN `e:num->A->bool` + (CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "e_cond"))))) THEN + (* Epimorphism facts *) + SUBGOAL_THEN + `group_epimorphism(G,quotient_group G (n:A->bool)) (right_coset G n)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[GROUP_EPIMORPHISM_RIGHT_COSET]; ALL_TAC] THEN + SUBGOAL_THEN + `group_homomorphism(G,quotient_group G (n:A->bool)) (right_coset G n)` + ASSUME_TAC THENL + [ASM_MESON_TAC[group_epimorphism]; ALL_TAC] THEN + (* d chain: subgroups of quotient_group G n *) + SUBGOAL_THEN + `!j. j <= m + ==> (d:num->(A->bool)->bool) j subgroup_of + quotient_group G (n:A->bool)` + (LABEL_TAC "d_sub") THENL + [INDUCT_TAC THENL + [DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[CARRIER_SUBGROUP_OF]; + DISCH_TAC THEN + SUBGOAL_THEN `j < (m:num)` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `j <= (m:num)` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC SUBGROUP_OF_SUBGROUP_GENERATED_REV THEN + EXISTS_TAC `(d:num->(A->bool)->bool) j` THEN + ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]]; + ALL_TAC] THEN + (* e chain: subgroups of subgroup_generated G n, subset of n *) + SUBGOAL_THEN + `!j. j <= p + ==> (e:num->A->bool) j subgroup_of subgroup_generated G (n:A->bool) /\ + e j SUBSET n` + (LABEL_TAC "e_sub") THENL + [INDUCT_TAC THENL + [DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MP_TAC(ISPEC `subgroup_generated G (n:A->bool)` + CARRIER_SUBGROUP_OF) THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; + SET_TAC[]]; + DISCH_TAC THEN + SUBGOAL_THEN `j < (p:num)` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `j <= (p:num)` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN + `(e:num->A->bool)(SUC j) subgroup_of subgroup_generated G (n:A->bool)` + ASSUME_TAC THENL + [MATCH_MP_TAC SUBGROUP_OF_SUBGROUP_GENERATED_REV THEN + EXISTS_TAC `(e:num->A->bool) j` THEN + ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[NORMAL_SUBGROUP_OF_IMP_SUBSET; + CARRIER_SUBGROUP_GENERATED_SUBGROUP; SUBSET_TRANS]]; + ALL_TAC] THEN + (* Key fact: preimage of d(m) = n, using GROUP_KERNEL_RIGHT_COSET *) + SUBGOAL_THEN + `{x:A | x IN group_carrier G /\ + right_coset G n x IN (d:num->(A->bool)->bool) m} = n` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[QUOTIENT_GROUP_ID] THEN + REWRITE_TAC[IN_SING] THEN + SUBGOAL_THEN + `{x:A | x IN group_carrier G /\ + right_coset G n x = (n:A->bool)} = + group_kernel(G,quotient_group G n) (right_coset G n)` + SUBST1_TAC THENL + [REWRITE_TAC[group_kernel] THEN ASM_SIMP_TAC[QUOTIENT_GROUP_ID]; + ASM_SIMP_TAC[GROUP_KERNEL_RIGHT_COSET]]; + ALL_TAC] THEN + (* Provide combined chain *) + EXISTS_TAC `m + p:num` THEN + EXISTS_TAC `\i:num. if i <= m + then {x:A | x IN group_carrier G /\ + right_coset G n x IN (d:num->(A->bool)->bool) i} + else (e:num->A->bool)(i - m)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [(* c(0) = group_carrier G *) + REWRITE_TAC[LE_0] THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + GEN_TAC THEN EQ_TAC THEN SIMP_TAC[] THEN DISCH_TAC THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o CONJUNCT1 o + GEN_REWRITE_RULE I [group_homomorphism]) THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* c(m+p) = {group_id G} *) + ASM_CASES_TAC `p = 0` THENL + [FIRST_X_ASSUM SUBST_ALL_TAC THEN + REWRITE_TAC[ADD_CLAUSES; LE_REFL] THEN + SUBGOAL_THEN `(n:A->bool) = {group_id G}` ASSUME_TAC THENL + [UNDISCH_TAC `(e:num->A->bool) 0 = {group_id(G:A group)}` THEN + UNDISCH_TAC `(e:num->A->bool) 0 = (n:A->bool)` THEN + MESON_TAC[]; + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `~(m + p:num <= m)` (fun th -> REWRITE_TAC[th]) THENL + [UNDISCH_TAC `~(p = 0)` THEN ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[ARITH_RULE `(m + p) - m:num = p`]]; + (* Main: chain condition for all i < m + p *) + ALL_TAC] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + ASM_CASES_TAC `i:num < m` THENL + [(* Case 1: i < m, both c(i) and c(SUC i) in preimage branch *) + SUBGOAL_THEN `i <= (m:num)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `SUC i <= (m:num)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + (* First establish the d-chain subgroup facts we need *) + SUBGOAL_THEN `(d:num->(A->bool)->bool) i subgroup_of + quotient_group G (n:A->bool)` ASSUME_TAC THENL + [USE_THEN "d_sub" MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(d:num->(A->bool)->bool)(SUC i) subgroup_of + quotient_group G (n:A->bool)` ASSUME_TAC THENL + [USE_THEN "d_sub" MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + (* Set up the restricted epimorphism *) + ABBREV_TAC + `ci = {x:A | x IN group_carrier G /\ + right_coset G n x IN (d:num->(A->bool)->bool) i}` THEN + ABBREV_TAC + `csi = {x:A | x IN group_carrier G /\ + right_coset G n x IN (d:num->(A->bool)->bool)(SUC i)}` THEN + (* ci is a subgroup of G *) + SUBGOAL_THEN `(ci:A->bool) subgroup_of G` ASSUME_TAC THENL + [EXPAND_TAC "ci" THEN MATCH_MP_TAC SUBGROUP_OF_HOMOMORPHIC_PREIMAGE THEN + EXISTS_TAC `quotient_group G (n:A->bool)` THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* csi is a subgroup of G *) + SUBGOAL_THEN `(csi:A->bool) subgroup_of G` ASSUME_TAC THENL + [EXPAND_TAC "csi" THEN MATCH_MP_TAC SUBGROUP_OF_HOMOMORPHIC_PREIMAGE THEN + EXISTS_TAC `quotient_group G (n:A->bool)` THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* IMAGE (right_coset G n) ci = d i *) + SUBGOAL_THEN + `IMAGE (right_coset G (n:A->bool)) ci = (d:num->(A->bool)->bool) i` + ASSUME_TAC THENL + [EXPAND_TAC "ci" THEN + SUBGOAL_THEN `(d:num->(A->bool)->bool) i SUBSET + IMAGE (right_coset G (n:A->bool)) (group_carrier G)` + ASSUME_TAC THENL + [MP_TAC(ASSUME `group_epimorphism(G,quotient_group G (n:A->bool)) + (right_coset G n)`) THEN + REWRITE_TAC[group_epimorphism] THEN + DISCH_THEN(fun th -> REWRITE_TAC[CONJUNCT2 th]) THEN + MP_TAC(ASSUME `(d:num->(A->bool)->bool) i subgroup_of + quotient_group G (n:A->bool)`) THEN + REWRITE_TAC[subgroup_of] THEN SET_TAC[]; + ASM SET_TAC[]]; + ALL_TAC] THEN + (* Restricted epimorphism *) + SUBGOAL_THEN + `group_epimorphism + (subgroup_generated G ci, + subgroup_generated (quotient_group G (n:A->bool)) + ((d:num->(A->bool)->bool) i)) + (right_coset G n)` ASSUME_TAC THENL + [SUBGOAL_THEN + `subgroup_generated (quotient_group G (n:A->bool)) + (IMAGE (right_coset G n) (ci:A->bool)) = + subgroup_generated (quotient_group G n) ((d:num->(A->bool)->bool) i)` + (fun th -> REWRITE_TAC[GSYM th]) THENL + [AP_TERM_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC GROUP_EPIMORPHISM_BETWEEN_SUBGROUPS THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ASSUME `(ci:A->bool) subgroup_of G`) THEN + REWRITE_TAC[subgroup_of] THEN SET_TAC[]; ALL_TAC] THEN + (* Preimage of d(SUC i) under restricted map = csi *) + SUBGOAL_THEN + `{x:A | x IN group_carrier(subgroup_generated G ci) /\ + right_coset G n x IN (d:num->(A->bool)->bool)(SUC i)} = csi` + ASSUME_TAC THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + EXPAND_TAC "ci" THEN EXPAND_TAC "csi" THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [STRIP_TAC THEN ASM_REWRITE_TAC[]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(d:num->(A->bool)->bool)(SUC i) SUBSET d i` MP_TAC THENL + [USE_THEN "d_cond" (MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o MATCH_MP NORMAL_SUBGROUP_OF_IMP_SUBSET) THEN + USE_THEN "d_sub" (MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; + ASM SET_TAC[]]]; + ALL_TAC] THEN + (* Chain condition for quotient: d(SUC i) normal in sg(G/N)(d i) *) + SUBGOAL_THEN + `(d:num->(A->bool)->bool)(SUC i) normal_subgroup_of + subgroup_generated (quotient_group G (n:A->bool)) (d i) /\ + abelian_group(quotient_group + (subgroup_generated (quotient_group G n) (d i)) (d(SUC i)))` + STRIP_ASSUME_TAC THENL + [USE_THEN "d_cond" (MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + (* Normality: csi normal in sg G ci *) + CONJ_TAC THENL + [SUBGOAL_THEN + `(csi:A->bool) normal_subgroup_of subgroup_generated G ci` + MP_TAC THENL + [ALL_TAC; REWRITE_TAC[]] THEN + FIRST_X_ASSUM(fun th -> REWRITE_TAC[SYM th]) THEN + MATCH_MP_TAC NORMAL_SUBGROUP_OF_HOMOMORPHIC_PREIMAGE THEN + EXISTS_TAC `subgroup_generated (quotient_group G (n:A->bool)) + ((d:num->(A->bool)->bool) i)` THEN + ASM_REWRITE_TAC[] THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + FIRST_X_ASSUM(ACCEPT_TAC o CONJUNCT1 o + REWRITE_RULE[group_epimorphism]); ALL_TAC] THEN + (* Abelianness: quotient(sg G ci)(csi) abelian *) + SUBGOAL_THEN + `quotient_group (subgroup_generated G ci) (csi:A->bool) + isomorphic_group + quotient_group + (subgroup_generated (quotient_group G (n:A->bool)) + ((d:num->(A->bool)->bool) i)) (d(SUC i))` + MP_TAC THENL + [MATCH_MP_TAC FIRST_GROUP_ISOMORPHISM_THEOREM_GEN THEN + EXISTS_TAC `right_coset G (n:A->bool)` THEN + ASM_REWRITE_TAC[]; + DISCH_THEN(MP_TAC o MATCH_MP ISOMORPHIC_GROUP_ABELIANNESS) THEN + ASM_REWRITE_TAC[]]; + (* Case 2: i >= m *) + SUBGOAL_THEN `~(i:num <= m) \/ i = m` MP_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(DISJ_CASES_THEN2 ASSUME_TAC SUBST_ALL_TAC) THENL + [(* Subcase: i > m, both in N chain *) + SUBGOAL_THEN `~(i <= m) /\ ~(SUC i <= m)` STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC i - m = SUC(i - m)` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + USE_THEN "e_sub" (MP_TAC o SPEC `i - m:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(ASSUME_TAC o CONJUNCT2) THEN + USE_THEN "e_cond" (MP_TAC o SPEC `i - m:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(MATCH_MP SUBGROUP_GENERATED_IDEMPOT + (ASSUME `(e:num->A->bool)(i - m) SUBSET (n:A->bool)`)) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]); + (* Subcase: i = m, junction between d-chain and e-chain *) + REWRITE_TAC[LE_REFL; ARITH_RULE `~(SUC m <= m)`] THEN + REWRITE_TAC[ARITH_RULE `SUC m - m = 1`] THEN + ASM_REWRITE_TAC[] THEN + USE_THEN "e_cond" (MP_TAC o SPEC `0`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[ARITH_RULE `SUC 0 = 1`; + ASSUME `(e:num->A->bool) 0 = (n:A->bool)`] THEN + MP_TAC(ISPEC `G:A group` + (MATCH_MP SUBGROUP_GENERATED_IDEMPOT + (ISPEC `n:A->bool` SUBSET_REFL))) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th])]]);; + (* ------------------------------------------------------------------------- *) (* Basic things about exact sequences. *) (* ------------------------------------------------------------------------- *) diff --git a/Library/isum.ml b/Library/isum.ml index 08910f99..c6de8456 100644 --- a/Library/isum.ml +++ b/Library/isum.ml @@ -267,10 +267,10 @@ let EXPAND_ISUM_CONV = then failwith "EXPAND_ISUM_CONV" else let mtm,ntm = dest_binop ns_tm mn in let m = dest_numeral mtm and n = dest_numeral ntm in - if n < m then + if n A) g. (!x. f(g x) = x) /\ (!x. g(f x) = x) + ==> inverse f = g`, + REPEAT STRIP_TAC THEN REWRITE_TAC[FUN_EQ_THM; inverse] THEN + X_GEN_TAC `y:A` THEN MATCH_MP_TAC SELECT_UNIQUE THEN + X_GEN_TAC `x:A` THEN EQ_TAC THEN ASM_MESON_TAC[]);; + (* ------------------------------------------------------------------------- *) (* Transpositions. *) (* ------------------------------------------------------------------------- *) @@ -67,6 +74,66 @@ let SWAP_GALOIS = prove (`!a b x y. x = swap(a,b) y <=> y = swap(a,b) x`, REWRITE_TAC[swap] THEN MESON_TAC[]);; +let SWAP_LEFT = prove + (`!a b:A. swap(a,b) a = b`, + REWRITE_TAC[swap]);; + +let SWAP_RIGHT = prove + (`!a b:A. swap(a,b) b = a`, + REWRITE_TAC[swap] THEN MESON_TAC[]);; + +let SWAP_OTHER = prove + (`!a b x:A. ~(x = a) /\ ~(x = b) ==> swap(a,b) x = x`, + REWRITE_TAC[swap] THEN MESON_TAC[]);; + +let SWAP_TRIPLE = prove + (`!a b c:A. ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> swap(a,b) o swap(b,c) o swap(a,b) = swap(a,c)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `~(b:A = a) /\ ~(c:A = b) /\ ~(c:A = a)` STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; swap] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `x:A = a` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `x:A = b` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `x:A = c` THEN ASM_REWRITE_TAC[]);; + +let SWAP_TRIPLE_ALT = prove + (`!a x y:A. ~(a = x) /\ ~(a = y) /\ ~(x = y) + ==> swap(a,x) o swap(a,y) o swap(a,x) = swap(x,y)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `~(x:A = a) /\ ~(y:A = a) /\ ~(y:A = x)` STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; swap] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `z:A = a` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `z:A = x` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `z:A = y` THEN ASM_REWRITE_TAC[]);; + +let INVOLUTION_SIZE_2_IS_SWAP = prove + (`!(s:A->bool) (p:A->A). + (!x. x IN s ==> p x IN s) /\ + (!x. x IN s ==> p(p x) = x) /\ + {x | x IN s /\ ~(p x = x)} HAS_SIZE 2 + ==> ?a b. a IN s /\ b IN s /\ ~(a = b) /\ + !x. x IN s ==> p x = swap(a,b) x`, + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o CONV_RULE HAS_SIZE_CONV) THEN + REPEAT(MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY; swap] THEN + ASM SET_TAC[]);; + +let INVOLUTION_MOVES_2_IS_SWAP = prove + (`!(s:A->bool) (p:A->A). + FINITE s /\ + (!x. x IN s ==> p x IN s) /\ + (!x. x IN s ==> p(p x) = x) /\ + CARD {x | x IN s /\ ~(p x = x)} = 2 + ==> ?(a:A) (b:A). a IN s /\ b IN s /\ ~(a = b) /\ + !x. x IN s ==> p x = swap(a,b) x`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INVOLUTION_SIZE_2_IS_SWAP THEN + ASM_SIMP_TAC[HAS_SIZE; FINITE_RESTRICT] THEN ASM_MESON_TAC[]);; + (* ------------------------------------------------------------------------- *) (* Basic consequences of the definition. *) (* ------------------------------------------------------------------------- *) @@ -201,6 +268,43 @@ let PERMUTES_TRANSFER = prove ==> q permutes (IMAGE f s)`, SIMP_TAC[PERMUTES_ALT] THEN SET_TAC[]);; +(* ------------------------------------------------------------------------- *) +(* Swap conjugation and triple swaps *) +(* ------------------------------------------------------------------------- *) + +(* Conjugating a swap by a permutation gives a swap of the images: *) +(* sigma o swap(a,b) o sigma^{-1} = swap(sigma a, sigma b) *) + +let SWAP_CONJUGATE = prove + (`!(p:A->A) s a b. p permutes s + ==> p o swap(a,b) o inverse p = swap(p a, p b)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP PERMUTES_INVERSES_o) THEN + SUBGOAL_THEN `!y:A. (p:A->A)(inverse p y) = y` + ASSUME_TAC THENL + [UNDISCH_TAC `(p:A->A) o inverse p = I` THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM]; + ALL_TAC] THEN + SUBGOAL_THEN `!y:A. inverse (p:A->A) (p y) = y` + ASSUME_TAC THENL + [UNDISCH_TAC `inverse (p:A->A) o p = I` THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM]; + ALL_TAC] THEN + REWRITE_TAC[FUN_EQ_THM; o_THM] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) = (p:A->A) a` THENL + [ASM_REWRITE_TAC[SWAP_LEFT]; ALL_TAC] THEN + ASM_CASES_TAC `(x:A) = (p:A->A) b` THENL + [ASM_REWRITE_TAC[SWAP_RIGHT]; ALL_TAC] THEN + SUBGOAL_THEN `~(inverse (p:A->A) (x:A) = a) /\ + ~(inverse p x = b)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN + DISCH_THEN(MP_TAC o AP_TERM `(p:A->A)`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[SWAP_OTHER] THEN + ASM_REWRITE_TAC[]);; + (* ------------------------------------------------------------------------- *) (* Group properties. *) (* ------------------------------------------------------------------------- *) @@ -323,6 +427,113 @@ let PERMUTES_FINITE_SURJECTIVE = prove STRIP_TAC THEN X_GEN_TAC `y:A` THEN ASM_CASES_TAC `(y:A) IN s` THEN ASM_MESON_TAC[]);; +(* ------------------------------------------------------------------------- *) +(* Restriction of permutations to subsets *) +(* ------------------------------------------------------------------------- *) + +let RESTRICT_PERMUTES_SUBSET = prove + (`!s t (f:A->A). + FINITE t /\ t SUBSET s /\ f permutes s /\ IMAGE f t = t + ==> (\x. if x IN t then f x else x) permutes t`, + REPEAT STRIP_TAC THEN + MP_TAC(SPEC `t:A->bool` PERMUTES_FINITE_INJECTIVE) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + REPEAT CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN COND_CASES_TAC THEN ASM_MESON_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(f:A->A) x IN t` MP_TAC THENL + [ASM SET_TAC[]; SIMP_TAC[]]; + MAP_EVERY X_GEN_TAC [`x:A`; `y:A`] THEN STRIP_TAC THEN + REWRITE_TAC[] THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[PERMUTES_INJECTIVE]]);; + +(* Restriction of identity is identity *) +let RESTRICT_I = prove + (`!t:A->bool. (\x. if x IN t then I x else x) = I`, + GEN_TAC THEN REWRITE_TAC[FUN_EQ_THM; I_THM] THEN + GEN_TAC THEN COND_CASES_TAC THEN REWRITE_TAC[]);; + +(* Restriction of composition = composition of restrictions, + when both permutations preserve the subset *) +let RESTRICT_COMPOSE = prove + (`!s t (f:A->A) g. + t SUBSET s /\ f permutes s /\ g permutes s /\ + IMAGE f t = t /\ IMAGE g t = t + ==> (\x. if x IN t then (f o g) x else x) = + (\x. if x IN t then f x else x) o (\x. if x IN t then g x else x)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[FUN_EQ_THM; o_THM] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN t` THENL + [ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(g:A->A) x IN t` ASSUME_TAC THENL + [ASM SET_TAC[]; ASM_SIMP_TAC[]]; + ASM_REWRITE_TAC[]]);; + +(* Restriction of inverse = inverse of restriction *) +let RESTRICT_INVERSE = prove + (`!s t (f:A->A). + FINITE t /\ t SUBSET s /\ f permutes s /\ IMAGE f t = t + ==> (\x. if x IN t then inverse f x else x) = + inverse (\x. if x IN t then f x else x)`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `g = \x:A. if x IN t then f x else x` THEN + SUBGOAL_THEN `(g:A->A) permutes t` ASSUME_TAC THENL + [EXPAND_TAC "g" THEN MATCH_MP_TAC RESTRICT_PERMUTES_SUBSET THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Key fact: inverse f maps t to t *) + SUBGOAL_THEN `!z:A. z IN t ==> inverse f z IN t` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(z:A) IN IMAGE (f:A->A) t` MP_TAC THENL + [ASM SET_TAC[]; + REWRITE_TAC[IN_IMAGE] THEN + DISCH_THEN(X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `inverse (f:A->A) z = w` SUBST1_TAC THENL + [MP_TAC(ASSUME `(f:A->A) permutes s`) THEN + DISCH_THEN(MP_TAC o MATCH_MP PERMUTES_INVERSE_EQ) THEN + ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* Key fact: f(inverse f y) = y *) + SUBGOAL_THEN `!y:A. (f:A->A) (inverse f y) = y` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(MATCH_MP PERMUTES_INVERSES_o (ASSUME `(f:A->A) permutes s`)) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o REWRITE_RULE[FUN_EQ_THM; o_THM; I_THM]) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]); + ALL_TAC] THEN + (* Main: show inverse g y = (if y IN t then inverse f y else y) *) + REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `y:A` THEN + MATCH_MP_TAC EQ_SYM THEN + FIRST_ASSUM(MP_TAC o MATCH_MP PERMUTES_INVERSE_EQ) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + (* Goal: g (if y IN t then inverse f y else y) = y *) + ASM_CASES_TAC `(y:A) IN t` THENL + [ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `inverse (f:A->A) y IN t` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(g:A->A) (inverse f y) = f (inverse f y)` + (fun th -> ASM_REWRITE_TAC[th]) THEN + EXPAND_TAC "g" THEN BETA_TAC THEN + COND_CASES_TAC THENL [REFL_TAC; ASM_MESON_TAC[]]; + ASM_REWRITE_TAC[] THEN + EXPAND_TAC "g" THEN BETA_TAC THEN + COND_CASES_TAC THENL [ASM_MESON_TAC[]; REFL_TAC]]);; + +(* Helper: restriction of swap(a,b) to a set containing a and b is swap(a,b) *) +let RESTRICT_SWAP = prove + (`!(s:A->bool) a b. + a IN s /\ b IN s + ==> (\x. if x IN s then swap(a,b) x else x) = swap(a,b)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN s` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[swap] THEN + REPEAT COND_CASES_TAC THEN ASM_MESON_TAC[]);; + (* ------------------------------------------------------------------------- *) (* Permutations of index set for iterated operations. *) (* ------------------------------------------------------------------------- *) @@ -381,6 +592,90 @@ let SWAP_INDEPENDENT = prove REPEAT(FIRST_X_ASSUM SUBST_ALL_TAC) THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]);; +(* ------------------------------------------------------------------------- *) +(* Three-cycles: pure permutation combinatorics *) +(* ------------------------------------------------------------------------- *) + +(* A 3-cycle (a b c) sends a -> b -> c -> a, fixes everything else *) +let three_cycle = new_definition + `three_cycle (a:A) b c = + \x:A. if x = a then b else if x = b then c else if x = c then a else x`;; + +let PERMUTES_THREE_CYCLE = prove + (`!s a b c:A. a IN s /\ b IN s /\ c IN s /\ + ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> three_cycle a b c permutes s`, + REPEAT STRIP_TAC THEN REWRITE_TAC[permutes; three_cycle] THEN + ASM_MESON_TAC[]);; + +(* Composition of a three-cycle with its reverse gives identity *) +let THREE_CYCLE_COMPOSE_REVERSE = prove + (`!a b c:A. ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> three_cycle a b c o three_cycle a c b = I /\ + three_cycle a c b o three_cycle a b c = I`, + REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM; three_cycle] THEN MESON_TAC[]);; + +let THREE_CYCLE_INVERSE = prove + (`!a b c:A. ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> inverse (three_cycle a b c) = three_cycle a c b`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INVERSE_UNIQUE_ALT THEN + MP_TAC(SPECL [`a:A`; `b:A`; `c:A`] THREE_CYCLE_COMPOSE_REVERSE) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM] THEN MESON_TAC[]);; + +(* Key commutator identity: (x_a x_b x_c) = sigma^{-1} tau^{-1} sigma tau *) +(* where sigma = (x_d x_a x_c) and tau = (x_c x_e x_b): *) +(* every 3-cycle is a commutator of two 3-cycles (when n >= 5). *) +(* This is the core combinatorial fact for proving S_n is not solvable. *) + +let THREE_CYCLE_AS_COMMUTATOR = prove + (`!a b c d e:A. + ~(a = b) /\ ~(a = c) /\ ~(a = d) /\ ~(a = e) /\ + ~(b = c) /\ ~(b = d) /\ ~(b = e) /\ + ~(c = d) /\ ~(c = e) /\ + ~(d = e) + ==> three_cycle a b c = + (three_cycle d c a) o + (three_cycle c b e) o + (three_cycle d a c) o + (three_cycle c e b)`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; three_cycle] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `x:A = a` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `x:A = b` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `x:A = c` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `x:A = d` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `x:A = e` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]);; + +(* Same identity but stated using inverse *) +let THREE_CYCLE_COMMUTATOR = prove + (`!a b c d e:A. + ~(a = b) /\ ~(a = c) /\ ~(a = d) /\ ~(a = e) /\ + ~(b = c) /\ ~(b = d) /\ ~(b = e) /\ + ~(c = d) /\ ~(c = e) /\ + ~(d = e) + ==> three_cycle a b c = + (inverse(three_cycle d a c)) o + (inverse(three_cycle c e b)) o + (three_cycle d a c) o + (three_cycle c e b)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `inverse(three_cycle d a (c:A)) = three_cycle d c a` + SUBST1_TAC THENL + [MATCH_MP_TAC THREE_CYCLE_INVERSE THEN ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `inverse(three_cycle c e (b:A)) = three_cycle c b e` + SUBST1_TAC THENL + [MATCH_MP_TAC THREE_CYCLE_INVERSE THEN ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC THREE_CYCLE_AS_COMMUTATOR THEN ASM_REWRITE_TAC[]);; + +(* A 3-cycle is nontrivial (not the identity) *) +let THREE_CYCLE_NOT_I = prove + (`!a b c:A. ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> ~(three_cycle a b c = I)`, + REWRITE_TAC[FUN_EQ_THM; three_cycle; I_THM] THEN MESON_TAC[]);; + (* ------------------------------------------------------------------------- *) (* Permutations as transposition sequences. *) (* ------------------------------------------------------------------------- *) diff --git a/Library/ringtheory.ml b/Library/ringtheory.ml index f6b6dd09..3c8ba4bb 100644 --- a/Library/ringtheory.ml +++ b/Library/ringtheory.ml @@ -10507,6 +10507,30 @@ let FRACTION_DOMAIN = prove GEN_REWRITE_TAC LAND_CONV [GSYM FRACTION_FIELD] THEN REWRITE_TAC[FIELD_IMP_INTEGRAL_DOMAIN]]);; +let INTEGRAL_DOMAIN_LOCALIZATION = prove + (`!r s:A->bool. + integral_domain r /\ ring_multsys r s /\ ~(ring_0 r IN s) + ==> integral_domain (ring_localization r s)`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[integral_domain] THEN CONJ_TAC THENL + [ASM_MESON_TAC[TRIVIAL_RING_LOCALIZATION; TRIVIAL_RING_10]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_CARRIER] THEN + REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN + X_GEN_TAC `a1:A` THEN DISCH_TAC THEN X_GEN_TAC `b1:A` THEN DISCH_TAC THEN + X_GEN_TAC `a2:A` THEN DISCH_TAC THEN X_GEN_TAC `b2:A` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(b1:A) IN ring_carrier r /\ b2 IN ring_carrier r` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_multsys; SUBSET]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_MUL; RING_LOCALEQUIV_EQ_0_GEN; + RING_MUL; RING_MULTSYS] THEN + DISCH_THEN(X_CHOOSE_THEN `u:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(a1:A) = ring_0 r \/ a2 = ring_0 r` DISJ_CASES_TAC THENL + [MP_TAC(ISPEC `r:A ring` INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ASM_MESON_TAC[integral_domain; ring_multsys; SUBSET; RING_MUL]; + DISJ1_TAC; DISJ2_TAC] THEN + ASM_MESON_TAC[ring_multsys; RING_MUL_RZERO; RING_1]);; + (* ------------------------------------------------------------------------- *) (* Special types of ideal, hence PID and Noetherian rings. *) (* ------------------------------------------------------------------------- *) @@ -12690,6 +12714,196 @@ let PID_EQ_UFD_PRIME_MAXIMAL = prove ASM_SIMP_TAC[IDEAL_GENERATED_MINIMAL_EQ; PRIME_IMP_RING_IDEAL] THEN ASM SET_TAC[]);; +(* Multiplying frac(b) by a/b gives frac(a) *) + +let LOCALEQUIV_MUL_CANCEL = prove + (`!r s a b:A. + ring_multsys r s /\ a IN ring_carrier r /\ b IN s + ==> ring_mul (ring_localization r s) (ring_fractionate r s b) + (ring_localequiv r s (a,b)) = ring_fractionate r s a`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(b:A) IN ring_carrier r /\ ring_1 r IN s` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_multsys; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[ring_fractionate] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_MUL; RING_MUL_LID; + GSYM RING_LOCALEQUIV_EQUIV; RING_MUL] THEN + REWRITE_TAC[ring_localequiv] THEN ASM_SIMP_TAC[RING_1; RING_MUL] THEN + EXISTS_TAC `ring_1 r:A` THEN ASM_REWRITE_TAC[] THEN + RING_TAC THEN ASM_SIMP_TAC[]);; + +(* If p divides a in r, frac(p) divides a/b *) + +let RING_DIVIDES_LOCALEQUIV = prove + (`!r s p a b:A. + ring_multsys r s /\ ring_divides r p a /\ b IN s + ==> ring_divides (ring_localization r s) + (ring_fractionate r s p) (ring_localequiv r s (a,b))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [ring_divides]) THEN + REWRITE_TAC[ring_divides] THEN + SUBGOAL_THEN `(b:A) IN ring_carrier r /\ ring_1 r IN s` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_multsys; SUBSET]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_FRACTIONATE_IN_CARRIER; RING_LOCALEQUIV_IN_CARRIER] THEN + EXISTS_TAC `ring_localequiv r s (x:A,b)` THEN + ASM_SIMP_TAC[RING_LOCALEQUIV_IN_CARRIER] THEN + REWRITE_TAC[ring_fractionate] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_MUL; RING_MUL_LID; RING_1; + GSYM RING_LOCALEQUIV_EQUIV; RING_MUL] THEN + REWRITE_TAC[ring_localequiv] THEN ASM_SIMP_TAC[RING_MUL; RING_1] THEN + EXISTS_TAC `ring_1 r:A` THEN ASM_REWRITE_TAC[] THEN + RING_TAC THEN ASM_SIMP_TAC[]);; + +(* Localization of a UFD is a UFD *) + +let UFD_LOCALIZATION = prove + (`!r s:A->bool. + UFD r /\ ring_multsys r s /\ ~(ring_0 r IN s) + ==> UFD (ring_localization r s)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `integral_domain (r:A ring)` ASSUME_TAC THENL + [ASM_MESON_TAC[UFD]; ALL_TAC] THEN + REWRITE_TAC[UFD] THEN CONJ_TAC THENL + [ASM_SIMP_TAC[INTEGRAL_DOMAIN_LOCALIZATION]; ALL_TAC] THEN + X_GEN_TAC `j:((A#A->bool)->bool)` THEN STRIP_TAC THEN + ABBREV_TAC `jj = {x:A | x IN ring_carrier r /\ + ring_fractionate r s x IN j}` THEN + SUBGOAL_THEN `prime_ideal (r:A ring) jj` ASSUME_TAC THENL + [EXPAND_TAC "jj" THEN + MP_TAC(ISPECL [`r:A ring`; `ring_localization r (s:A->bool)`; + `ring_fractionate r (s:A->bool)`; `j:(A#A->bool)->bool`] + PRIME_IDEAL_HOMOMORPHIC_PREIMAGE) THEN + ASM_SIMP_TAC[RING_HOMOMORPHISM_FRACTIONATE]; + ALL_TAC] THEN + SUBGOAL_THEN `~(jj = {ring_0 (r:A ring)})` ASSUME_TAC THENL + [DISCH_TAC THEN + SUBGOAL_THEN + `(j:(A#A->bool)->bool) = + {ring_0 (ring_localization r (s:A->bool))}` + (fun th -> ASM_MESON_TAC[th]) THEN + ONCE_REWRITE_TAC[EXTENSION] THEN REWRITE_TAC[IN_SING] THEN + X_GEN_TAC `y:(A#A->bool)` THEN EQ_TAC THENL + [DISCH_TAC THEN + SUBGOAL_THEN + `y IN ring_carrier (ring_localization r (s:A->bool))` MP_TAC THENL + [ASM_MESON_TAC[PRIME_IDEAL_IMP_SUBSET; SUBSET]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_CARRIER] THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `a0:A` + (X_CHOOSE_THEN `b0:A` STRIP_ASSUME_TAC)) THEN + SUBGOAL_THEN `a0 = ring_0 (r:A ring)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `a0:A` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + EXPAND_TAC "jj" THEN REWRITE_TAC[IN_ELIM_THM; IN_SING] THEN + ASM_MESON_TAC[LOCALEQUIV_MUL_CANCEL; IN_RING_IDEAL_LMUL; + PRIME_IMP_RING_IDEAL; RING_FRACTIONATE_IN_CARRIER; + ring_multsys; SUBSET]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[RING_LOCALEQUIV_EQ_0_GEN; RING_0] THEN + ASM_MESON_TAC[ring_multsys; RING_MUL_RZERO; RING_1]; + DISCH_THEN SUBST1_TAC THEN + ASM_MESON_TAC[IN_RING_IDEAL_0; PRIME_IMP_RING_IDEAL]]; + ALL_TAC] THEN + SUBGOAL_THEN `?(p:A). ring_prime r p /\ p IN jj` + (X_CHOOSE_THEN `p:A` STRIP_ASSUME_TAC) THENL + [ASM_MESON_TAC[UFD]; ALL_TAC] THEN + SUBGOAL_THEN `ring_fractionate r (s:A->bool) p IN j` ASSUME_TAC THENL + [EXPAND_TAC "jj" THEN ASM SET_TAC[]; ALL_TAC] THEN + EXISTS_TAC `ring_fractionate r (s:A->bool) p` THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[ring_prime] THEN + REPEAT CONJ_TAC THENL + [ASM_SIMP_TAC[RING_FRACTIONATE_IN_CARRIER; RING_PRIME_IN_CARRIER]; + ASM_SIMP_TAC[RING_FRACTIONATE_EQ_0_GEN; RING_PRIME_IN_CARRIER] THEN + ASM_MESON_TAC[integral_domain; ring_prime; ring_multsys; SUBSET]; + ASM_MESON_TAC[RING_UNIT_NOT_IN_PRIME_IDEAL]; + ALL_TAC] THEN + SUBGOAL_THEN `(p:A) IN ring_carrier r /\ ring_1 r IN (s:A->bool)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime; ring_multsys]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_CARRIER] THEN + REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM; FORALL_IN_GSPEC] THEN + X_GEN_TAC `x1:A` THEN DISCH_TAC THEN X_GEN_TAC `s1:A` THEN DISCH_TAC THEN + X_GEN_TAC `x2:A` THEN DISCH_TAC THEN X_GEN_TAC `s2:A` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(s1:A) IN ring_carrier r /\ s2 IN ring_carrier r /\ + ring_mul r s1 s2 IN s` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_multsys; SUBSET]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_MUL] THEN DISCH_TAC THEN + SUBGOAL_THEN + `?dd:(A#A->bool). + dd IN ring_carrier (ring_localization r (s:A->bool)) /\ + ring_localequiv r s (ring_mul r x1 x2, ring_mul r s1 s2) = + ring_mul (ring_localization r s) (ring_fractionate r s p) dd` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_divides]; ALL_TAC] THEN + SUBGOAL_THEN + `?x3:A. ?s3:A. x3 IN ring_carrier r /\ s3 IN s /\ + s3 IN ring_carrier r /\ + dd = ring_localequiv r (s:A->bool) (x3,s3)` + STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `dd IN ring_carrier + (ring_localization r (s:A->bool))` THEN + ASM_SIMP_TAC[RING_LOCALIZATION_CARRIER] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[ring_multsys; SUBSET]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_mul (ring_localization r (s:A->bool)) (ring_fractionate r s p) dd = + ring_localequiv r s (ring_mul r p x3, s3)` ASSUME_TAC THENL + [ASM_REWRITE_TAC[ring_fractionate] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_MUL; RING_MUL_LID; RING_1; + GSYM RING_LOCALEQUIV_EQUIV; RING_MUL] THEN + REWRITE_TAC[ring_localequiv] THEN ASM_SIMP_TAC[RING_MUL; RING_1] THEN + EXISTS_TAC `ring_1 r:A` THEN ASM_REWRITE_TAC[] THEN + RING_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_localequiv r (s:A->bool) + (ring_mul r x1 x2, ring_mul r s1 s2) (ring_mul r p x3, s3)` + MP_TAC THENL + [ASM_SIMP_TAC[RING_LOCALEQUIV_EQUIV; RING_MUL] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[ring_localequiv] THEN ASM_SIMP_TAC[RING_MUL] THEN + DISCH_THEN(X_CHOOSE_THEN `u:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(u:A) IN ring_carrier r /\ ~(u = ring_0 (r:A ring))` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_multsys; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_mul r (ring_mul r (x1:A) x2) s3 = + ring_mul r (ring_mul r p x3) (ring_mul r s1 s2)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `u:A`; + `ring_sub r (ring_mul r (ring_mul r (x1:A) x2) s3) + (ring_mul r (ring_mul r p x3) (ring_mul r s1 s2))`] + INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ASM_SIMP_TAC[RING_MUL; RING_SUB; RING_SUB_EQ_0] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides r (p:A) (ring_mul r (ring_mul r x1 x2) s3)` + ASSUME_TAC THENL + [ASM_MESON_TAC[ring_divides; RING_MUL_ASSOC; RING_MUL]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides r (p:A) (ring_mul r x1 x2) \/ ring_divides r p s3` + MP_TAC THENL + [ASM_MESON_TAC[RING_PRIME_DIVIDES_MUL; RING_MUL]; ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL + [SUBGOAL_THEN `ring_divides r (p:A) x1 \/ ring_divides r p x2` + MP_TAC THENL + [ASM_MESON_TAC[RING_PRIME_DIVIDES_MUL]; ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL [DISJ1_TAC; DISJ2_TAC] THEN + MATCH_MP_TAC RING_DIVIDES_LOCALEQUIV THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISJ1_TAC THEN + SUBGOAL_THEN + `ring_divides (ring_localization r (s:A->bool)) + (ring_fractionate r s p) (ring_fractionate r s s3)` + (fun th -> ASM_MESON_TAC[th; RING_UNIT_FRACTIONATE; + RING_UNIT_DIVISOR; RING_UNIT_DIVIDES_ANY; + RING_LOCALEQUIV_IN_CARRIER]) THEN + MATCH_MP_TAC RING_DIVIDES_HOMOMORPHIC_IMAGE THEN + EXISTS_TAC `r:A ring` THEN ASM_SIMP_TAC[RING_HOMOMORPHISM_FRACTIONATE]);; + (* ------------------------------------------------------------------------- *) (* Euclidean rings. *) (* ------------------------------------------------------------------------- *) @@ -15985,6 +16199,20 @@ let MONOMIAL_DEG_UNIVARIATE = prove GEN_TAC THEN REWRITE_TAC[monomial_deg; MONOMIAL_VARS_UNIVARIATE] THEN COND_CASES_TAC THEN ASM_REWRITE_TAC[NSUM_CLAUSES; NSUM_SING]);; +let MONOMIAL_MUL_VAR_ONE = prove + (`!n. monomial_mul (monomial_var (one:1)) (\v:1. n) = (\v:1. n + 1)`, + GEN_TAC THEN + REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM; monomial_mul; + monomial_var] THEN + ARITH_TAC);; + +let MONOMIAL_DEG_ONE = prove + (`!m:1->num. monomial_deg m = m one`, + GEN_TAC THEN + SUBGOAL_THEN `m:1->num = (\v:1. m one)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; + REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE]]);; + (* ------------------------------------------------------------------------- *) (* General power series / polynomial sets and operations. *) (* *) @@ -16086,6 +16314,11 @@ let RING_POWERSERIES_1 = prove (`!r. ring_powerseries r (poly_1 r:(V->num)->A)`, REWRITE_TAC[poly_1; RING_POWERSERIES_CONST; RING_1]);; +let POLY_VAR_MONOMIAL_1 = prove + (`!(r:A ring) (v:V). + (poly_var r v:(V->num)->A) monomial_1 = ring_0 r`, + REWRITE_TAC[poly_var; MONOMIAL_VAR_1]);; + let RING_POWERSERIES_NEG = prove (`!r (p:(V->num)->A). ring_powerseries r p ==> ring_powerseries r (poly_neg r p)`, @@ -17237,6 +17470,12 @@ let POLY_MONOMIALS = prove ==> monomial s m`, REWRITE_TAC[RING_CARRIER_POLY_RING; IN_ELIM_THM] THEN MESON_TAC[]);; +let POLY_MONOMIALS_ALT = prove + (`!(r:A ring) (t:V->bool) q m. + q IN ring_carrier(poly_ring r t) /\ ~(monomial t m) + ==> q m = ring_0 r`, + MESON_TAC[POLY_MONOMIALS]);; + let POWSER_RING_EQ = prove (`!(r:A ring) (s:V->bool) p q. p IN ring_carrier(powser_ring r s) /\ @@ -19010,6 +19249,83 @@ let RING_POWERSERIES_REINDEX = prove MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] FINITE_SUBSET) THEN REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN ASM SET_TAC[]);; +(* Identity is a ring homomorphism for subset variable sets *) +let POLY_RING_HOMOMORPHISM_I = prove + (`!(r:A ring) (t:V->bool) s. + t SUBSET s + ==> ring_homomorphism (poly_ring r t,poly_ring r s) I`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[ring_homomorphism; I_THM; POLY_RING; + IMAGE; SUBSET; IN_ELIM_THM] THEN + ASM SET_TAC[]);; + +(* If c divides every coefficient of p, then poly_const(c) | p *) + +let POLY_CONST_DIVIDES_COEFFS = prove + (`!(r:A ring) (s:V->bool) c (p:(V->num)->A). + integral_domain r /\ c IN ring_carrier r /\ ~(c = ring_0 r) /\ + p IN ring_carrier(poly_ring r s) /\ (!m. ring_divides r c (p m)) + ==> ring_divides (poly_ring r s) (poly_const r c) p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[ring_divides] THEN + ASM_REWRITE_TAC[POLY_CONST] THEN + SUBGOAL_THEN `ring_polynomial r (p:(V->num)->A) /\ + poly_vars r p SUBSET (s:V->bool)` STRIP_ASSUME_TAC THENL + [ASM_REWRITE_TAC[GSYM IN_POLY_RING_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN `!m:V->num. ?d:A. d IN ring_carrier r /\ + (p:(V->num)->A) m = ring_mul r c d` MP_TAC THENL + [ASM_MESON_TAC[ring_divides]; ALL_TAC] THEN + REWRITE_TAC[SKOLEM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `q:(V->num)->A` + (STRIP_ASSUME_TAC o REWRITE_RULE[FORALL_AND_THM])) THEN + EXISTS_TAC `q:(V->num)->A` THEN + SUBGOAL_THEN `!m:V->num. (p:(V->num)->A) m = ring_0 r + ==> (q:(V->num)->A) m = ring_0 r` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_MUL_EQ_0]; ALL_TAC] THEN + SUBGOAL_THEN `ring_polynomial r (q:(V->num)->A)` ASSUME_TAC THENL + [REWRITE_TAC[ring_polynomial; ring_powerseries] THEN + REPEAT CONJ_TAC THEN + TRY(ASM_MESON_TAC[ring_polynomial; ring_powerseries]) THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{m:V->num | ~((p:(V->num)->A) m = ring_0 r)}` THEN + CONJ_TAC THENL + [ASM_MESON_TAC[ring_polynomial]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + ALL_TAC] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[POLY_RING_CLAUSES; IN_ELIM_THM] THEN + REWRITE_TAC[poly_vars; UNIONS_SUBSET; FORALL_IN_GSPEC] THEN + RULE_ASSUM_TAC(REWRITE_RULE + [poly_vars; UNIONS_SUBSET; FORALL_IN_GSPEC]) THEN + ASM_MESON_TAC[]; + ASM_SIMP_TAC[POLY_RING_CLAUSES; POLY_MUL_CONST] THEN + REWRITE_TAC[FUN_EQ_THM] THEN ASM_MESON_TAC[]]);; + +let POLY_CONST_DIVIDES_COEFFS_REV = prove + (`!(r:A ring) (s:V->bool) c (p:(V->num)->A) m. + c IN ring_carrier r /\ p IN ring_carrier(poly_ring r s) /\ + ring_divides (poly_ring r s) (poly_const r c) p + ==> ring_divides r c (p m)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [ring_divides]) THEN + SUBGOAL_THEN `ring_polynomial r (x:(V->num)->A) /\ + ring_polynomial r (p:(V->num)->A)` STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!m:V->num. (p:(V->num)->A) m = + ring_mul r c ((x:(V->num)->A) m)` ASSUME_TAC THENL + [ASM_SIMP_TAC[POLY_RING_CLAUSES; POLY_MUL_CONST]; ALL_TAC] THEN + ASM_MESON_TAC[ring_divides; ring_polynomial; ring_powerseries]);; + +let POLY_CONST_DIVIDES_COEFFS_EQ = prove + (`!(r:A ring) (s:V->bool) c (p:(V->num)->A). + integral_domain r /\ c IN ring_carrier r /\ + ~(c = ring_0 r) /\ + p IN ring_carrier(poly_ring r s) + ==> (ring_divides (poly_ring r s) (poly_const r c) p <=> + !m. ring_divides r c (p m))`, + MESON_TAC[POLY_CONST_DIVIDES_COEFFS; POLY_CONST_DIVIDES_COEFFS_REV]);; + (* ------------------------------------------------------------------------- *) (* Monomial divisibility is a partial order, and on a *finite* set of *) (* variables any preorder extending it (in particular a "compatible" one) *) @@ -19701,6 +20017,202 @@ let WOSET_MONOMIAL_LE = prove ONCE_REWRITE_TAC[GSYM MONOMIAL_LT_PROPERLY] THEN MATCH_MP_TAC WF_MONOMIAL_LT THEN ASM_MESON_TAC[WOSET_WF]]);; +(* ------------------------------------------------------------------------- *) +(* Lemmas about functions out of the 1-element type *) +(* ------------------------------------------------------------------------- *) + +let EXISTS_FUN_FROM_1 = prove + (`!P. (?f. P (f one) f) <=> (?z:A. P z (\v. z))`, + GEN_TAC THEN EQ_TAC THEN STRIP_TAC THENL + [EXISTS_TAC `(f:1->A) one`; EXISTS_TAC `(\v. z):1->A`] THEN + ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN MATCH_MP_TAC EQ_IMP THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN MESON_TAC[one]);; + +let FORALL_FUN_FROM_1 = prove + (`!P. (!f. P (f one) f) <=> (!z:A. P z (\v. z))`, + GEN_TAC THEN GEN_REWRITE_TAC I [TAUT `(p <=> q) <=> (~p <=> ~q)`] THEN + REWRITE_TAC[NOT_FORALL_THM; EXISTS_FUN_FROM_1]);; + +let LAMBDA_1_EQ = prove + (`(\v:1. a:A) = (\v. b) <=> a = b`, + REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]);; + +let FINITE_FUN_FROM_1 = prove + (`!P. FINITE {m:1->num | P m} <=> FINITE {d:num | P(\v:1. d)}`, + GEN_TAC THEN EQ_TAC THEN DISCH_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\(m:1->num). m one) {m | P m}` THEN + ASM_SIMP_TAC[FINITE_IMAGE] THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `d:num` THEN DISCH_TAC THEN + EXISTS_TAC `(\v:1. d):1->num` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\(d:num) (v:1). d) {d | P(\v:1. d)}` THEN + ASM_SIMP_TAC[FINITE_IMAGE] THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `m:1->num` THEN DISCH_TAC THEN + EXISTS_TAC `(m:1->num) one` THEN + SUBGOAL_THEN `(\v:1. (m:1->num) one) = m` + (fun th -> ASM_REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]]);; + +(* ------------------------------------------------------------------------- *) +(* Univariate polynomial coefficient accessor: coeff *) +(* ------------------------------------------------------------------------- *) + +let coeff = new_definition + `coeff = \i (p:(1->num)->A). p(\v:1. i)`;; + +let COEFF = prove + (`!i (p:(1->num)->A). coeff i p = p(\v:1. i)`, + REWRITE_TAC[coeff]);; + +let FUN_EQ_COEFF = prove + (`!(p:(1->num)->A) q. (!d. coeff d p = coeff d q) <=> p = q`, + REPEAT GEN_TAC THEN EQ_TAC THENL + [REWRITE_TAC[coeff] THEN DISCH_TAC THEN + REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `m:1->num` THEN + SUBGOAL_THEN `m:1->num = (\v:1. (m:1->num) one)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; ASM_REWRITE_TAC[]]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[]]);; + +let COEFF_POLY_CONST = prove + (`!r c d. coeff d (poly_const r c :(1->num)->A) = + if d = 0 then c else ring_0 r`, + REWRITE_TAC[coeff; poly_const; monomial_1; LAMBDA_1_EQ]);; + +let COEFF_POLY_0 = prove + (`!r d. coeff d (poly_0 r :(1->num)->A) = ring_0 r`, + REWRITE_TAC[poly_0; COEFF_POLY_CONST; COND_ID]);; + +let COEFF_POLY_1 = prove + (`!r d. coeff d (poly_1 r :(1->num)->A) = + if d = 0 then ring_1 r else ring_0 r`, + REWRITE_TAC[poly_1; COEFF_POLY_CONST]);; + +let COEFF_POLY_NEG = prove + (`!r p d. coeff d (poly_neg r p :(1->num)->A) = ring_neg r (coeff d p)`, + REWRITE_TAC[coeff; poly_neg]);; + +let COEFF_POLY_ADD = prove + (`!r p q d. coeff d (poly_add r p q :(1->num)->A) = + ring_add r (coeff d p) (coeff d q)`, + REWRITE_TAC[coeff; poly_add]);; + +let COEFF_POLY_SUB = prove + (`!r p q d. coeff d (poly_sub r p q :(1->num)->A) = + ring_sub r (coeff d p) (coeff d q)`, + REWRITE_TAC[coeff; poly_sub]);; + +let COEFF_POLY_MUL = prove + (`!r p q d. coeff d (poly_mul r p q :(1->num)->A) = + ring_sum r (0..d) + (\a. ring_mul r (coeff a p) (coeff (d - a) q))`, + REPEAT GEN_TAC THEN REWRITE_TAC[coeff; poly_mul] THEN + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC RING_SUM_EQ_GENERAL_INVERSES THEN + EXISTS_TAC `\a:num. ((\v:1. a):1->num, (\v:1. d - a):1->num)` THEN + EXISTS_TAC `\(m1:1->num, m2:1->num). (m1:1->num) one` THEN + REWRITE_TAC[FORALL_IN_GSPEC; IN_NUMSEG; LE_0] THEN + CONJ_TAC THENL + [MAP_EVERY X_GEN_TAC [`m1:1->num`; `m2:1->num`] THEN + REWRITE_TAC[monomial_mul] THEN DISCH_TAC THEN CONJ_TAC THENL + [SUBGOAL_THEN `(m1:1->num) one + (m2:1->num) one = d` + (fun th -> MESON_TAC[th; LE_ADD]) THEN + FIRST_X_ASSUM(MP_TAC o C AP_THM `one:1`) THEN + REWRITE_TAC[]; + REWRITE_TAC[PAIR_EQ] THEN CONJ_TAC THEN + REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM] THEN + FIRST_X_ASSUM(MP_TAC o C AP_THM `one:1`) THEN + REWRITE_TAC[] THEN ARITH_TAC]; + X_GEN_TAC `a:num` THEN DISCH_TAC THEN + REWRITE_TAC[IN_ELIM_PAIR_THM; monomial_mul; + PAIR_EQ; FUN_EQ_THM; FORALL_ONE_THM] THEN + REPEAT CONJ_TAC THEN TRY(ASM_ARITH_TAC) THEN + CONV_TAC(ONCE_DEPTH_CONV GEN_BETA_CONV) THEN REFL_TAC]);; + +let POLY_MUL_UNIVARIATE = prove + (`!r (p:(1->num)->R) q. + poly_mul r p q = + \m. ring_sum r (0..m one) + (\i. ring_mul r (coeff i p) (coeff (m one - i) q))`, + REPEAT GEN_TAC THEN + GEN_REWRITE_TAC I [FUN_EQ_THM] THEN + X_GEN_TAC `m:1->num` THEN REWRITE_TAC[] THEN + SUBGOAL_THEN `m:1->num = (\v:1. m one)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; ALL_TAC] THEN + REWRITE_TAC[GSYM COEFF; COEFF_POLY_MUL]);; + +let RING_POWERSERIES_COEFF = prove + (`!r (p:(1->num)->A). + ring_powerseries r p <=> (!d. coeff d p IN ring_carrier r)`, + REPEAT GEN_TAC THEN REWRITE_TAC[ring_powerseries; coeff] THEN EQ_TAC THENL + [SIMP_TAC[]; + DISCH_TAC THEN CONJ_TAC THENL + [X_GEN_TAC `m:1->num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(m:1->num) one`) THEN + MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; + MESON_TAC[FINITE_MONOMIAL_VARS_1; INFINITE]]]);; + +let COEFF_IN_CARRIER = prove + (`!r (p:(1->num)->A) d. + ring_powerseries r p ==> coeff d p IN ring_carrier r`, + SIMP_TAC[RING_POWERSERIES_COEFF]);; + +let COEFF_IN_CARRIER_ALT = prove + (`!r (p:(1->num)->A) d. + ring_polynomial r p ==> coeff d p IN ring_carrier r`, + MESON_TAC[COEFF_IN_CARRIER; ring_polynomial]);; + +let RING_POLYNOMIAL_COEFF = prove + (`!r (p:(1->num)->A). + ring_polynomial r p <=> + (!d. coeff d p IN ring_carrier r) /\ + FINITE {d | ~(coeff d p = ring_0 r)}`, + REPEAT GEN_TAC THEN + REWRITE_TAC[ring_polynomial; RING_POWERSERIES_COEFF] THEN + AP_TERM_TAC THEN REWRITE_TAC[coeff] THEN + ONCE_REWRITE_TAC[GSYM FINITE_FUN_FROM_1] THEN + REFL_TAC);; + +let RING_POLYNOMIAL_SUBRING_COEFF = prove + (`!r G (p:(1->num)->A). + ring_polynomial r p /\ + (!d. coeff d p IN ring_carrier(subring_generated r G)) + ==> ring_polynomial (subring_generated r G) p`, + REPEAT GEN_TAC THEN REWRITE_TAC[RING_POLYNOMIAL_COEFF] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[SUBRING_GENERATED]);; + +let FINITE_COEFF_SUPPORT = prove + (`!r (p:(1->num)->A). + ring_polynomial r p ==> FINITE {d | ~(coeff d p = ring_0 r)}`, + SIMP_TAC[RING_POLYNOMIAL_COEFF]);; + +let RING_POLYNOMIAL_COEFF_BOUND = prove + (`!r (p:(1->num)->A) n. + ring_powerseries r p /\ + (!d. ~(coeff d p = ring_0 r) ==> d <= n) + ==> ring_polynomial r p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[RING_POLYNOMIAL_COEFF] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[RING_POWERSERIES_COEFF]; + MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `{d:num | d <= n}` THEN + REWRITE_TAC[FINITE_NUMSEG_LE; SUBSET; IN_ELIM_THM] THEN + ASM_MESON_TAC[]]);; + +let RING_POLYNOMIAL_COEFF_ZERO_FROM = prove + (`!r (p:(1->num)->A) n. + ring_powerseries r p /\ + (!d. n <= d ==> coeff d p = ring_0 r) + ==> ring_polynomial r p`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC RING_POLYNOMIAL_COEFF_BOUND THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `d:num` THEN DISCH_TAC THEN + ASM_CASES_TAC `n <= d:num` THENL + [UNDISCH_TAC `~(coeff d (p:(1->num)->A) = ring_0 r)` THEN ASM_SIMP_TAC[]; + POP_ASSUM MP_TAC THEN ARITH_TAC]);; + (* ------------------------------------------------------------------------- *) (* Degree (multidegree, total degree in multivariate case) of polynomial. *) (* ------------------------------------------------------------------------- *) @@ -19869,6 +20381,101 @@ let POLY_DEG_VAR = prove ASM_SIMP_TAC[LE_REFL; COND_RAND; COND_RATOR; MONOMIAL_DEG_VAR] THEN MESON_TAC[]);; +let COEFF_NONZERO_LE_DEG = prove + (`!r (p:(1->num)->A) d. + ring_polynomial r p /\ ~(coeff d p = ring_0 r) + ==> d <= poly_deg r p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `monomial_deg (\v:1. d) <= poly_deg r (p:(1->num)->A)` MP_TAC THENL + [MATCH_MP_TAC MONOMIAL_DEG_LE_POLY_DEG THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~(coeff d (p:(1->num)->A) = ring_0 r)` THEN REWRITE_TAC[coeff]; + REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE]]);; + +let COEFF_NONZERO_LE = prove + (`!r (p:(1->num)->A) n d. + ring_polynomial r p /\ poly_deg r p <= n /\ + ~(coeff d p = ring_0 r) + ==> d <= n`, + MESON_TAC[COEFF_NONZERO_LE_DEG; LE_TRANS]);; + +let POLY_DEG_LE_COEFF = prove + (`!r (p:(1->num)->A) n. + ring_powerseries r p /\ + (!d. ~(coeff d p = ring_0 r) ==> d <= n) + ==> poly_deg r p <= n`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `ring_polynomial r (p:(1->num)->A)` ASSUME_TAC THENL + [MATCH_MP_TAC RING_POLYNOMIAL_COEFF_BOUND THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC POLY_DEG_LE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `m:1->num` THEN DISCH_TAC THEN + REWRITE_TAC[MONOMIAL_DEG_ONE] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + UNDISCH_TAC `~((p:(1->num)->A) m = ring_0 r)` THEN + SUBGOAL_THEN `(m:1->num) = (\v:1. m one)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; + REWRITE_TAC[coeff]]);; + +let POLY_DEG_EQ_COEFF = prove + (`!r (p:(1->num)->A) n. + ring_powerseries r p /\ + (!d. ~(coeff d p = ring_0 r) ==> d <= n) /\ + ~(coeff n p = ring_0 r) + ==> poly_deg r p = n`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `ring_polynomial r (p:(1->num)->A)` ASSUME_TAC THENL + [MATCH_MP_TAC RING_POLYNOMIAL_COEFF_BOUND THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC POLY_DEG_UNIQUE THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `m:1->num` THEN DISCH_TAC THEN + REWRITE_TAC[MONOMIAL_DEG_ONE] THEN + FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[coeff]) THEN + UNDISCH_TAC `~((p:(1->num)->A) m = ring_0 r)` THEN + SUBGOAL_THEN `(m:1->num) = (\v:1. m one)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; FORALL_ONE_THM]; REWRITE_TAC[coeff]]; + ASM_CASES_TAC `n = 0` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `(\v:1. n):1->num` THEN + REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE] THEN + UNDISCH_TAC `~(coeff n (p:(1->num)->A) = ring_0 r)` THEN + REWRITE_TAC[coeff]]);; + +let POLY_DEG_EQ_COEFF_FROM_LE = prove + (`!r (p:(1->num)->A) n. + ring_polynomial r p /\ + poly_deg r p <= n /\ + ~(coeff n p = ring_0 r) + ==> poly_deg r p = n`, + REPEAT STRIP_TAC THEN + GEN_REWRITE_TAC I [GSYM LE_ANTISYM] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC COEFF_NONZERO_LE_DEG THEN ASM_REWRITE_TAC[]);; + +let COEFF_POLY_SUM = prove + (`!r (p:K->(1->num)->A) d (s:K->bool). + FINITE s /\ (!x. x IN s ==> ring_powerseries r (p x)) + ==> coeff d (ring_sum (powser_ring r (:1)) s p) = + ring_sum r s (\x. coeff d (p x))`, + REPLICATE_TAC 3 GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [REWRITE_TAC[RING_SUM_CLAUSES; POWSER_RING; COEFF_POLY_0]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`y:K`; `t:K->bool`] THEN + STRIP_TAC THEN REWRITE_TAC[IN_INSERT] THEN STRIP_TAC THEN + SUBGOAL_THEN `ring_powerseries r ((p:K->(1->num)->A) y)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!z:K. z IN t ==> ring_powerseries r ((p:K->(1->num)->A) z)` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(p:K->(1->num)->A) y IN ring_carrier(powser_ring r (:1))` + ASSUME_TAC THENL + [REWRITE_TAC[POWSER_RING; IN_ELIM_THM; SUBSET_UNIV] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `coeff d ((p:K->(1->num)->A) y) IN ring_carrier r` + ASSUME_TAC THENL + [ASM_MESON_TAC[COEFF_IN_CARRIER]; ALL_TAC] THEN + ASM_SIMP_TAC[RING_SUM_CLAUSES; POWSER_RING; COEFF_POLY_ADD]);; + let POLY_DEG_NEG = prove (`!r (p:(V->num)->A). ring_polynomial r p ==> poly_deg r (poly_neg r p) = poly_deg r p`, @@ -20524,18 +21131,6 @@ let POLY_EVALUATE_REINDEX = prove (* Same for univariate polynomials with simpler interface *) (* ------------------------------------------------------------------------- *) -let EXISTS_FUN_FROM_1 = prove - (`!P. (?f. P (f one) f) <=> (?z:A. P z (\v. z))`, - GEN_TAC THEN EQ_TAC THEN STRIP_TAC THENL - [EXISTS_TAC `(f:1->A) one`; EXISTS_TAC `(\v. z):1->A`] THEN - ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN MATCH_MP_TAC EQ_IMP THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN MESON_TAC[one]);; - -let FORALL_FUN_FROM_1 = prove - (`!P. (!f. P (f one) f) <=> (!z:A. P z (\v. z))`, - GEN_TAC THEN GEN_REWRITE_TAC I [TAUT `(p <=> q) <=> (~p <=> ~q)`] THEN - REWRITE_TAC[NOT_FORALL_THM; EXISTS_FUN_FROM_1]);; - let poly_eval = new_definition `poly_eval (r:A ring) p x = poly_evaluate r p (\v:1. x)`;; @@ -20632,7 +21227,8 @@ let POLY_EXTEND_UNIVARIATE = prove p IN ring_carrier (poly_ring r (:1)) ==> poly_extend (r,r') h x p = ring_sum r' (0..poly_deg r p) - (\i. ring_mul r' (h(p(\v. i))) (ring_pow r' (x one) i))`, + (\i. ring_mul r' (h(coeff i p)) (ring_pow r' (x one) i))`, + REWRITE_TAC[coeff] THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC(MESON[RING_SUM_SUPERSET] `!t. t SUBSET s /\ (!x. x IN s /\ ~(x IN t) ==> f x = ring_0 r) /\ ring_sum r t f = p @@ -20663,7 +21259,7 @@ let POLY_EVAL_EXPAND = prove p IN ring_carrier (poly_ring r (:1)) ==> poly_eval r p x = ring_sum r (0..poly_deg r p) - (\i. ring_mul r (p(\v. i)) (ring_pow r x i))`, + (\i. ring_mul r (coeff i p) (ring_pow r x i))`, REPEAT STRIP_TAC THEN REWRITE_TAC[poly_eval; poly_evaluate] THEN ASM_SIMP_TAC[RING_HOMOMORPHISM_I; I_THM; POLY_EXTEND_UNIVARIATE]);; @@ -20673,7 +21269,7 @@ let POLY_EXPAND = prove ==> p = ring_sum (poly_ring r (:1)) (0..poly_deg r p) (\i. ring_mul (poly_ring r (:1)) - (poly_const r (p(\v. i))) + (poly_const r (coeff i p)) (ring_pow (poly_ring r (:1)) (poly_var r one) i))`, REPEAT STRIP_TAC THEN MP_TAC(ISPECL [`r:A ring`; `(:1)`; `p:(1->num)->A`] POLY_EXTEND_ID) THEN @@ -20685,10 +21281,77 @@ let POLY_EXPAND = prove let POLY_EVAL_AT_0 = prove (`!(r:A ring) p. p IN ring_carrier (poly_ring r (:1)) - ==> poly_eval r p (ring_0 r) = p (\v. 0)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[poly_eval; GSYM monomial_1] THEN + ==> poly_eval r p (ring_0 r) = coeff 0 p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[coeff; poly_eval; GSYM monomial_1] THEN ASM_MESON_TAC[POLY_EVALUATE_AT_0]);; +let COEFF_POLY_CONST_MUL = prove + (`!r c (p:(1->num)->A) d. + c IN ring_carrier r /\ ring_powerseries r p + ==> coeff d (poly_mul r (poly_const r c) p) = + ring_mul r c (coeff d p)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[COEFF_POLY_MUL; COEFF_POLY_CONST] THEN + SUBGOAL_THEN + `!a. ring_mul r (if a = 0 then c else ring_0 r) + (coeff (d - a) (p:(1->num)->A)) = + if a = 0 then ring_mul r c (coeff d p) else ring_0 r` + (fun th -> REWRITE_TAC[th]) THENL + [X_GEN_TAC `a:num` THEN COND_CASES_TAC THEN + ASM_REWRITE_TAC[SUB_0] THEN + MATCH_MP_TAC RING_MUL_LZERO THEN + ASM_SIMP_TAC[COEFF_IN_CARRIER]; + REWRITE_TAC[RING_SUM_DELTA; IN_NUMSEG; LE_0] THEN + ASM_SIMP_TAC[RING_MUL; COEFF_IN_CARRIER; + RING_POWERSERIES_COEFF]]);; + +let COEFF_POLY_MUL_CONST = prove + (`!r c (p:(1->num)->A) d. + c IN ring_carrier r /\ ring_powerseries r p + ==> coeff d (poly_mul r p (poly_const r c)) = + ring_mul r c (coeff d p)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `poly_mul r (p:(1->num)->A) (poly_const r c) = + poly_mul r (poly_const r c) p` + SUBST1_TAC THENL + [MATCH_MP_TAC POLY_MUL_SYM THEN + ASM_SIMP_TAC[RING_POWERSERIES_CONST]; + ASM_SIMP_TAC[COEFF_POLY_CONST_MUL]]);; + +let POLY_EVAL_COEFF = prove + (`!r (p:(1->num)->A) x n. + ring_polynomial r p /\ + x IN ring_carrier r /\ + poly_deg r p <= n + ==> poly_eval r p x = + ring_sum r (0..n) + (\d. ring_mul r (coeff d p) (ring_pow r x d))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(p:(1->num)->A) IN ring_carrier(poly_ring r (:1))` + ASSUME_TAC THENL + [REWRITE_TAC[POLY_RING; IN_ELIM_THM; SUBSET_UNIV] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_eval r (p:(1->num)->A) x = + ring_sum r (0..poly_deg r p) + (\i. ring_mul r (coeff i p) (ring_pow r x i))` + SUBST1_TAC THENL + [MATCH_MP_TAC POLY_EVAL_EXPAND THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC(GSYM RING_SUM_SUPERSET) THEN + REWRITE_TAC[SUBSET_NUMSEG; LE_REFL; LE_0] THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN + REWRITE_TAC[IN_NUMSEG; LE_0; DE_MORGAN_THM; NOT_LE] THEN + STRIP_TAC THEN CONV_TAC SYM_CONV THEN + SUBGOAL_THEN `coeff i (p:(1->num)->A) = ring_0 r` SUBST1_TAC THENL + [ASM_CASES_TAC `coeff i (p:(1->num)->A) = ring_0 r` THENL + [ASM_REWRITE_TAC[]; + MP_TAC(SPECL [`r:A ring`; `p:(1->num)->A`; `i:num`] + COEFF_NONZERO_LE_DEG) THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]; + ASM_SIMP_TAC[RING_MUL_LZERO; RING_POW]]);; + let IMAGE_POLY_EVAL = prove (`!l k a:A. k subring_of l /\ a IN ring_carrier l @@ -21532,12 +22195,12 @@ let INFINITE_INTEGRAL_DOMAIN_POLY_EVAL_ALL_ZERO = prove let POLY_TOP_NONZERO = prove (`!r (p:(1->num)->A). p IN ring_carrier(poly_ring r (:1)) /\ ~(p = ring_0(poly_ring r (:1))) - ==> ~(p(\v. poly_deg r p) = ring_0 r)`, + ==> ~(coeff (poly_deg r p) p = ring_0 r)`, REPEAT STRIP_TAC THEN MP_TAC(ISPECL [`r:A ring`; `p:(1->num)->A`] POLY_DEG_MONOMIAL_EXISTS) THEN ASM_REWRITE_TAC[RING_POLYNOMIAL; POLY_CLAUSES; EXISTS_FUN_FROM_1] THEN ONCE_REWRITE_TAC[CONJ_SYM] THEN - ASM_REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE; UNWIND_THM2]);; + ASM_REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE; UNWIND_THM2; GSYM COEFF]);; let POLY_TOP_TAIL = prove (`!r (p:(1->num)->A). @@ -21547,12 +22210,13 @@ let POLY_TOP_TAIL = prove q = ring_0(poly_ring r (:1))) /\ ring_add (poly_ring r (:1)) (ring_mul (poly_ring r (:1)) - (poly_const r (p(\v. poly_deg r p))) + (poly_const r (coeff (poly_deg r p) p)) (ring_pow (poly_ring r (:1)) (poly_var r one) (poly_deg r p))) q = p`, REPEAT STRIP_TAC THEN ABBREV_TAC `n = poly_deg r (p:(1->num)->A)` THEN - FIRST_ASSUM(MP_TAC o SYM o MATCH_MP POLY_EXPAND) THEN ASM_REWRITE_TAC[] THEN + FIRST_ASSUM(MP_TAC o SYM o MATCH_MP POLY_EXPAND) THEN + REWRITE_TAC[coeff] THEN ASM_REWRITE_TAC[] THEN FIRST_ASSUM(ASSUME_TAC o MATCH_MP POLY_MONOMIAL_IN_CARRIER) THEN ASM_CASES_TAC `n = 0` THENL [ASM_REWRITE_TAC[NUMSEG_SING; RING_SUM_SING] THEN @@ -21578,16 +22242,35 @@ let POLY_TOP_TAIL = prove MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] LE_TRANS) THEN REWRITE_TAC[POLY_DEG_VAR_POW] THEN ASM_ARITH_TAC);; +let POLY_TOP_EQ_0 = prove + (`!r (p:(1->num)->A). + ring_polynomial r p + ==> (coeff (poly_deg r p) p = ring_0 r <=> p = poly_0 r)`, + REPEAT STRIP_TAC THEN EQ_TAC THENL + [REWRITE_TAC[coeff] THEN DISCH_TAC THEN + SUBGOAL_THEN `(p:(1->num)->A) IN ring_carrier(poly_ring r (:1))` + ASSUME_TAC THENL + [REWRITE_TAC[POLY_RING; IN_ELIM_THM; SUBSET_UNIV] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `~(p = ring_0(poly_ring r (:1)) :(1->num)->A) ==> F` + (fun th -> MESON_TAC[th; POLY_CLAUSES]) THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`r:A ring`; `p:(1->num)->A`] POLY_TOP_NONZERO) THEN + ASM_REWRITE_TAC[coeff]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[COEFF_POLY_0]]);; + let POLY_DIVISION_GEN = prove (`!(r:A ring) p d. p IN ring_carrier(poly_ring r (:1)) /\ d IN ring_carrier(poly_ring r (:1)) /\ - ring_unit r (d (\v. poly_deg r d)) + ring_unit r (coeff (poly_deg r d) d) ==> ?q t. q IN ring_carrier(poly_ring r (:1)) /\ t IN ring_carrier(poly_ring r (:1)) /\ (poly_deg r t < poly_deg r d \/ t = ring_0(poly_ring r (:1))) /\ ring_add (poly_ring r (:1)) (ring_mul (poly_ring r (:1)) q d) t = p`, + REWRITE_TAC[coeff] THEN REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 MP_TAC STRIP_ASSUME_TAC) THEN MATCH_MP_TAC(MESON[] `(!n p. poly_deg r p = n ==> p IN ring_carrier(poly_ring r u) ==> P p) @@ -21655,8 +22338,10 @@ let POLY_DIVISION_GEN = prove EXISTS_TAC `ring_add (poly_ring r (:1)) q s:(1->num)->A` THEN ASM_SIMP_TAC[RING_ADD; RING_ADD_RDISTRIB; GSYM RING_ADD_ASSOC; RING_MUL; RING_RULE `ring_add r q (ring_sub r p q) = p`]] THEN - MP_TAC(ISPECL [`r:A ring`; `p:(1->num)->A`] POLY_TOP_TAIL) THEN - MP_TAC(ISPECL [`r:A ring`; `d:(1->num)->A`] POLY_TOP_TAIL) THEN + MP_TAC(ISPECL [`r:A ring`; `p:(1->num)->A`] + (REWRITE_RULE[coeff] POLY_TOP_TAIL)) THEN + MP_TAC(ISPECL [`r:A ring`; `d:(1->num)->A`] + (REWRITE_RULE[coeff] POLY_TOP_TAIL)) THEN ASM_REWRITE_TAC[LEFT_IMP_EXISTS_THM] THEN X_GEN_TAC `s:(1->num)->A` THEN DISCH_THEN(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN @@ -21733,9 +22418,9 @@ let POLY_DIVISION = prove (ring_mul (poly_ring f (:1)) q d) t = p`, REPEAT STRIP_TAC THEN MATCH_MP_TAC POLY_DIVISION_GEN THEN FIRST_X_ASSUM(MP_TAC o - SPEC `(d:(1->num)->A) (\v. poly_deg f d)` o MATCH_MP FIELD_UNIT) THEN + SPEC `coeff (poly_deg f d) (d:(1->num)->A)` o MATCH_MP FIELD_UNIT) THEN ASM_SIMP_TAC[POLY_TOP_NONZERO] THEN - ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]);; + ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER; coeff]);; let EUCLIDEAN_POLY_RING = prove (`!(f:A ring). field f ==> euclidean_ring(poly_ring f (:1))`, @@ -21825,6 +22510,2610 @@ let POLY_DEG_1_ROOT = prove POLY_EVAL]; ALL_TAC] THEN ASM_MESON_TAC[INTEGRAL_DOMAIN_MUL_EQ_0; RING_MUL; POLY_EVAL]);; +(* ------------------------------------------------------------------------- *) +(* Gauss's lemma and preservation of the UFD property in polynomial rings. *) +(* ------------------------------------------------------------------------- *) + +(* Prime in R gives prime poly_const in R[X] *) +(* Proof: quotient map to (R/(p))[X], integral domain *) + +let RING_PRIME_POLY_CONST = prove + (`!(r:A ring) (s:V->bool) p. + integral_domain r /\ ring_prime r p + ==> ring_prime (poly_ring r s) (poly_const r p)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o + GEN_REWRITE_RULE I [ring_prime]) THEN + ABBREV_TAC + `j = ideal_generated r {p:A}` THEN + SUBGOAL_THEN `ring_ideal r (j:A->bool)` ASSUME_TAC THENL + [EXPAND_TAC "j" THEN REWRITE_TAC[RING_IDEAL_IDEAL_GENERATED]; ALL_TAC] THEN + SUBGOAL_THEN + `integral_domain + (poly_ring (quotient_ring r (j:A->bool)) (s:V->bool))` ASSUME_TAC THENL + [ASM_SIMP_TAC[INTEGRAL_DOMAIN_POLY_RING; + INTEGRAL_DOMAIN_QUOTIENT_RING] THEN + EXPAND_TAC "j" THEN ASM_SIMP_TAC[PRIME_IDEAL_SING]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_homomorphism (poly_ring r (s:V->bool), + poly_ring (quotient_ring r (j:A->bool)) s) + (\q:(V->num)->A. ring_coset r j o q)` ASSUME_TAC THENL + [ASM_SIMP_TAC[RING_HOMOMORPHISM_POLY_RINGS; RING_HOMOMORPHISM_RING_COSET]; + ALL_TAC] THEN + FIRST_ASSUM(ASSUME_TAC o REWRITE_RULE[SUBSET; FORALL_IN_IMAGE] o + CONJUNCT1 o GEN_REWRITE_RULE I [ring_homomorphism]) THEN + SUBGOAL_THEN + `(\q:(V->num)->A. ring_coset r (j:A->bool) o q) (poly_const r p) = + ring_0 (poly_ring (quotient_ring r j) (s:V->bool))` ASSUME_TAC THENL + [CONV_TAC(LAND_CONV BETA_CONV) THEN GEN_REWRITE_TAC I [FUN_EQ_THM] THEN + X_GEN_TAC `m:V->num` THEN + REWRITE_TAC[o_THM; poly_const; POLY_RING; POLY_0] THEN + COND_CASES_TAC THEN + ASM_SIMP_TAC[QUOTIENT_RING; RING_COSET_0; RING_IDEAL_IMP_SUBSET] THEN + ASM_MESON_TAC[RING_COSET_EQ_IDEAL; IDEAL_GENERATED_INC; + IN_SING; SING_SUBSET]; + ALL_TAC] THEN + REWRITE_TAC[ring_prime] THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[POLY_RING; POLY_CONST]; + ASM_MESON_TAC[POLY_RING; POLY_CONST_0; POLY_CONST_EQ]; + ASM_MESON_TAC[RING_UNIT_POLY_CONST; ring_prime]; + ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`f:(V->num)->A`; `g:(V->num)->A`] THEN + STRIP_TAC THEN + SUBGOAL_THEN + `(!m:V->num. ring_divides r p ((f:(V->num)->A) m)) \/ + (!m. ring_divides r p ((g:(V->num)->A) m))` MP_TAC THENL + [ALL_TAC; + DISCH_THEN DISJ_CASES_TAC THENL [DISJ1_TAC; DISJ2_TAC] THEN + MATCH_MP_TAC POLY_CONST_DIVIDES_COEFFS THEN ASM_REWRITE_TAC[]] THEN + SUBGOAL_THEN + `(\q:(V->num)->A. ring_coset r (j:A->bool) o q) + (ring_mul (poly_ring r (s:V->bool)) (f:(V->num)->A) g) = + ring_0 (poly_ring (quotient_ring r j) s)` ASSUME_TAC THENL + [SUBGOAL_THEN + `ring_divides (poly_ring (quotient_ring r (j:A->bool)) (s:V->bool)) + ((\q:(V->num)->A. ring_coset r j o q) (poly_const r p)) + ((\q. ring_coset r j o q) + (ring_mul (poly_ring r s) (f:(V->num)->A) g))` MP_TAC THENL + [MATCH_MP_TAC RING_DIVIDES_HOMOMORPHIC_IMAGE THEN + EXISTS_TAC `poly_ring (r:A ring) (s:V->bool)` THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[RING_DIVIDES_ZERO]]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\q:(V->num)->A. ring_coset r (j:A->bool) o q) (f:(V->num)->A) = + ring_0 (poly_ring (quotient_ring r j) (s:V->bool)) \/ + (\q:(V->num)->A. ring_coset r (j:A->bool) o q) (g:(V->num)->A) = + ring_0 (poly_ring (quotient_ring r j) s)` MP_TAC THENL + [MP_TAC(ISPEC `poly_ring (quotient_ring (r:A ring) (j:A->bool)) (s:V->bool)` + INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ASM_SIMP_TAC[] THEN ASM_MESON_TAC[RING_HOMOMORPHISM_MUL]; + ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL [DISJ1_TAC; DISJ2_TAC] THEN + X_GEN_TAC `m:V->num` THEN + FIRST_X_ASSUM(MP_TAC o AP_TERM + `\(ff:(V->num)->(A->bool)). ff (m:V->num)`) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_SIMP_TAC[o_THM; POLY_RING; POLY_0; QUOTIENT_RING; + RING_COSET_0; RING_IDEAL_IMP_SUBSET] THEN + DISCH_TAC THEN EXPAND_TAC "j" THEN + ASM_MESON_TAC[RING_COSET_EQ_IDEAL; IN_IDEAL_GENERATED_SING_EQ; + POLY_MONOMIAL_IN_CARRIER]);; + +(* Gauss's Lemma (divisibility form): a primitive polynomial *) +(* that divides c * a for a constant c must divide a. *) + +let POLY_PRIMITIVE_CONST_CANCEL = prove + (`!(r:A ring) (s:V->bool) f a c. + UFD r /\ f IN ring_carrier(poly_ring r s) /\ + a IN ring_carrier(poly_ring r s) /\ c IN ring_carrier r /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r s) + ((poly_const r p):(V->num)->A) f) /\ + ring_divides (poly_ring r s) f + (ring_mul (poly_ring r s) (poly_const r c) a) + ==> c = ring_0 r \/ ring_divides (poly_ring r s) f a`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + SUBGOAL_THEN + `!c:A. c IN ring_carrier r + ==> (c = ring_0 r \/ + (ring_divides (poly_ring r (s:V->bool)) f + (ring_mul (poly_ring r s) (poly_const r c) a) + ==> ring_divides (poly_ring r s) f a))` MP_TAC THENL + [ALL_TAC; + DISCH_THEN(MP_TAC o SPEC `c:A`) THEN ASM_MESON_TAC[]] THEN + MATCH_MP_TAC UFD_PRIME_FACTOR_INDUCT THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* Unit case *) + X_GEN_TAC `u:A` THEN DISCH_TAC THEN DISJ2_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC RING_DIVIDES_TRANS THEN + EXISTS_TAC `ring_mul (poly_ring r (s:V->bool)) + (poly_const r (u:A)) (a:(V->num)->A)` THEN + ASM_MESON_TAC[RING_ASSOCIATES_LMUL; RING_UNIT_POLY_CONST; ring_associates]; + (* Inductive step: c = p * d *) + MAP_EVERY X_GEN_TAC [`pp:A`; `dd:A`] THEN STRIP_TAC THENL + [DISJ1_TAC THEN ASM_MESON_TAC[ring_prime; RING_MUL_RZERO]; ALL_TAC] THEN + DISJ2_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [ring_prime]) THEN + DISCH_TAC THEN + SUBGOAL_THEN + `ring_mul (poly_ring r (s:V->bool)) + (poly_const r (ring_mul r (pp:A) dd)) a = + ring_mul (poly_ring r s) (poly_const r pp) + (ring_mul (poly_ring r s) (poly_const r dd) (a:(V->num)->A))` + SUBST_ALL_TAC THENL + [REWRITE_TAC[POLY_RING] THEN ASM_SIMP_TAC[POLY_CONST_MUL] THEN + REWRITE_TAC[GSYM POLY_RING] THEN + ASM_MESON_TAC[RING_MUL_ASSOC; POLY_CONST]; + ALL_TAC] THEN + FIRST_X_ASSUM(X_CHOOSE_THEN `h:(V->num)->A` STRIP_ASSUME_TAC o + CONJUNCT2 o CONJUNCT2 o GEN_REWRITE_RULE I [ring_divides]) THEN + SUBGOAL_THEN `ring_prime (poly_ring r (s:V->bool)) (poly_const r (pp:A))` + (STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [ring_prime]) THENL + [ASM_SIMP_TAC[RING_PRIME_POLY_CONST]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`f:(V->num)->A`; `h:(V->num)->A`]) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[ring_divides; RING_MUL; POLY_CONST]; ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(X_CHOOSE_THEN `h':(V->num)->A` STRIP_ASSUME_TAC o + CONJUNCT2 o CONJUNCT2 o GEN_REWRITE_RULE I [ring_divides]) THEN + SUBGOAL_THEN + `ring_mul (poly_ring r (s:V->bool)) (poly_const r (dd:A)) (a:(V->num)->A) = + ring_mul (poly_ring r s) (f:(V->num)->A) (h':(V->num)->A)` + ASSUME_TAC THENL + [MATCH_MP_TAC(ISPECL [`poly_ring (r:A ring) (s:V->bool)`; + `(poly_const r (pp:A)):(V->num)->A`] INTEGRAL_DOMAIN_MUL_LCANCEL) THEN + ASM_SIMP_TAC[INTEGRAL_DOMAIN_POLY_RING; POLY_CONST; RING_MUL] THEN + ASM_MESON_TAC[RING_MUL_ASSOC; RING_MUL_SYM; RING_MUL; POLY_CONST]; + ALL_TAC] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[ring_divides; RING_MUL; POLY_CONST]]);; + +(* Strip all prime constant divisors *) + +let MAKE_PRIMITIVE_IN_IDEAL = prove + (`!(r:A ring) j (f:(1->num)->A). + UFD r /\ prime_ideal (poly_ring r (:1)) j /\ + (!c:A. c IN ring_carrier r /\ + (poly_const r c:(1->num)->A) IN j ==> c = ring_0 r) /\ + f IN ring_carrier(poly_ring r (:1)) /\ f IN j /\ + ~(f = ring_0(poly_ring r (:1))) + ==> ?g:(1->num)->A. + g IN ring_carrier(poly_ring r (:1)) /\ g IN j /\ + ~(g = ring_0(poly_ring r (:1))) /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) (poly_const r p) g) /\ + poly_deg r g = poly_deg r f`, + let lemma = prove + (`!(r:A ring) j (ff:(1->num)->A) pp. + integral_domain r /\ prime_ideal (poly_ring r (:1)) j /\ + (!c:A. c IN ring_carrier r /\ + (poly_const r c:(1->num)->A) IN j ==> c = ring_0 r) /\ + ff IN ring_carrier(poly_ring r (:1)) /\ ff IN j /\ + ~(ff = ring_0(poly_ring r (:1))) /\ ring_prime r pp /\ + ring_divides (poly_ring r (:1)) (poly_const r pp:(1->num)->A) ff + ==> ?ff':(1->num)->A. + ff' IN ring_carrier(poly_ring r (:1)) /\ ff' IN j /\ + ~(ff' = ring_0(poly_ring r (:1))) /\ + poly_deg r ff' = poly_deg r ff /\ + ff = ring_mul (poly_ring r (:1)) (poly_const r pp) ff'`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [ring_divides]) THEN + EXISTS_TAC `x:(1->num)->A` THEN + SUBGOAL_THEN + `(pp:A) IN ring_carrier r /\ ~(pp = ring_0 r) /\ + (x:(1->num)->A) IN j /\ ~(x = ring_0(poly_ring (r:A ring) (:1)))` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime; RING_MUL_IN_PRIME_IDEAL; + POLY_CONST; RING_MUL_RZERO]; + ALL_TAC] THEN + REPEAT CONJ_TAC THEN TRY(ASM_REWRITE_TAC[] THEN NO_TAC) THEN + SUBGOAL_THEN + `poly_deg (r:A ring) (ff:(1->num)->A) = + poly_deg r (poly_const r (pp:A):(1->num)->A) + + poly_deg r (x:(1->num)->A)` + (fun th -> REWRITE_TAC[th; POLY_DEG_CONST] THEN ARITH_TAC) THEN + ASM_REWRITE_TAC[POLY_RING_CLAUSES] THEN + MATCH_MP_TAC POLY_DEG_MUL THEN + ASM_REWRITE_TAC[RING_POLYNOMIAL_CONST; RING_POLYNOMIAL] THEN + ASM_MESON_TAC[POLY_CONST_0; POLY_CONST_EQ; POLY_RING]) in + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + SUBGOAL_THEN + `!(a:A). a IN ring_carrier r ==> + !(ff:(1->num)->A). + ff IN ring_carrier(poly_ring r (:1)) /\ ff IN j /\ + ~(ff = ring_0(poly_ring r (:1))) /\ ff(\v:1. poly_deg r ff) = a + ==> ?(g:(1->num)->A). + g IN ring_carrier(poly_ring r (:1)) /\ g IN j /\ + ~(g = ring_0(poly_ring r (:1))) /\ + (!p:A. ring_prime r p ==> + ~ring_divides (poly_ring r (:1)) + (poly_const r p :(1->num)->A) g) /\ + poly_deg r g = poly_deg r ff` MP_TAC THENL + [MATCH_MP_TAC RING_PROPER_DIVISOR_INDUCT THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `a:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "IH")) THEN + X_GEN_TAC `ff:(1->num)->A` THEN STRIP_TAC THEN + ASM_CASES_TAC `!p:A. ring_prime r p ==> + ~ring_divides (poly_ring r (:1)) (poly_const r p :(1->num)->A) ff` THENL + [EXISTS_TAC `ff:(1->num)->A` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN + REWRITE_TAC[NOT_IMP; NOT_CLAUSES] THEN + DISCH_THEN(X_CHOOSE_THEN `pp:A` STRIP_ASSUME_TAC) THEN + MP_TAC(ISPECL [`r:A ring`; `j:((1->num)->A)->bool`; + `ff:(1->num)->A`; `pp:A`] lemma) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `ff':(1->num)->A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(pp:A) IN ring_carrier r /\ ~ring_unit (r:A ring) (pp:A)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime]; ALL_TAC] THEN + SUBGOAL_THEN `!m:(1->num). (ff:(1->num)->A) m = + ring_mul (r:A ring) pp ((ff':(1->num)->A) m)` ASSUME_TAC THENL + [GEN_TAC THEN ASM_SIMP_TAC[POLY_RING_CLAUSES; POLY_MUL_CONST; + RING_POLYNOMIAL; BETA_THM]; + ALL_TAC] THEN + SUBGOAL_THEN + `(ff':(1->num)->A) (\v:1. poly_deg r ff') IN ring_carrier (r:A ring) /\ + ~(ff' (\v:1. poly_deg r ff') = ring_0 (r:A ring))` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER; + REWRITE_RULE[coeff] POLY_TOP_NONZERO]; + ALL_TAC] THEN + USE_THEN "IH" (MP_TAC o SPEC + `(ff':(1->num)->A) (\v:1. poly_deg r ff')`) THEN + ANTS_TAC THENL + [SUBGOAL_THEN `(a:A) = ring_mul (r:A ring) pp + ((ff':(1->num)->A) (\v:1. poly_deg r ff'))` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_DIVIDES_LMUL THEN ASM_MESON_TAC[RING_DIVIDES_REFL]; + ASM_SIMP_TAC[CONJUNCT1 INTEGRAL_DOMAIN_DIVIDES_MUL_SELF; + DE_MORGAN_THM]]; + ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `ff':(1->num)->A`) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + DISCH_THEN(MP_TAC o SPEC `(f:(1->num)->A) (\v:1. poly_deg r f)`) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `f:(1->num)->A`) THEN ASM_MESON_TAC[]]);; + +(* Factor out content: any nonzero polynomial equals a constant times *) +(* a primitive polynomial of the same degree *) + +let POLY_MAKE_PRIMITIVE = prove + (`!(r:A ring) (f:(1->num)->A). + UFD r /\ + f IN ring_carrier(poly_ring r (:1)) /\ + ~(f = ring_0(poly_ring r (:1))) + ==> ?(c:A) (g:(1->num)->A). + c IN ring_carrier r /\ ~(c = ring_0 r) /\ + g IN ring_carrier(poly_ring r (:1)) /\ + ~(g = ring_0(poly_ring r (:1))) /\ + f = ring_mul (poly_ring r (:1)) (poly_const r c) g /\ + poly_deg r g = poly_deg r f /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) + (poly_const r p) g)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + SUBGOAL_THEN + `!(a:A). a IN ring_carrier (r:A ring) ==> + !(ff:(1->num)->A). + ff IN ring_carrier(poly_ring r (:1)) /\ + ~(ff = ring_0(poly_ring r (:1))) /\ + ff(\v:1. poly_deg r ff) = a + ==> ?(c:A) (g:(1->num)->A). + c IN ring_carrier r /\ ~(c = ring_0 r) /\ + g IN ring_carrier(poly_ring r (:1)) /\ + ~(g = ring_0(poly_ring r (:1))) /\ + ff = ring_mul (poly_ring r (:1)) + (poly_const r c) g /\ + poly_deg r g = poly_deg r ff /\ + (!p:A. ring_prime r p ==> + ~ring_divides (poly_ring r (:1)) + (poly_const r p :(1->num)->A) g)` + MP_TAC THENL + [MATCH_MP_TAC RING_PROPER_DIVISOR_INDUCT THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN X_GEN_TAC `a:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "IH")) THEN + X_GEN_TAC `ff:(1->num)->A` THEN STRIP_TAC THEN + ASM_CASES_TAC `!p:A. ring_prime r p ==> + ~ring_divides (poly_ring r (:1)) + (poly_const r p :(1->num)->A) ff` THENL + [MAP_EVERY EXISTS_TAC [`ring_1 r:A`; `ff:(1->num)->A`] THEN + ASM_REWRITE_TAC[RING_1] THEN REPEAT CONJ_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_IMP_NONTRIVIAL_RING; TRIVIAL_RING_10]; + CONV_TAC SYM_CONV THEN SUBGOAL_THEN + `poly_const r (ring_1 (r:A ring)):(1->num)->A = + ring_1(poly_ring r (:1))` SUBST1_TAC THENL + [REWRITE_TAC[POLY_RING; POLY_CONST_1]; ALL_TAC] THEN + MATCH_MP_TAC RING_MUL_LID THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN + REWRITE_TAC[NOT_IMP; NOT_CLAUSES] THEN + DISCH_THEN(X_CHOOSE_THEN `q:A` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [ring_divides]) THEN + DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) (CONJUNCTS_THEN2 + (K ALL_TAC) + (X_CHOOSE_THEN `ff':(1->num)->A` STRIP_ASSUME_TAC))) THEN + SUBGOAL_THEN `(q:A) IN ring_carrier r /\ ~(q = ring_0 r) /\ + ~ring_unit r q` STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime]; ALL_TAC] THEN + SUBGOAL_THEN `~(ff' = ring_0(poly_ring r (:1)):(1->num)->A)` + ASSUME_TAC THENL + [ASM_MESON_TAC[RING_MUL_RZERO; POLY_RING; POLY_CONST]; + ALL_TAC] THEN + SUBGOAL_THEN `!m:(1->num). (ff:(1->num)->A) m = + ring_mul (r:A ring) q ((ff':(1->num)->A) m)` ASSUME_TAC THENL + [GEN_TAC THEN ASM_SIMP_TAC[POLY_RING_CLAUSES; POLY_MUL_CONST; + RING_POLYNOMIAL; BETA_THM]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (ff':(1->num)->A) = + poly_deg r (ff:(1->num)->A)` ASSUME_TAC THENL + [SUBGOAL_THEN + `poly_deg (r:A ring) (ff:(1->num)->A) = + poly_deg r (poly_const r (q:A):(1->num)->A) + + poly_deg r (ff':(1->num)->A)` + (fun th -> + REWRITE_TAC[th; POLY_DEG_CONST] THEN ARITH_TAC) THEN + ASM_REWRITE_TAC[POLY_RING_CLAUSES] THEN + MATCH_MP_TAC POLY_DEG_MUL THEN + ASM_REWRITE_TAC[RING_POLYNOMIAL_CONST; RING_POLYNOMIAL] THEN + ASM_MESON_TAC[POLY_CONST_0; POLY_CONST_EQ; POLY_RING]; + ALL_TAC] THEN + SUBGOAL_THEN `(ff':(1->num)->A) (\v:1. poly_deg r ff') IN + ring_carrier (r:A ring) /\ + ~(ff' (\v:1. poly_deg r ff') = ring_0 (r:A ring))` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER; + REWRITE_RULE[coeff] POLY_TOP_NONZERO]; + ALL_TAC] THEN + USE_THEN "IH" (MP_TAC o + SPEC `(ff':(1->num)->A) (\v:1. poly_deg r ff')`) THEN + ANTS_TAC THENL + [SUBGOAL_THEN `(a:A) = ring_mul (r:A ring) q + ((ff':(1->num)->A) (\v:1. poly_deg r ff'))` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_DIVIDES_LMUL THEN + ASM_MESON_TAC[RING_DIVIDES_REFL]; + ASM_SIMP_TAC[CONJUNCT1 INTEGRAL_DOMAIN_DIVIDES_MUL_SELF; + DE_MORGAN_THM]]; + ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `ff':(1->num)->A`) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `c':A` + (X_CHOOSE_THEN `g:(1->num)->A` STRIP_ASSUME_TAC)) THEN + MAP_EVERY EXISTS_TAC + [`ring_mul r (q:A) c'`; `g:(1->num)->A`] THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`r:A ring`; `q:A`; `c':A`] + INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`poly_ring (r:A ring) (:1)`; + `poly_const r (q:A):(1->num)->A`; + `poly_const r (c':A):(1->num)->A`; + `g:(1->num)->A`] RING_MUL_ASSOC) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[POLY_CONST; RING_MUL]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + AP_THM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[POLY_RING] THEN + MATCH_MP_TAC(GSYM POLY_CONST_MUL) THEN ASM_REWRITE_TAC[]]; + DISCH_THEN(MP_TAC o + SPEC `(f:(1->num)->A) (\v:1. poly_deg r f)`) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `f:(1->num)->A`) THEN + ASM_MESON_TAC[]]);; + +(* Prime elements extend from smaller to larger variable sets *) + +let RING_PRIME_POLY_RING_MONO = prove + (`!(r:A ring) (t:V->bool) s (q:(V->num)->A). + t SUBSET s /\ integral_domain r /\ + ring_prime (poly_ring r t) q + ==> ring_prime (poly_ring r s) q`, + let lemma = prove + (`!(r:A ring) (t:V->bool) u s (q:(V->num)->A). + DISJOINT t u /\ t UNION u = s /\ q IN ring_carrier (poly_ring r t) + ==> (\p m. + if monomial s m + then p (monomial_restrict u m) (monomial_restrict t m) + else ring_0 r) + (poly_const (poly_ring r t) q) = q`, + REPEAT STRIP_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + X_GEN_TAC `m:V->num` THEN + REWRITE_TAC[poly_const; POLY_RING; POLY_0] THEN + ASM_CASES_TAC `monomial (s:V->bool) (m:V->num)` THEN + ASM_REWRITE_TAC[] THENL + [ASM_CASES_TAC `monomial_restrict (u:V->bool) (m:V->num) = monomial_1` THEN + ASM_REWRITE_TAC[] THENL + [AP_TERM_TAC THEN MATCH_MP_TAC MONOMIAL_RESTRICT_REFL THEN + RULE_ASSUM_TAC(REWRITE_RULE + [monomial; GSYM MONOMIAL_VARS_EQ_EMPTY; + MONOMIAL_VARS_RESTRICT]) THEN + REWRITE_TAC[monomial] THEN ASM SET_TAC[]; + MATCH_MP_TAC(GSYM POLY_MONOMIALS_ALT) THEN + EXISTS_TAC `t:V->bool` THEN + RULE_ASSUM_TAC(REWRITE_RULE + [monomial; GSYM MONOMIAL_VARS_EQ_EMPTY; + MONOMIAL_VARS_RESTRICT; GSYM MEMBER_NOT_EMPTY]) THEN + ASM_REWRITE_TAC[monomial] THEN ASM SET_TAC[]]; + ASM_MESON_TAC[POLY_MONOMIALS; MONOMIAL_MONO; SUBSET_UNION]]) in + REPEAT STRIP_TAC THEN + ABBREV_TAC `u = s DIFF (t:V->bool)` THEN + SUBGOAL_THEN `DISJOINT (t:V->bool) u /\ t UNION u = s` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "u" THEN ASM SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(q:(V->num)->A) IN ring_carrier(poly_ring r t)` + ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime]; ALL_TAC] THEN + MP_TAC(ISPECL + [`poly_ring r (t:V->bool) :((V->num)->A) ring`; + `u:V->bool`; `q:(V->num)->A`] RING_PRIME_POLY_CONST) THEN + ASM_SIMP_TAC[INTEGRAL_DOMAIN_POLY_RING] THEN + SUBGOAL_THEN + `ring_isomorphism + (poly_ring (poly_ring r (t:V->bool) :((V->num)->A) ring) u, + poly_ring r (s:V->bool) :((V->num)->A) ring) + (\p (m:V->num). + if monomial s m + then (p:(V->num)->(V->num)->A) + (monomial_restrict u m) (monomial_restrict t m) + else ring_0 r)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `t:V->bool`; `u:V->bool`] + RING_ISOMORPHISMS_POLY_POLY_RING) THEN + ASM_REWRITE_TAC[] THEN + MESON_TAC[ring_isomorphisms; ring_isomorphism]; + ALL_TAC] THEN + DISCH_TAC THEN + FIRST_ASSUM(MP_TAC o + SPEC `poly_const (poly_ring r (t:V->bool) :((V->num)->A) ring) + (q:(V->num)->A) :(V->num)->(V->num)->A` o + MATCH_MP(REWRITE_RULE[IMP_CONJ] + RING_PRIME_ISOMORPHIC_IMAGE_EQ)) THEN + ASM_REWRITE_TAC[POLY_CONST] THEN + MP_TAC(ISPECL + [`r:A ring`; `t:V->bool`; `u:V->bool`; + `s:V->bool`; `q:(V->num)->A`] lemma) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[]);; + +(* UFD for polynomial ring in arbitrary number of variables *) + +let UFD_POLY_RING = prove + (`!(r:A ring) (s:V->bool). UFD r ==> UFD(poly_ring r s)`, + let UFD_POLY_RING_1 = prove + (`!(r:A ring). UFD r ==> UFD(poly_ring r (:1))`, + GEN_TAC THEN DISCH_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + REWRITE_TAC[UFD] THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[INTEGRAL_DOMAIN_POLY_RING]; ALL_TAC] THEN + X_GEN_TAC `j:((1->num)->A)->bool` THEN STRIP_TAC THEN + ASM_CASES_TAC `?c:A. c IN ring_carrier r /\ ~(c = ring_0 r) /\ + (poly_const r c:(1->num)->A) IN j` THENL + [(* Case 1: j contains a nonzero constant *) + FIRST_X_ASSUM(X_CHOOSE_THEN `c:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `prime_ideal (r:A ring) + {x | x IN ring_carrier r /\ (poly_const r x:(1->num)->A) IN j} /\ + ~({x:A | x IN ring_carrier r /\ + (poly_const r x:(1->num)->A) IN j} = {ring_0 r})` MP_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `poly_ring (r:A ring) (:1)`; + `poly_const (r:A ring):A->(1->num)->A`; `j:((1->num)->A)->bool`] + PRIME_IDEAL_HOMOMORPHIC_PREIMAGE) THEN + ASM_REWRITE_TAC[RING_HOMOMORPHISM_POLY_CONST]; + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_SING] THEN + DISCH_THEN(MP_TAC o SPEC `c:A`) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + FIRST_ASSUM(fun th -> + DISCH_THEN(MP_TAC o MATCH_MP + (CONJUNCT2(REWRITE_RULE[UFD] th)))) THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `p:A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `poly_const (r:A ring) p:(1->num)->A` THEN + ASM_SIMP_TAC[RING_PRIME_POLY_CONST]; + (* Case 2: no nonzero constant in j *) + FIRST_X_ASSUM(ASSUME_TAC o + REWRITE_RULE[TAUT `~(p /\ ~q /\ r) <=> p /\ r ==> q`] o + GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + SUBGOAL_THEN + `?g:(1->num)->A. + g IN ring_carrier(poly_ring r (:1)) /\ g IN j /\ + ~(g = ring_0(poly_ring r (:1))) /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) (poly_const r p) g) /\ + (!h. h IN j ==> ring_divides (poly_ring r (:1)) g h)` + STRIP_ASSUME_TAC THENL + [SUBGOAL_THEN + `ring_ideal (poly_ring (r:A ring) (:1)) j /\ + j SUBSET ring_carrier (poly_ring r (:1))` STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[PRIME_IMP_RING_IDEAL; RING_IDEAL_IMP_SUBSET]; + ALL_TAC] THEN + SUBGOAL_THEN + `?f:(1->num)->A. + f IN ring_carrier(poly_ring r (:1)) /\ f IN j /\ + ~(f = ring_0(poly_ring r (:1))) /\ + !h. h IN j /\ ~(h = ring_0(poly_ring r (:1))) + ==> poly_deg r f <= poly_deg r h` STRIP_ASSUME_TAC THENL + [SUBGOAL_THEN + `?n. ?f:(1->num)->A. f IN ring_carrier(poly_ring r (:1)) /\ + f IN j /\ ~(f = ring_0(poly_ring r (:1))) /\ + poly_deg r f = n` MP_TAC THENL + [MP_TAC(ISPEC `poly_ring (r:A ring) (:1)` IN_RING_IDEAL_0) THEN + ASM_REWRITE_TAC[] THEN ASM SET_TAC[]; + ALL_TAC] THEN + GEN_REWRITE_TAC (LAND_CONV) [num_WOP] THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` + (CONJUNCTS_THEN2 + (X_CHOOSE_THEN `f0:(1->num)->A` STRIP_ASSUME_TAC) ASSUME_TAC)) THEN + EXISTS_TAC `f0:(1->num)->A` THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `poly_deg r (h:(1->num)->A)`) THEN + ASM_MESON_TAC[SUBSET]; + ALL_TAC] THEN + SUBGOAL_THEN + `?g:(1->num)->A. + g IN ring_carrier(poly_ring r (:1)) /\ g IN j /\ + ~(g = ring_0(poly_ring r (:1))) /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) (poly_const r p) g) /\ + (!h. h IN j /\ ~(h = ring_0(poly_ring r (:1))) + ==> poly_deg r g <= poly_deg r h)` STRIP_ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `j:((1->num)->A)->bool`; + `f:(1->num)->A`] MAKE_PRIMITIVE_IN_IDEAL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `g0:(1->num)->A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `g0:(1->num)->A` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `h0:(1->num)->A` THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + EXISTS_TAC `g:(1->num)->A` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `!nn (hh:(1->num)->A). hh IN j /\ poly_deg (r:A ring) hh = nn + ==> ring_divides (poly_ring r (:1)) (g:(1->num)->A) hh` + (fun th -> MESON_TAC[th]) THEN + MATCH_MP_TAC num_WF THEN X_GEN_TAC `nn:num` THEN + DISCH_THEN(LABEL_TAC "IH_n") THEN + X_GEN_TAC `hh:(1->num)->A` THEN STRIP_TAC THEN + SUBGOAL_THEN `(hh:(1->num)->A) IN + ring_carrier(poly_ring r (:1))` ASSUME_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `hh:(1->num)->A = ring_0(poly_ring r (:1))` THENL + [ASM_MESON_TAC[RING_DIVIDES_0]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (g:(1->num)->A) <= + poly_deg r (hh:(1->num)->A)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ABBREV_TAC `aa:A = (g:(1->num)->A) (\v:1. poly_deg r g)` THEN + ABBREV_TAC `bb:A = (hh:(1->num)->A) (\v:1. poly_deg r hh)` THEN + ABBREV_TAC `kk = nn - poly_deg r (g:(1->num)->A)` THEN + SUBGOAL_THEN + `(aa:A) IN ring_carrier r /\ ~(aa = ring_0 (r:A ring)) /\ + (bb:A) IN ring_carrier r /\ ~(bb = ring_0 (r:A ring))` + STRIP_ASSUME_TAC THENL + [MAP_EVERY EXPAND_TAC ["aa"; "bb"] THEN REPEAT CONJ_TAC THEN + ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER; + REWRITE_RULE[coeff] POLY_TOP_NONZERO]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides (poly_ring r (:1)) (g:(1->num)->A) + (ring_mul (poly_ring r (:1)) (poly_const r aa) hh)` MP_TAC THENL + [ALL_TAC; + DISCH_TAC THEN + MP_TAC(ISPECL [`r:A ring`; `(:1)`; `g:(1->num)->A`; + `hh:(1->num)->A`; `aa:A`] POLY_PRIMITIVE_CONST_CANCEL) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]] THEN + ABBREV_TAC `qterm:(1->num)->A = ring_mul (poly_ring r (:1)) + (poly_const r bb) (ring_pow (poly_ring r (:1)) + (poly_var r (one:1)) kk)` THEN + ABBREV_TAC `hh':(1->num)->A = ring_sub (poly_ring r (:1)) + (ring_mul (poly_ring r (:1)) (poly_const r aa) hh) + (ring_mul (poly_ring r (:1)) qterm (g:(1->num)->A))` THEN + SUBGOAL_THEN `(qterm:(1->num)->A) IN + ring_carrier(poly_ring r (:1))` ASSUME_TAC THENL + [EXPAND_TAC "qterm" THEN + ASM_SIMP_TAC[RING_MUL; POLY_CONST; RING_POW; POLY_VAR_UNIV]; + ALL_TAC] THEN + SUBGOAL_THEN `(hh':(1->num)->A) IN + ring_carrier(poly_ring r (:1)) /\ hh' IN j` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "hh'" THEN + ASM_MESON_TAC[RING_SUB; RING_MUL; POLY_CONST; + IN_RING_IDEAL_SUB; IN_RING_IDEAL_LMUL]; + ALL_TAC] THEN + SUBGOAL_THEN `ring_divides (poly_ring r (:1)) + (g:(1->num)->A) (hh':(1->num)->A)` ASSUME_TAC THENL + [ASM_CASES_TAC `hh':(1->num)->A = ring_0(poly_ring r (:1))` THENL + [ASM_MESON_TAC[RING_DIVIDES_0]; ALL_TAC] THEN + USE_THEN "IH_n" (MP_TAC o SPEC + `poly_deg r (hh':(1->num)->A)`) THEN + ANTS_TAC THENL + [MP_TAC(REWRITE_RULE[coeff] + (ISPECL [`r:A ring`; `g:(1->num)->A`] POLY_TOP_TAIL)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `qg:(1->num)->A` + (REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC)) THEN + MP_TAC(REWRITE_RULE[coeff] + (ISPECL [`r:A ring`; `hh:(1->num)->A`] POLY_TOP_TAIL)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `qhh:(1->num)->A` + (REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC)) THEN + SUBGOAL_THEN + `ring_mul (poly_ring r (:1)) + (ring_pow (poly_ring r (:1)) (poly_var r (one:1)) kk) + (ring_pow (poly_ring r (:1)) (poly_var r one) + (poly_deg (r:A ring) (g:(1->num)->A))) = + ring_pow (poly_ring r (:1)) (poly_var r one) nn` + ASSUME_TAC THENL + [SIMP_TAC[GSYM RING_POW_ADD; POLY_VAR_UNIV] THEN AP_TERM_TAC THEN + EXPAND_TAC "kk" THEN MATCH_MP_TAC SUB_ADD THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(hh':(1->num)->A) = + ring_sub (poly_ring r (:1)) + (ring_mul (poly_ring r (:1)) (poly_const r aa) qhh) + (ring_mul (poly_ring r (:1)) qterm (qg:(1->num)->A))` + SUBST1_TAC THENL + [MAP_EVERY EXPAND_TAC ["hh'"; "g"; "hh"; "qterm"] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] (RING_RULE + `ring_mul (rr:(((1->num)->A)ring)) xk xdg = xn + ==> ring_sub rr + (ring_mul rr a (ring_add rr (ring_mul rr b xn) t)) + (ring_mul rr (ring_mul rr b xk) + (ring_add rr (ring_mul rr a xdg) s)) = + ring_sub rr (ring_mul rr a t) + (ring_mul rr (ring_mul rr b xk) s)`)) THEN + ASM_SIMP_TAC[RING_MUL; RING_POW; POLY_VAR_UNIV; + POLY_CONST; RING_ADD]; + ALL_TAC] THEN + SUBGOAL_THEN `~(nn = 0) /\ + kk + poly_deg (r:A ring) (g:(1->num)->A) = nn` + STRIP_ASSUME_TAC THENL + [SUBGOAL_THEN `~(poly_deg (r:A ring) (g:(1->num)->A) = 0)` MP_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC + `(g:(1->num)->A) IN ring_carrier(poly_ring r (:1))` THEN + REWRITE_TAC[IN_POLY_RING_CARRIER] THEN + DISCH_THEN(MP_TAC o MATCH_MP POLY_DEG_EQ_0 o + CONJUNCT1) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `c0:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(c0:A) = ring_0 r` + SUBST_ALL_TAC THENL + [ASM_MESON_TAC[]; + UNDISCH_TAC + `~((g:(1->num)->A) = + ring_0(poly_ring r (:1)))` THEN + ASM_REWRITE_TAC[POLY_CONST_0; POLY_RING]]; + EXPAND_TAC "kk" THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + FIRST_ASSUM(ASSUME_TAC o + CONJUNCT1 o GEN_REWRITE_RULE I [integral_domain]) THEN + SUBGOAL_THEN `poly_deg r (ring_mul (poly_ring r (:1)) + (poly_const r aa) (qhh:(1->num)->A)) <= nn - 1` + ASSUME_TAC THENL + [ASM_CASES_TAC `qhh:(1->num)->A = ring_0(poly_ring r (:1))` THENL + [ASM_SIMP_TAC[RING_MUL_RZERO; POLY_CONST] THEN + REWRITE_TAC[POLY_RING; POLY_DEG_0; LE_0]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (qhh:(1->num)->A) < nn` ASSUME_TAC THENL + [REPEAT(FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + TRANS_TAC LE_TRANS `poly_deg r (qhh:(1->num)->A)` THEN + CONJ_TAC THENL + [REWRITE_TAC[POLY_RING] THEN + W(MP_TAC o PART_MATCH (lhand o rand) POLY_DEG_MUL_LE + o lhand o snd) THEN + ASM_SIMP_TAC[RING_POLYNOMIAL_CONST; RING_POLYNOMIAL] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] LE_TRANS) THEN + REWRITE_TAC[POLY_DEG_CONST; ADD_CLAUSES; LE_REFL]; + ASM_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (ring_mul (poly_ring r (:1)) + qterm (qg:(1->num)->A)) <= nn - 1` ASSUME_TAC THENL + [ASM_CASES_TAC `qg:(1->num)->A = ring_0(poly_ring r (:1))` THENL + [ASM_SIMP_TAC[RING_MUL_RZERO] THEN + REWRITE_TAC[POLY_RING; POLY_DEG_0; LE_0]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (qg:(1->num)->A) < + poly_deg r (g:(1->num)->A)` ASSUME_TAC THENL + [REPEAT(FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[POLY_RING] THEN + W(MP_TAC o PART_MATCH (lhand o rand) POLY_DEG_MUL_LE + o lhand o snd) THEN + ASM_SIMP_TAC[RING_POLYNOMIAL] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] LE_TRANS) THEN + FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (ARITH_RULE + `s:num < m ==> m <= n /\ q <= n - m ==> q + s <= n - 1`)) THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT(FIRST_X_ASSUM DISJ_CASES_TAC) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + EXPAND_TAC "qterm" THEN REWRITE_TAC[POLY_RING] THEN + W(MP_TAC o PART_MATCH (lhand o rand) POLY_DEG_MUL_LE + o lhand o snd) THEN + ASM_SIMP_TAC[RING_POLYNOMIAL_CONST; RING_POLYNOMIAL; + RING_POW; POLY_VAR_UNIV] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ_ALT] LE_TRANS) THEN + REWRITE_TAC[POLY_DEG_CONST; POLY_DEG_VAR_POW; ADD_CLAUSES] THEN + ASM_REWRITE_TAC[LE_REFL]; + ALL_TAC] THEN + MATCH_MP_TAC(ARITH_RULE + `~(nn = 0) /\ x <= nn - 1 ==> x < nn`) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC POLY_DEG_RING_SUB_LE THEN + ASM_SIMP_TAC[RING_MUL; POLY_CONST]; + DISCH_THEN(MP_TAC o SPEC `hh':(1->num)->A`) THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_mul (poly_ring r (:1)) (poly_const r aa) hh = + ring_add (poly_ring r (:1)) hh' + (ring_mul (poly_ring r (:1)) qterm (g:(1->num)->A)):(1->num)->A` + ASSUME_TAC THENL + [EXPAND_TAC "hh'" THEN + MATCH_MP_TAC(RING_RULE + `(x:(1->num)->A) IN ring_carrier rr /\ y IN ring_carrier rr + ==> x = ring_add rr (ring_sub rr x y) y`) THEN + ASM_SIMP_TAC[RING_MUL; POLY_CONST]; + ALL_TAC] THEN + ASM_SIMP_TAC[RING_DIVIDES_ADD; RING_DIVIDES_LMUL; RING_DIVIDES_REFL]; + ALL_TAC] THEN + EXISTS_TAC `g:(1->num)->A` THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[RING_PRIME_IDEAL] THEN + SUBGOAL_THEN `ideal_generated (poly_ring r (:1)) {g:(1->num)->A} = j` + (fun th -> ASM_REWRITE_TAC[th]) THEN + MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL + [MATCH_MP_TAC IDEAL_GENERATED_MINIMAL THEN + ASM_SIMP_TAC[SING_SUBSET] THEN + ASM_MESON_TAC[prime_ideal; proper_ideal]; + ASM_SIMP_TAC[IDEAL_GENERATED_SING] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + ASM_REWRITE_TAC[]]]) in + let UFD_POLY_RING_FINITE = prove + (`!(r:A ring) (s:V->bool). + UFD r /\ FINITE s ==> UFD (poly_ring r s)`, + GEN_TAC THEN X_GEN_TAC `s:V->bool` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + SPEC_TAC(`s:V->bool`, `s:V->bool`) THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [MP_TAC(ISPEC `r:A ring` + (CONJUNCT1 ISOMORPHIC_POLY_RING_TRIVIAL)) THEN + ASM_MESON_TAC[ISOMORPHIC_RING_UFDNESS]; + ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:V`; `t:V->bool`] THEN STRIP_TAC THEN + MP_TAC(ISPEC `poly_ring r (t:V->bool) :((V->num)->A) ring` + UFD_POLY_RING_1) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `poly_ring (poly_ring r (t:V->bool) :((V->num)->A) ring) (:1) + isomorphic_ring poly_ring r ((a:V) INSERT t) :((V->num)->A) ring` + (fun th -> ASM_MESON_TAC[th; ISOMORPHIC_RING_UFDNESS]) THEN + TRANS_TAC ISOMORPHIC_RING_TRANS + `poly_ring (poly_ring r (t:V->bool) :((V->num)->A) ring) {a:V}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ISOMORPHIC_POLY_RINGS THEN + REWRITE_TAC[ISOMORPHIC_RING_REFL; eq_c; IN_UNIV; IN_SING] THEN + EXISTS_TAC `(\x:1. a:V)` THEN MESON_TAC[one]; + SUBST1_TAC(SET_RULE `(a:V) INSERT t = t UNION {a}`) THEN + MATCH_MP_TAC ISOMORPHIC_RING_POLY_POLY THEN ASM SET_TAC[]]) in + REPEAT STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + REWRITE_TAC[UFD] THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[INTEGRAL_DOMAIN_POLY_RING]; ALL_TAC] THEN + X_GEN_TAC `j:((V->num)->A)->bool` THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP PRIME_IMP_RING_IDEAL) THEN + (* Get a nonzero element from j *) + SUBGOAL_THEN + `?q:(V->num)->A. q IN ring_carrier(poly_ring r s) /\ + q IN j /\ ~(q = ring_0(poly_ring r (s:V->bool)))` + STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o MATCH_MP IN_RING_IDEAL_0) THEN + FIRST_ASSUM(MP_TAC o MATCH_MP RING_IDEAL_IMP_SUBSET) THEN + ASM SET_TAC[]; ALL_TAC] THEN + (* q uses only finitely many variables *) + MP_TAC(ISPECL [`r:A ring`; `s:V->bool`; `q:(V->num)->A`] + POLY_RING_IN_FINITE_VARIABLES) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `w:V->bool` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `ring_0(poly_ring r (w:V->bool)) = + ring_0(poly_ring r (s:V->bool)) :(V->num)->A` + ASSUME_TAC THENL + [REWRITE_TAC[POLY_RING_CLAUSES]; ALL_TAC] THEN + (* Preimage of j is prime in poly_ring r w *) + SUBGOAL_THEN + `prime_ideal (poly_ring r (w:V->bool)) + {x:(V->num)->A | x IN ring_carrier(poly_ring r w) /\ + x IN j}` ASSUME_TAC THENL + [MP_TAC(ISPECL + [`poly_ring r (w:V->bool) :((V->num)->A) ring`; + `poly_ring r (s:V->bool) :((V->num)->A) ring`; + `I:((V->num)->A)->((V->num)->A)`; + `j:((V->num)->A)->bool`] + PRIME_IDEAL_HOMOMORPHIC_PREIMAGE) THEN + REWRITE_TAC[I_THM] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[POLY_RING_HOMOMORPHISM_I]; ALL_TAC] THEN + (* The preimage is nonzero (contains q) *) + SUBGOAL_THEN + `~({x:(V->num)->A | x IN ring_carrier(poly_ring r w) /\ + x IN j} = + {ring_0(poly_ring r (w:V->bool))})` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_SING] THEN + ASM_MESON_TAC[]; ALL_TAC] THEN + (* poly_ring r w is UFD; extract a prime *) + MP_TAC(ISPECL [`r:A ring`; `w:V->bool`] + UFD_POLY_RING_FINITE) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[UFD] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o SPEC `{x:(V->num)->A | + x IN ring_carrier(poly_ring r w) /\ x IN j}`)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `p:(V->num)->A` + (CONJUNCTS_THEN2 ASSUME_TAC + (STRIP_ASSUME_TAC o REWRITE_RULE[IN_ELIM_THM]))) THEN + EXISTS_TAC `p:(V->num)->A` THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `w:V->bool`; `s:V->bool`; + `p:(V->num)->A`] RING_PRIME_POLY_RING_MONO) THEN + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]);; + +(* Clearing denominators for polynomials over fraction fields: + for any polynomial q over Frac(R), there exists a nonzero + c in R such that c*q is in the image of R[X] -> Frac(R)[X]. *) + +let POLY_CLEAR_DENOMINATORS = prove + (`!(r:A ring) q. + integral_domain r /\ + q IN ring_carrier(poly_ring (fraction_ring r) (:1)) + ==> ?c g. c IN ring_carrier r /\ + ~(c = ring_0 r) /\ + g IN ring_carrier(poly_ring r (:1)) /\ + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) + (ring_fractionate r + {a | ring_regular r a} c)) + q = + ring_fractionate r + {a | ring_regular r a} o g`, + REPEAT GEN_TAC THEN + ABBREV_TAC `frc = ring_fractionate r {a:A | ring_regular r a}` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + SPEC_TAC(`q:(1->num)->(A#A->bool)`, + `q:(1->num)->(A#A->bool)`) THEN + MATCH_MP_TAC(ISPECL [`fraction_ring (r:A ring)`; `(:1)`] + POLY_RING_INDUCT_STRONG) THEN + SUBGOAL_THEN + `ring_homomorphism(r:A ring,fraction_ring r) (frc:A->(A#A->bool))` + ASSUME_TAC THENL + [EXPAND_TAC "frc" THEN + MESON_TAC[RING_MONOMORPHISM_FRACTIONATE; + RING_MONOMORPHISM_IMP_HOMOMORPHISM]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_homomorphism (poly_ring (r:A ring) (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` + ASSUME_TAC THENL + [MATCH_MP_TAC RING_HOMOMORPHISM_POLY_RINGS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `ring_multsys (r:A ring) {a | ring_regular r a}` + ASSUME_TAC THENL + [REWRITE_TAC[RING_MULTSYS_REGULAR]; ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN ring_carrier r + ==> (frc:A->(A#A->bool)) x IN + ring_carrier(fraction_ring (r:A ring))` + ASSUME_TAC THENL + [UNDISCH_TAC + `ring_homomorphism(r:A ring,fraction_ring r) (frc:A->(A#A->bool))` THEN + REWRITE_TAC[ring_homomorphism; SUBSET; FORALL_IN_IMAGE] THEN + MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!c:A. c IN ring_carrier r + ==> (frc:A->(A#A->bool)) o + ((poly_const (r:A ring) c) :(1->num)->A) = + poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c)` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC POLY_COMPOSE_HOMOMORPHISM_CONST THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (let clear_denom_subst_tac = + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (g1:(1->num)->A) = + ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c1)) + (x:(1->num)->(A#A->bool))` SUBST1_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (g2:(1->num)->A) = + ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c2)) + (y:(1->num)->(A#A->bool))` SUBST1_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) (ring_mul r c1 (c2:A)) = + ring_mul (fraction_ring (r:A ring)) (frc c1) (frc c2)` + SUBST1_TAC THENL + [ASM_MESON_TAC[RING_HOMOMORPHISM_MUL]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) c1 IN + ring_carrier(fraction_ring (r:A ring)) /\ + frc c2 IN ring_carrier(fraction_ring r)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `poly_const (fraction_ring (r:A ring)) + (ring_mul (fraction_ring r) + ((frc:A->(A#A->bool)) c1) (frc c2)) = + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) (frc c1)) + (poly_const (fraction_ring r) (frc c2))` + SUBST1_TAC THENL + [REWRITE_TAC[POLY_RING_CLAUSES] THEN + ASM_SIMP_TAC[POLY_CONST_MUL]; ALL_TAC] in + REPEAT CONJ_TAC THENL + [(* ===== Constant case ===== *) + X_GEN_TAC `alpha:A#A->bool` THEN DISCH_TAC THEN + SUBGOAL_THEN + `?a b:A. a IN ring_carrier r /\ ring_regular r b /\ + (alpha:A#A->bool) = + ring_localequiv r {a | ring_regular r a} (a,b)` + STRIP_ASSUME_TAC THENL + [UNDISCH_TAC + `(alpha:A#A->bool) IN ring_carrier(fraction_ring (r:A ring))` THEN + REWRITE_TAC[fraction_ring] THEN + ASM_SIMP_TAC[RING_LOCALIZATION_CARRIER] THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(b:A) IN ring_carrier r /\ ~(b = ring_0 r)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_REGULAR]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) b IN ring_carrier(fraction_ring (r:A ring))` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_mul (fraction_ring (r:A ring)) + ((frc:A->(A#A->bool)) b) (alpha:A#A->bool) = frc a` + ASSUME_TAC THENL + [EXPAND_TAC "frc" THEN + UNDISCH_THEN + `ring_fractionate (r:A ring) {a | ring_regular r a} = + (frc:A->(A#A->bool))` (fun _ -> ALL_TAC) THEN + ASM_REWRITE_TAC[fraction_ring] THEN + MATCH_MP_TAC LOCALEQUIV_MUL_CANCEL THEN + ASM_REWRITE_TAC[IN_ELIM_THM]; + ALL_TAC] THEN + EXISTS_TAC `b:A` THEN + EXISTS_TAC `(poly_const (r:A ring) a :(1->num)->A)` THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[POLY_CONST]; + ALL_TAC] THEN + FIRST_ASSUM(fun th -> + REWRITE_TAC[MATCH_MP th + (ASSUME `(a:A) IN ring_carrier r`)]) THEN + REWRITE_TAC[POLY_RING_CLAUSES] THEN + ASM_SIMP_TAC[GSYM POLY_CONST_MUL] THEN + REWRITE_TAC[POLY_CONST_EQ] THEN ASM_REWRITE_TAC[]; + (* ===== Variable case ===== *) + X_GEN_TAC `i:1` THEN DISCH_TAC THEN + EXISTS_TAC `ring_1 (r:A ring)` THEN + EXISTS_TAC `(poly_var (r:A ring) (i:1) :(1->num)->A)` THEN + REWRITE_TAC[RING_1] THEN CONJ_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_NONTRIVIAL; TRIVIAL_RING_10]; + ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[POLY_VAR] THEN ASM_REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o + (poly_var (r:A ring) (i:1) :(1->num)->A) = + poly_var (fraction_ring r) i` SUBST1_TAC THENL + [MATCH_MP_TAC POLY_COMPOSE_HOMOMORPHISM_VAR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `poly_const (fraction_ring (r:A ring)) + ((frc:A->(A#A->bool)) (ring_1 r)) = + ring_1 (poly_ring (fraction_ring r) (:1))` SUBST1_TAC THENL + [SUBGOAL_THEN `(frc:A->(A#A->bool)) (ring_1 r) = + ring_1 (fraction_ring (r:A ring))` SUBST1_TAC THENL + [ASM_MESON_TAC[RING_HOMOMORPHISM_1]; ALL_TAC] THEN + REWRITE_TAC[POLY_RING_CLAUSES; poly_1]; ALL_TAC] THEN + MATCH_MP_TAC RING_MUL_LID THEN + REWRITE_TAC[POLY_VAR] THEN ASM_REWRITE_TAC[IN_UNIV]; + (* ===== Addition case ===== *) + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 + (X_CHOOSE_THEN `c1:A` + (X_CHOOSE_THEN `g1:(1->num)->A` STRIP_ASSUME_TAC)) + (X_CHOOSE_THEN `c2:A` + (X_CHOOSE_THEN `g2:(1->num)->A` STRIP_ASSUME_TAC))))) THEN + EXISTS_TAC `ring_mul r c1 (c2:A)` THEN + EXISTS_TAC + `ring_add (poly_ring r (:1)) + (ring_mul (poly_ring r (:1)) (poly_const (r:A ring) c2) + (g1:(1->num)->A)) + (ring_mul (poly_ring r (:1)) (poly_const r c1) g2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_MUL_EQ_0]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC RING_MUL THEN ASM_SIMP_TAC[POLY_CONST]; + ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o + ring_add (poly_ring (r:A ring) (:1)) + (ring_mul (poly_ring r (:1)) (poly_const r c2) g1) + (ring_mul (poly_ring r (:1)) (poly_const r c1) + (g2:(1->num)->A)) = + ring_add (poly_ring (fraction_ring r) (:1)) + (ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c2)) + (frc o g1)) + (ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) (frc c1)) (frc o g2))` + SUBST1_TAC THENL + [UNDISCH_TAC + `ring_homomorphism (poly_ring (r:A ring) (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + DISCH_THEN(fun hth -> + let add_th = MATCH_MP RING_HOMOMORPHISM_ADD hth in + let mul_th = MATCH_MP RING_HOMOMORPHISM_MUL hth in + MP_TAC(SPECL + [`ring_mul (poly_ring (r:A ring) (:1)) + (poly_const r c2) (g1:(1->num)->A)`; + `ring_mul (poly_ring r (:1)) + (poly_const r c1) (g2:(1->num)->A)`] add_th) THEN + MP_TAC(SPECL [`(poly_const (r:A ring) c2 :(1->num)->A)`; + `g1:(1->num)->A`] mul_th) THEN + MP_TAC(SPECL [`(poly_const (r:A ring) c1 :(1->num)->A)`; + `g2:(1->num)->A`] mul_th)) THEN + ASM_SIMP_TAC[POLY_CONST; RING_MUL] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[] THEN + REPEAT DISCH_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + clear_denom_subst_tac THEN + MATCH_MP_TAC(RING_RULE + `(a:B) IN ring_carrier r /\ b IN ring_carrier r /\ + x IN ring_carrier r /\ y IN ring_carrier r + ==> ring_mul r (ring_mul r a b) (ring_add r x y) = + ring_add r + (ring_mul r b (ring_mul r a x)) + (ring_mul r a (ring_mul r b y))`) THEN + ASM_SIMP_TAC[POLY_CONST]; + (* ===== Multiplication case ===== *) + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 + (X_CHOOSE_THEN `c1:A` + (X_CHOOSE_THEN `g1:(1->num)->A` STRIP_ASSUME_TAC)) + (X_CHOOSE_THEN `c2:A` + (X_CHOOSE_THEN `g2:(1->num)->A` STRIP_ASSUME_TAC))))) THEN + EXISTS_TAC `ring_mul r c1 (c2:A)` THEN + EXISTS_TAC `ring_mul (poly_ring r (:1)) (g1:(1->num)->A) g2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_MUL_EQ_0]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o + ring_mul (poly_ring (r:A ring) (:1)) (g1:(1->num)->A) g2 = + ring_mul (poly_ring (fraction_ring r) (:1)) + (frc o g1) (frc o g2)` SUBST1_TAC THENL + [UNDISCH_TAC + `ring_homomorphism (poly_ring (r:A ring) (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + DISCH_THEN(fun hth -> + MP_TAC(SPECL [`g1:(1->num)->A`; `g2:(1->num)->A`] + (MATCH_MP RING_HOMOMORPHISM_MUL hth))) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT DISCH_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + clear_denom_subst_tac THEN + MATCH_MP_TAC(RING_RULE + `(a:B) IN ring_carrier r /\ b IN ring_carrier r /\ + x IN ring_carrier r /\ y IN ring_carrier r + ==> ring_mul r (ring_mul r a b) (ring_mul r x y) = + ring_mul r (ring_mul r a x) (ring_mul r b y)`) THEN + ASM_SIMP_TAC[POLY_CONST]]));; + +(* A primitive polynomial over a UFD is irreducible in R[X] + iff its image in Frac(R)[X] is irreducible. *) + +let IRREDUCIBLE_PRIMITIVE_POLY_FRACTION_RING = prove + (`!(r:A ring) f. + UFD r /\ + f IN ring_carrier(poly_ring r (:1)) /\ + 1 <= poly_deg r f /\ + (!p. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) + (poly_const r p) f) + ==> (ring_irreducible (poly_ring r (:1)) f <=> + ring_irreducible + (poly_ring (fraction_ring r) (:1)) + (ring_fractionate r + {a | ring_regular r a} o f))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC + `frc:A->(A#A->bool) = + ring_fractionate r {a | ring_regular r a}` THEN + SUBGOAL_THEN `integral_domain (r:A ring)` ASSUME_TAC THENL + [ASM_MESON_TAC[UFD_IMP_INTEGRAL_DOMAIN]; ALL_TAC] THEN + SUBGOAL_THEN `field(fraction_ring (r:A ring))` ASSUME_TAC THENL + [ASM_REWRITE_TAC[FRACTION_FIELD]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_monomorphism (r:A ring,fraction_ring r) frc` + ASSUME_TAC THENL + [EXPAND_TAC "frc" THEN REWRITE_TAC[RING_MONOMORPHISM_FRACTIONATE]; + ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN ring_carrier r + ==> (frc:A->(A#A->bool)) x IN + ring_carrier(fraction_ring r)` + ASSUME_TAC THENL + [UNDISCH_TAC `ring_monomorphism(r:A ring,fraction_ring r) frc` THEN + REWRITE_TAC[ring_monomorphism; ring_homomorphism; + SUBSET; FORALL_IN_IMAGE] THEN + MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_monomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` + ASSUME_TAC THENL + [MATCH_MP_TAC RING_MONOMORPHISM_POLY_RINGS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `ring_polynomial r (f:(1->num)->A)` ASSUME_TAC THENL + [ASM_MESON_TAC[IN_POLY_RING_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN + `poly_deg (fraction_ring r) + ((frc:A->(A#A->bool)) o (f:(1->num)->A)) = poly_deg r f` + ASSUME_TAC THENL + [MATCH_MP_TAC POLY_DEG_MONOMORPHIC_IMAGE THEN + ASM_MESON_TAC[IN_POLY_RING_CARRIER; SUBSET_UNIV]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` + ASSUME_TAC THENL + [ASM_MESON_TAC[RING_MONOMORPHISM_IMP_HOMOMORPHISM]; ALL_TAC] THEN + SUBGOAL_THEN + `!p:(1->num)->A. p IN ring_carrier(poly_ring r (:1)) + ==> (frc:A->(A#A->bool)) o p IN + ring_carrier(poly_ring (fraction_ring r) (:1))` + ASSUME_TAC THENL + [GEN_TAC THEN + FIRST_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [ring_homomorphism]) THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN MESON_TAC[]; + ALL_TAC] THEN + EQ_TAC THENL + [(* Forward: f irred in R[X] => frc o f irred in K[X] *) + DISCH_TAC THEN + SUBGOAL_THEN + `integral_domain + (poly_ring (fraction_ring (r:A ring)) (:1))` + ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_POLY_RING; FIELD_IMP_INTEGRAL_DOMAIN]; + ALL_TAC] THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (f:(1->num)->A) IN + ring_carrier(poly_ring (fraction_ring r) (:1))` + ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `~((frc:A->(A#A->bool)) o (f:(1->num)->A) = + ring_0(poly_ring (fraction_ring (r:A ring)) (:1)))` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`poly_ring (r:A ring) (:1)`; + `poly_ring (fraction_ring (r:A ring)) (:1)`; + `\p:(1->num)->A. (frc:A->(A#A->bool)) o p`; + `f:(1->num)->A`] RING_MONOMORPHISM_EQ_0) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_MESON_TAC[ring_irreducible]; ALL_TAC] THEN + REWRITE_TAC[ring_irreducible] THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [DISCH_TAC THEN + SUBGOAL_THEN + `?c:(A#A->bool). + ring_unit (fraction_ring (r:A ring)) c /\ + (frc:A->(A#A->bool)) o (f:(1->num)->A) = + poly_const (fraction_ring r) c` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[RING_UNIT_POLY_DOMAIN; FIELD_IMP_INTEGRAL_DOMAIN]; + ALL_TAC] THEN + UNDISCH_TAC `1 <= poly_deg (r:A ring) (f:(1->num)->A)` THEN + UNDISCH_TAC + `poly_deg (fraction_ring r) + ((frc:A->(A#A->bool)) o (f:(1->num)->A)) = poly_deg r f` THEN + ASM_REWRITE_TAC[POLY_DEG_CONST] THEN ARITH_TAC; + ALL_TAC] THEN + (* Divisor property *) + MAP_EVERY X_GEN_TAC + [`g':(1->num)->(A#A->bool)`; `h':(1->num)->(A#A->bool)`] THEN + STRIP_TAC THEN + SUBGOAL_THEN + `ring_prime (poly_ring r (:1)) (f:(1->num)->A)` ASSUME_TAC THENL + [UNDISCH_TAC + `ring_irreducible (poly_ring r (:1)) (f:(1->num)->A)` THEN + ASM_MESON_TAC[UFD_IRREDUCIBLE_EQ_PRIME; UFD_POLY_RING]; + ALL_TAC] THEN + MP_TAC(ISPECL [`r:A ring`; `g':(1->num)->(A#A->bool)`] + POLY_CLEAR_DENOMINATORS) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `c1:A` + (X_CHOOSE_THEN `g1:(1->num)->A` STRIP_ASSUME_TAC)) THEN + MP_TAC(ISPECL [`r:A ring`; `h':(1->num)->(A#A->bool)`] + POLY_CLEAR_DENOMINATORS) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `c2:A` + (X_CHOOSE_THEN `h1:(1->num)->A` STRIP_ASSUME_TAC)) THEN + (* Normalize frc abbreviation in assumptions *) + UNDISCH_TAC + `ring_fractionate (r:A ring) {a | ring_regular r a} = + (frc:A->(A#A->bool))` THEN + DISCH_THEN(fun th -> + RULE_ASSUM_TAC(REWRITE_RULE[th]) THEN ASSUME_TAC th) THEN + SUBGOAL_THEN + `ring_mul (poly_ring r (:1)) (g1:(1->num)->A) h1 = + ring_mul (poly_ring r (:1)) + (poly_const r (ring_mul r c1 c2)) (f:(1->num)->A)` + ASSUME_TAC THENL + [(* Helper: frc o poly_const r c = poly_const K (frc c) *) + SUBGOAL_THEN + `!c:A. c IN ring_carrier r + ==> (frc:A->(A#A->bool)) o + ((poly_const (r:A ring) c) :(1->num)->A) = + poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c)` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC POLY_COMPOSE_HOMOMORPHISM_CONST THEN + ASM_MESON_TAC[RING_MONOMORPHISM_IMP_HOMOMORPHISM]; + ALL_TAC] THEN + SUBGOAL_THEN + `poly_const (r:A ring) (ring_mul r c1 c2) IN + ring_carrier(poly_ring r (:1))` ASSUME_TAC THENL + [REWRITE_TAC[POLY_CONST] THEN MATCH_MP_TAC RING_MUL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* frc o poly_const r (c1*c2) = + poly_const K (frc c1) * poly_const K (frc c2) *) + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o poly_const (r:A ring) (ring_mul r c1 c2) = + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c1)) + (poly_const (fraction_ring r) (frc c2))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `ring_mul (r:A ring) c1 c2`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MP_TAC(ISPECL [`fraction_ring (r:A ring)`; `(:1)`] + RING_HOMOMORPHISM_POLY_CONST) THEN + DISCH_THEN(MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(MP_TAC o SPECL + [`(frc:A->(A#A->bool)) c1`; + `(frc:A->(A#A->bool)) c2`]) THEN + ANTS_TAC THENL + [CONJ_TAC THEN ASM_MESON_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN AP_TERM_TAC THEN + UNDISCH_TAC + `ring_monomorphism(r:A ring,fraction_ring r) frc` THEN + DISCH_THEN(MP_TAC o + MATCH_MP RING_MONOMORPHISM_IMP_HOMOMORPHISM) THEN + DISCH_THEN(MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(MP_TAC o SPECL [`c1:A`; `c2:A`]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Reduce to K[X] via monomorphism *) + MP_TAC(ISPECL + [`poly_ring (r:A ring) (:1)`; + `poly_ring (fraction_ring (r:A ring)) (:1)`; + `\p:(1->num)->A. (frc:A->(A#A->bool)) o p`; + `ring_mul (poly_ring (r:A ring) (:1)) + (g1:(1->num)->A) (h1:(1->num)->A)`; + `ring_mul (poly_ring (r:A ring) (:1)) + (poly_const r (ring_mul r c1 c2)) (f:(1->num)->A)`] + RING_MONOMORPHISM_INJECTIVE_EQ) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + UNDISCH_TAC + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + DISCH_THEN(MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(fun mul_th -> + MP_TAC(SPECL [`g1:(1->num)->A`; `h1:(1->num)->A`] mul_th) THEN + MP_TAC(SPECL + [`((poly_const (r:A ring) (ring_mul r c1 c2)):(1->num)->A)`; + `f:(1->num)->A`] mul_th)) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN SUBST1_TAC THEN DISCH_THEN SUBST1_TAC THEN + UNDISCH_TAC + `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c1)) + (g':(1->num)->(A#A->bool)) = frc o (g1:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + UNDISCH_TAC + `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c2)) + (h':(1->num)->(A#A->bool)) = frc o (h1:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC + `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (g':(1->num)->(A#A->bool)) (h':(1->num)->(A#A->bool)) = + (frc:A->(A#A->bool)) o (f:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + (* (pc1*g')*(pc2*h') = (pc1*pc2)*(g'*h') *) + UNDISCH_TAC + `(g':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + UNDISCH_TAC + `(h':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + SUBGOAL_THEN + `poly_const (fraction_ring (r:A ring)) ((frc:A->(A#A->bool)) c1) IN + ring_carrier(poly_ring (fraction_ring r) (:1)) /\ + poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c2) IN + ring_carrier(poly_ring (fraction_ring r) (:1))` + MP_TAC THENL + [CONJ_TAC THEN ASM_SIMP_TAC[POLY_CONST]; ALL_TAC] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC(RING_RULE + `!r a b c d:A. + a IN ring_carrier r /\ b IN ring_carrier r /\ + c IN ring_carrier r /\ d IN ring_carrier r + ==> ring_mul r (ring_mul r a b) (ring_mul r c d) = + ring_mul r (ring_mul r a c) (ring_mul r b d)`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides (poly_ring r (:1)) (f:(1->num)->A) g1 \/ + ring_divides (poly_ring r (:1)) f h1` MP_TAC THENL + [MP_TAC(ISPECL + [`poly_ring (r:A ring) (:1)`; `f:(1->num)->A`; + `g1:(1->num)->A`; `h1:(1->num)->A`] + RING_PRIME_DIVIDES_MUL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC RING_DIVIDES_LMUL THEN + ASM_REWRITE_TAC[RING_DIVIDES_REFL; POLY_CONST] THEN + MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `~((g':(1->num)->(A#A->bool)) = + ring_0(poly_ring (fraction_ring (r:A ring)) (:1))) /\ + ~((h':(1->num)->(A#A->bool)) = + ring_0(poly_ring (fraction_ring r) (:1)))` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN DISCH_TAC THEN + UNDISCH_TAC + `~((frc:A->(A#A->bool)) o (f:(1->num)->A) = + ring_0(poly_ring (fraction_ring (r:A ring)) (:1)))` THEN + REWRITE_TAC[] THEN + UNDISCH_TAC + `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (g':(1->num)->(A#A->bool)) (h':(1->num)->(A#A->bool)) = + (frc:A->(A#A->bool)) o (f:(1->num)->A)` THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST1_TAC o SYM) THENL + [UNDISCH_TAC + `(h':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + MESON_TAC[RING_MUL_LZERO]; + UNDISCH_TAC + `(g':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + MESON_TAC[RING_MUL_RZERO]]; + ALL_TAC] THEN + SUBGOAL_THEN + `poly_deg (fraction_ring r) (g':(1->num)->(A#A->bool)) + + poly_deg (fraction_ring r) (h':(1->num)->(A#A->bool)) = + poly_deg (r:A ring) (f:(1->num)->A)` ASSUME_TAC THENL + [SUBGOAL_THEN + `ring_polynomial (fraction_ring r) + (g':(1->num)->(A#A->bool)) /\ + ring_polynomial (fraction_ring r) + (h':(1->num)->(A#A->bool))` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN ASM_MESON_TAC[IN_POLY_RING_CARRIER]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`fraction_ring (r:A ring)`; + `g':(1->num)->(A#A->bool)`; + `h':(1->num)->(A#A->bool)`] POLY_DEG_MUL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `field(fraction_ring (r:A ring))` THEN + UNDISCH_TAC + `~((g':(1->num)->(A#A->bool)) = + ring_0(poly_ring (fraction_ring (r:A ring)) (:1)))` THEN + UNDISCH_TAC + `~((h':(1->num)->(A#A->bool)) = + ring_0(poly_ring (fraction_ring (r:A ring)) (:1)))` THEN + REWRITE_TAC[GSYM POLY_CLAUSES] THEN + MESON_TAC[FIELD_IMP_INTEGRAL_DOMAIN]; + ALL_TAC] THEN + UNDISCH_TAC + `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (g':(1->num)->(A#A->bool)) (h':(1->num)->(A#A->bool)) = + (frc:A->(A#A->bool)) o (f:(1->num)->A)` THEN + REWRITE_TAC[GSYM POLY_CLAUSES] THEN + DISCH_THEN SUBST1_TAC THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Helper: if a'*b' = frc o f and + poly_const(frc c)*a' = frc o a and f | a, + then b' is a unit *) + SUBGOAL_THEN + `!a' b' (c:A) (a:(1->num)->A). + a' IN ring_carrier + (poly_ring (fraction_ring (r:A ring)) (:1)) /\ + b' IN ring_carrier + (poly_ring (fraction_ring r) (:1)) /\ + ~(a' = ring_0 + (poly_ring (fraction_ring r) (:1))) /\ + ring_mul (poly_ring (fraction_ring r) (:1)) a' b' = + (frc:A->(A#A->bool)) o (f:(1->num)->A) /\ + c IN ring_carrier r /\ ~(c = ring_0 r) /\ + a IN ring_carrier(poly_ring r (:1)) /\ + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c)) + a' = frc o a /\ + ring_divides (poly_ring r (:1)) f a + ==> ring_unit + (poly_ring (fraction_ring r) (:1)) b'` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [ring_divides]) THEN + DISCH_THEN(MP_TAC o CONJUNCT2 o CONJUNCT2) THEN + DISCH_THEN(X_CHOOSE_THEN `q:(1->num)->A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (q:(1->num)->A) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` + ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `(poly_const (fraction_ring (r:A ring)) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring r) (:1))` + ASSUME_TAC THENL + [ASM_SIMP_TAC[POLY_CONST]; ALL_TAC] THEN + SUBGOAL_THEN + `(poly_const (fraction_ring (r:A ring)) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool)) = + ring_mul (poly_ring (fraction_ring r) (:1)) + (b':(1->num)->(A#A->bool)) (frc o (q:(1->num)->A))` + ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC + `poly_ring (fraction_ring (r:A ring)) (:1)` + INTEGRAL_DOMAIN_MUL_LCANCEL) THEN + EXISTS_TAC `a':(1->num)->(A#A->bool)` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + TRANS_TAC EQ_TRANS + `(frc:A->(A#A->bool)) o (a:(1->num)->A)` THEN + CONJ_TAC THENL + [UNDISCH_TAC `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool)) + (a':(1->num)->(A#A->bool)) = frc o (a:(1->num)->A)` THEN + UNDISCH_TAC `(a':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + UNDISCH_TAC `(poly_const (fraction_ring (r:A ring)) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring r) (:1))` THEN + MESON_TAC[RING_MUL_SYM]; ALL_TAC] THEN + UNDISCH_TAC `(a:(1->num)->A) = ring_mul (poly_ring (r:A ring) (:1)) + (f:(1->num)->A) (q:(1->num)->A)` THEN + DISCH_THEN SUBST1_TAC THEN + MP_TAC(ISPECL [`poly_ring (r:A ring) (:1)`; + `poly_ring (fraction_ring (r:A ring)) (:1)`; + `\p:(1->num)->A. (frc:A->(A#A->bool)) o p`] + RING_HOMOMORPHISM_MUL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL + [`f:(1->num)->A`; `q:(1->num)->A`]) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN SUBST1_TAC THEN + UNDISCH_TAC `ring_mul (poly_ring (fraction_ring (r:A ring)) (:1)) + (a':(1->num)->(A#A->bool)) (b':(1->num)->(A#A->bool)) = + (frc:A->(A#A->bool)) o (f:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + UNDISCH_TAC `(a':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + UNDISCH_TAC `(b':(1->num)->(A#A->bool)) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + UNDISCH_TAC `(frc:A->(A#A->bool)) o (q:(1->num)->A) IN + ring_carrier(poly_ring (fraction_ring (r:A ring)) (:1))` THEN + MESON_TAC[RING_MUL_ASSOC]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides (poly_ring (fraction_ring (r:A ring)) (:1)) + (b':(1->num)->(A#A->bool)) + (poly_const (fraction_ring r) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool))` + ASSUME_TAC THENL + [REWRITE_TAC[ring_divides] THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `(frc:A->(A#A->bool)) o (q:(1->num)->A)` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_unit (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) + ((frc:A->(A#A->bool)) c) :(1->num)->(A#A->bool))` + ASSUME_TAC THENL + [REWRITE_TAC[RING_UNIT_POLY_CONST] THEN + UNDISCH_TAC `field(fraction_ring (r:A ring))` THEN + SIMP_TAC[FIELD_UNIT] THEN DISCH_TAC THEN CONJ_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL + [`r:A ring`; `fraction_ring (r:A ring)`; + `frc:A->(A#A->bool)`; `c:A`] + RING_MONOMORPHISM_EQ_0) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_MESON_TAC[RING_DIVIDES_UNIT]; + ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL + [DISJ2_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MAP_EVERY EXISTS_TAC + [`g':(1->num)->(A#A->bool)`; `c1:A`; `g1:(1->num)->A`] THEN + ASM_MESON_TAC[]; + DISJ1_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MAP_EVERY EXISTS_TAC + [`h':(1->num)->(A#A->bool)`; `c2:A`; `h1:(1->num)->A`] THEN + ASM_MESON_TAC[RING_MUL_SYM]]; + (* Backward: frc o f irred in K[X] => f irred in R[X] *) + DISCH_TAC THEN REWRITE_TAC[ring_irreducible] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `~(f = ring_0(poly_ring (r:A ring) (:1)))` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`poly_ring (r:A ring) (:1)`; + `poly_ring (fraction_ring (r:A ring)) (:1)`; + `\p:(1->num)->A. (frc:A->(A#A->bool)) o p`; + `f:(1->num)->A`] RING_MONOMORPHISM_EQ_0) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_MESON_TAC[ring_irreducible]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* f not a unit *) + DISCH_TAC THEN + MP_TAC(ISPECL + [`poly_ring (r:A ring) (:1)`; + `poly_ring (fraction_ring (r:A ring)) (:1)`; + `\p:(1->num)->A. (frc:A->(A#A->bool)) o p`; + `f:(1->num)->A`] RING_UNIT_HOMOMORPHIC_IMAGE) THEN + ASM_SIMP_TAC[RING_MONOMORPHISM_IMP_HOMOMORPHISM] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_MESON_TAC[ring_irreducible]; ALL_TAC] THEN + (* Divisor property: f = g*h => unit g \/ unit h *) + MAP_EVERY X_GEN_TAC [`g:(1->num)->A`; `h:(1->num)->A`] THEN + STRIP_TAC THEN + (* Helper: any degree-0 divisor of f must be a unit *) + SUBGOAL_THEN + `!g':(1->num)->A. + g' IN ring_carrier(poly_ring r (:1)) /\ + ring_divides (poly_ring r (:1)) g' f /\ + ring_unit (poly_ring (fraction_ring r) (:1)) + ((frc:A->(A#A->bool)) o g') + ==> ring_unit (poly_ring r (:1)) g'` + ASSUME_TAC THENL + [X_GEN_TAC `g':(1->num)->A` THEN STRIP_TAC THEN + SUBGOAL_THEN `ring_polynomial r (g':(1->num)->A)` ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_RING; IN_ELIM_THM]; ALL_TAC] THEN + SUBGOAL_THEN + `poly_deg (fraction_ring r) + ((frc:A->(A#A->bool)) o (g':(1->num)->A)) = poly_deg r g'` + ASSUME_TAC THENL + [MATCH_MP_TAC POLY_DEG_MONOMORPHIC_IMAGE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (g':(1->num)->A) = 0` + ASSUME_TAC THENL + [FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN + SUBGOAL_THEN + `?c:(A#A->bool). + ring_unit (fraction_ring (r:A ring)) c /\ + (frc:A->(A#A->bool)) o (g':(1->num)->A) = + poly_const (fraction_ring r) c` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[RING_UNIT_POLY_DOMAIN; FIELD_IMP_INTEGRAL_DOMAIN]; + ALL_TAC] THEN + ASM_REWRITE_TAC[POLY_DEG_CONST]; + ALL_TAC] THEN + FIRST_ASSUM(MP_TAC o MATCH_MP POLY_DEG_EQ_0) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `c:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `ring_unit (r:A ring) (c:A)` ASSUME_TAC THENL + [ASM_CASES_TAC `c = ring_0 (r:A ring)` THENL + [SUBGOAL_THEN + `(g':(1->num)->A) = ring_0(poly_ring (r:A ring) (:1))` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[POLY_RING; POLY_CONST_0]; ALL_TAC] THEN + ASM_MESON_TAC[ring_divides; RING_MUL_LZERO; POLY_RING]; + ALL_TAC] THEN + ASM_CASES_TAC `ring_unit r (c:A)` THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`r:A ring`; `c:A`] UFD_PRIME_FACTOR_EXISTS) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `p:A` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `ring_divides (poly_ring r (:1)) + (poly_const (r:A ring) c) (f:(1->num)->A)` ASSUME_TAC THENL + [UNDISCH_TAC + `ring_divides (poly_ring r (:1)) (g':(1->num)->A) f` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!m:(1->num). ring_divides (r:A ring) c ((f:(1->num)->A) m)` + ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_CONST_DIVIDES_COEFFS_EQ]; ALL_TAC] THEN + SUBGOAL_THEN + `!m:(1->num). ring_divides (r:A ring) p ((f:(1->num)->A) m)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RING_DIVIDES_TRANS THEN + EXISTS_TAC `c:A` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_divides (poly_ring r (:1)) + (poly_const (r:A ring) p) (f:(1->num)->A)` ASSUME_TAC THENL + [MATCH_MP_TAC POLY_CONST_DIVIDES_COEFFS THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[ring_prime]; + ALL_TAC] THEN + UNDISCH_TAC + `!p:A. ring_prime r p + ==> ~ring_divides (poly_ring r (:1)) + (poly_const r p) f` THEN + DISCH_THEN(MP_TAC o SPEC `p:A`) THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC + `ring_divides (poly_ring r (:1)) + (poly_const (r:A ring) p) (f:(1->num)->A)` THEN + MESON_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[RING_UNIT_POLY_DOMAIN; UFD_IMP_INTEGRAL_DOMAIN] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Apply the helper to both cases *) + SUBGOAL_THEN + `ring_unit (poly_ring (fraction_ring r) (:1)) + ((frc:A->(A#A->bool)) o (g:(1->num)->A)) \/ + ring_unit (poly_ring (fraction_ring r) (:1)) + (frc o (h:(1->num)->A))` MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o CONJUNCT2 o CONJUNCT2 o CONJUNCT2 o + GEN_REWRITE_RULE I [ring_irreducible]) THEN + DISCH_THEN(MP_TAC o SPECL + [`(frc:A->(A#A->bool)) o (g:(1->num)->A)`; + `(frc:A->(A#A->bool)) o (h:(1->num)->A)`]) THEN + ANTS_TAC THENL + [UNDISCH_TAC + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + REWRITE_TAC[ring_homomorphism] THEN STRIP_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_MESON_TAC[SUBSET; IN_IMAGE]; + SIMP_TAC[]]; ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN + `ring_divides (poly_ring r (:1)) g f /\ + ring_divides (poly_ring r (:1)) (h:(1->num)->A) f` + STRIP_ASSUME_TAC THENL + [REWRITE_TAC[ring_divides] THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [EXISTS_TAC `h:(1->num)->A` THEN ASM_REWRITE_TAC[]; + EXISTS_TAC `g:(1->num)->A` THEN ASM_MESON_TAC[RING_MUL_SYM]]; + ALL_TAC] THEN + ASM_MESON_TAC[]]);; + +(* ----------------------------------------------------------- *) +(* Eisenstein irreducibility criterion *) +(* ----------------------------------------------------------- *) + +(* Shift lemma: coefficient of (x * q) at k+1 equals q at k *) + +let POLY_MUL_VAR_COEFF_UNIVARIATE = prove + (`!(r:A ring) (q:(1->num)->A) k. + q IN ring_carrier(poly_ring r (:1)) + ==> (ring_mul (poly_ring r (:1)) (poly_var r one) q) + (\v:1. k + 1) = q(\v:1. k)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `ring_powerseries r (q:(1->num)->A)` MP_TAC THENL + [ASM_MESON_TAC[IN_POLY_RING_CARRIER; ring_polynomial]; ALL_TAC] THEN + REWRITE_TAC[ring_powerseries] THEN DISCH_TAC THEN + REWRITE_TAC[POLY_RING_CLAUSES; poly_mul; poly_var] THEN + ONCE_REWRITE_TAC[COND_RAND] THEN ONCE_REWRITE_TAC[COND_RATOR] THEN + ASM_SIMP_TAC[RING_MUL_LZERO] THEN + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [LAMBDA_PAIR] THEN + REWRITE_TAC[GSYM RING_SUM_RESTRICT_SET; GSYM LAMBDA_PAIR] THEN + REWRITE_TAC[SET_RULE + `{p:(1->num)#(1->num) | + p IN {((x:1->num),(y:1->num)) |x,y| P x y} /\ + Q p} = + {(x,y) |x,y| P x y /\ + Q(x:1->num,y:1->num)}`] THEN + REWRITE_TAC[MESON[MONOMIAL_MUL_VAR_ONE; MONOMIAL_MUL_LCANCEL] + `monomial_mul m1 m2 = (\v:1. k + 1) /\ + m1 = monomial_var (one:1) <=> + m1 = monomial_var one /\ m2 = (\v:1. k)`] THEN + REWRITE_TAC[SET_RULE + `{((x:1->num),(y:1->num)) | x = a /\ y = b} = + {(a:1->num,b:1->num)}`] THEN + ASM_SIMP_TAC[RING_SUM_SING; RING_MUL; RING_1; + RING_MUL_LID]);; + +(* Division by poly_var: x divides f iff constant term is zero *) + +let POLY_VAR_DIVIDES_UNIVARIATE = prove + (`!(r:A ring) (f:(1->num)->A). + integral_domain r /\ + f IN ring_carrier(poly_ring r (:1)) + ==> (ring_divides (poly_ring r (:1)) + (poly_var r (one:1)) f <=> + f monomial_1 = ring_0 r)`, + REPEAT STRIP_TAC THEN EQ_TAC THENL + [(* Forward: x | f ==> f(0) = 0 *) + DISCH_TAC THEN + MP_TAC(ISPECL [`poly_ring (r:A ring) (:1)`; + `r:A ring`; `\p:(1->num)->A. p monomial_1`; + `poly_var r (one:1):(1->num)->A`; `f:(1->num)->A`] + RING_DIVIDES_HOMOMORPHIC_IMAGE) THEN + ASM_REWRITE_TAC[RING_HOMOMORPHISM_MONOMIAL_1; POLY_VAR_MONOMIAL_1] THEN + REWRITE_TAC[ring_divides] THEN + ASM_MESON_TAC[RING_MUL_LZERO; RING_0]; + (* Backward: f(0) = 0 ==> x | f *) + DISCH_TAC THEN + SUBGOAL_THEN `~trivial_ring (r:A ring)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_IMP_NONTRIVIAL_RING]; ALL_TAC] THEN + MP_TAC(REWRITE_RULE[coeff] (ISPECL [`r:A ring`; `f:(1->num)->A`; + `poly_var r (one:1):(1->num)->A`] POLY_DIVISION_GEN)) THEN + ASM_REWRITE_TAC[POLY_VAR_UNIV] THEN + ANTS_TAC THENL + [SUBGOAL_THEN `poly_deg r (poly_var r (one:1):(1->num)->A) = 1` + (fun th -> ASM_REWRITE_TAC[th]) THENL + [ASM_SIMP_TAC[POLY_DEG_VAR; GSYM TRIVIAL_RING_10]; ALL_TAC] THEN + REWRITE_TAC[poly_var] THEN + SUBGOAL_THEN `(\v:1. 1) = monomial_var (one:1)` SUBST1_TAC THENL + [REWRITE_TAC[monomial_var; FUN_EQ_THM] THEN MESON_TAC[one]; + REWRITE_TAC[REFL_CLAUSE] THEN + CONV_TAC(ONCE_DEPTH_CONV COND_ELIM_CONV) THEN + REWRITE_TAC[RING_UNIT_1]]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q:(1->num)->A` (X_CHOOSE_THEN `t:(1->num)->A` + (REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC))) THEN + (* Show t = 0 by evaluating at monomial_1 *) + SUBGOAL_THEN `t = ring_0(poly_ring r (:1)):(1->num)->A` + SUBST_ALL_TAC THENL + [SUBGOAL_THEN `(t:(1->num)->A) monomial_1 = ring_0 r` MP_TAC THENL + [SUBGOAL_THEN + `(q:(1->num)->A) monomial_1 IN ring_carrier r /\ + (t:(1->num)->A) monomial_1 IN ring_carrier r` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN `ring_polynomial r (q:(1->num)->A) /\ + ring_polynomial r (poly_var r (one:1):(1->num)->A) /\ + ring_polynomial r (t:(1->num)->A) /\ + ring_polynomial r (f:(1->num)->A)` + STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[RING_POLYNOMIAL_VAR]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o + AP_TERM `\(p:(1->num)->A). p (monomial_1:(1->num))`) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[POLY_RING_CLAUSES; poly_add] THEN + ASM_SIMP_TAC[POLY_MUL_MONOMIAL_1; POLY_VAR_MONOMIAL_1; + RING_MUL_RZERO; RING_ADD_LZERO]; ALL_TAC] THEN + DISCH_TAC THEN FIRST_X_ASSUM DISJ_CASES_TAC THENL + [SUBGOAL_THEN `ring_polynomial r (t:(1->num)->A)` ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (poly_var r (one:1):(1->num)->A) = 1` + ASSUME_TAC THENL + [ASM_SIMP_TAC[POLY_DEG_VAR; GSYM TRIVIAL_RING_10]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (t:(1->num)->A) = 0` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_ASSUM(fun th -> MP_TAC(MATCH_MP POLY_DEG_EQ_0_ALT th)) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[POLY_RING_CLAUSES; POLY_CONST_0]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + REWRITE_TAC[ring_divides] THEN ASM_REWRITE_TAC[POLY_VAR_UNIV] THEN + EXISTS_TAC `q:(1->num)->A` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SYM) THEN + ASM_SIMP_TAC[RING_ADD_RZERO; RING_MUL; POLY_VAR_UNIV] THEN + DISCH_TAC THEN + ASM_MESON_TAC[RING_MUL_SYM; POLY_VAR_UNIV]]);; + +(* poly_var r one is prime in poly_ring r (:1) over integral domain *) + +let RING_PRIME_POLY_VAR_UNIVARIATE = prove + (`!(r:A ring). + integral_domain r + ==> ring_prime (poly_ring r (:1)) (poly_var r (one:1))`, + REPEAT STRIP_TAC THEN REWRITE_TAC[ring_prime] THEN + SUBGOAL_THEN `~trivial_ring (r:A ring)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_IMP_NONTRIVIAL_RING]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[POLY_VAR_UNIV]; + ASM_SIMP_TAC[GSYM TRIVIAL_RING_10; POLY_RING_CLAUSES; poly_0; + POLY_VAR_EQ_CONST]; + ASM_SIMP_TAC[RING_UNIT_POLY_DOMAIN] THEN + REWRITE_TAC[NOT_EXISTS_THM; TAUT `~(p /\ q) <=> p ==> ~q`] THEN + X_GEN_TAC `c:A` THEN DISCH_TAC THEN + ASM_SIMP_TAC[POLY_VAR_EQ_CONST; GSYM TRIVIAL_RING_10]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:(1->num)->A`; `b:(1->num)->A`] THEN + STRIP_TAC THEN + SUBGOAL_THEN `ring_polynomial r (a:(1->num)->A) /\ + ring_polynomial r (b:(1->num)->A)` + STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(a:(1->num)->A) monomial_1 IN ring_carrier r /\ + (b:(1->num)->A) monomial_1 IN ring_carrier r` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + UNDISCH_TAC + `ring_divides (poly_ring (r:A ring) (:1)) + (poly_var r (one:1)) + (ring_mul (poly_ring r (:1)) + (a:(1->num)->A) (b:(1->num)->A))` THEN + ASM_SIMP_TAC[POLY_VAR_DIVIDES_UNIVARIATE; RING_MUL] THEN + REWRITE_TAC[POLY_RING_CLAUSES] THEN + ASM_SIMP_TAC[POLY_MUL_MONOMIAL_1] THEN + DISCH_TAC THEN MP_TAC(ISPECL [`r:A ring`; `(a:(1->num)->A) monomial_1`; + `(b:(1->num)->A) monomial_1`] INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]);; + +(* Eisenstein irreducibility criterion *) + +let EISENSTEIN_IRREDUCIBILITY_GEN = prove + (`!(r:A ring) p (f:(1->num)->A). + integral_domain r /\ ring_prime r p /\ + f IN ring_carrier(poly_ring r (:1)) /\ + 1 <= poly_deg r f /\ + ~ring_divides r p (coeff (poly_deg r f) f) /\ + (!k. k < poly_deg r f ==> ring_divides r p (coeff k f)) /\ + ~ring_divides r (ring_pow r p 2) (f monomial_1) + ==> !g h. g IN ring_carrier(poly_ring r (:1)) /\ + h IN ring_carrier(poly_ring r (:1)) /\ + ring_mul (poly_ring r (:1)) g h = f + ==> poly_deg r g = 0 \/ poly_deg r h = 0`, + + REWRITE_TAC[coeff] THEN + let peeling_lemma = prove + (`!d (r:A ring) (a:(1->num)->A) (b:(1->num)->A). + integral_domain r /\ + a IN ring_carrier(poly_ring r (:1)) /\ + b IN ring_carrier(poly_ring r (:1)) /\ + ~(a = ring_0(poly_ring r (:1))) /\ + ~(b = ring_0(poly_ring r (:1))) /\ + ~(b monomial_1 = ring_0 r) /\ + a monomial_1 = ring_0 r /\ + 1 <= poly_deg r b /\ + poly_deg r a = d /\ + (!k. k < d + poly_deg r b + ==> (ring_mul (poly_ring r (:1)) a b) + (\v:1. k) = ring_0 r) + ==> F`, + MATCH_MP_TAC num_WF THEN + X_GEN_TAC `d:num` THEN DISCH_THEN(LABEL_TAC "wf_ih") THEN + MAP_EVERY X_GEN_TAC [`r:A ring`; `a:(1->num)->A`; `b:(1->num)->A`] THEN + STRIP_TAC THEN + SUBGOAL_THEN `~trivial_ring(r:A ring)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_IMP_NONTRIVIAL_RING]; ALL_TAC] THEN + ASM_CASES_TAC `d = 0` THENL + [(* Base: deg(a) = 0, a =/= 0 gives a(monomial_1) =/= 0 *) + MP_TAC(REWRITE_RULE[coeff] + (ISPECL [`r:A ring`; `a:(1->num)->A`] POLY_TOP_NONZERO)) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[GSYM monomial_1] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step: deg(a) >= 1. Get a' with a = x * a' *) + SUBGOAL_THEN `ring_divides (poly_ring r (:1)) + (poly_var r (one:1)) (a:(1->num)->A)` MP_TAC THENL + [ASM_SIMP_TAC[POLY_VAR_DIVIDES_UNIVARIATE]; ALL_TAC] THEN + REWRITE_TAC[ring_divides; POLY_VAR_UNIV] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `a':(1->num)->A` + (CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "a_eq"))) THEN + SUBGOAL_THEN `~(a' = ring_0(poly_ring r (:1)):(1->num)->A)` + ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `~(a = ring_0(poly_ring r (:1)):(1->num)->A)` THEN + ASM_SIMP_TAC[RING_MUL_RZERO; POLY_VAR_UNIV]; ALL_TAC] THEN + (* Degree of a' *) + SUBGOAL_THEN `poly_deg r (a':(1->num)->A) = d - 1` + ASSUME_TAC THENL + [SUBGOAL_THEN `ring_polynomial r (poly_var r (one:1):(1->num)->A) /\ + ring_polynomial r (a':(1->num)->A)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL [REWRITE_TAC[RING_POLYNOMIAL_VAR]; + RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + MP_TAC(ISPECL [`r:A ring`; `poly_var r (one:1):(1->num)->A`; + `a':(1->num)->A`] POLY_DEG_MUL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REWRITE_TAC[poly_0; POLY_VAR_EQ_CONST] THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~(a' = ring_0(poly_ring r (:1)):(1->num)->A)` THEN + REWRITE_TAC[POLY_RING_CLAUSES; poly_0]; ALL_TAC] THEN + SUBGOAL_THEN `poly_mul r (poly_var r (one:1)) (a':(1->num)->A) = + (a:(1->num)->A)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REWRITE_TAC[POLY_RING_CLAUSES]; ALL_TAC] THEN + ASM_SIMP_TAC[POLY_DEG_VAR; GSYM TRIVIAL_RING_10] THEN + ASM_ARITH_TAC; ALL_TAC] THEN + (* Key shift identity: (a'*b)(k) = (a*b)(k+1) *) + SUBGOAL_THEN `!k. (ring_mul (poly_ring r (:1)) + (a':(1->num)->A) b)(\v:1. k) = + (ring_mul (poly_ring r (:1)) a b)(\v:1. k + 1)` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN SUBGOAL_THEN + `ring_mul (poly_ring r (:1)) (a:(1->num)->A) b = + ring_mul (poly_ring r (:1)) (poly_var r one) + (ring_mul (poly_ring r (:1)) a' b)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[GSYM RING_MUL_ASSOC; POLY_VAR_UNIV]; ALL_TAC] THEN + MATCH_MP_TAC(GSYM POLY_MUL_VAR_COEFF_UNIVARIATE) THEN + ASM_SIMP_TAC[RING_MUL]; ALL_TAC] THEN + (* a'(monomial_1) = 0 using POLY_MUL_MONOMIAL_1 *) + SUBGOAL_THEN `(a':(1->num)->A) monomial_1 = ring_0 r` + ASSUME_TAC THENL + [SUBGOAL_THEN `ring_polynomial r (a':(1->num)->A) /\ + ring_polynomial r (b:(1->num)->A)` STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_mul r ((a':(1->num)->A) monomial_1) + ((b:(1->num)->A) monomial_1) = ring_0 r` MP_TAC THENL + [SUBGOAL_THEN `ring_mul r ((a':(1->num)->A) monomial_1) + (b monomial_1) = + (ring_mul (poly_ring r (:1)) a' b) + (monomial_1:(1->num))` SUBST1_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `a':(1->num)->A`; + `b:(1->num)->A`] POLY_MUL_MONOMIAL_1) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[POLY_RING_CLAUSES] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]); ALL_TAC] THEN + SUBGOAL_THEN `(ring_mul (poly_ring r (:1)) + (a':(1->num)->A) b) monomial_1 = + (ring_mul (poly_ring r (:1)) a b) + (\v:1. 0 + 1)` SUBST1_TAC THENL + [REWRITE_TAC[monomial_1] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[ARITH_RULE `0 + 1 = 1`] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + UNDISCH_TAC `1 <= poly_deg r (b:(1->num)->A)` THEN + UNDISCH_TAC `~(d = 0)` THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(a':(1->num)->A) monomial_1 IN ring_carrier r /\ + (b:(1->num)->A) monomial_1 IN ring_carrier r` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + DISCH_TAC THEN MP_TAC(ISPECL [`r:A ring`; + `(a':(1->num)->A) monomial_1`; + `(b:(1->num)->A) monomial_1`] INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Apply IH with d-1 *) + USE_THEN "wf_ih" (MP_TAC o SPEC `d - 1`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPECL + [`r:A ring`; `a':(1->num)->A`; `b:(1->num)->A`]) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + USE_THEN "a_eq" (SUBST1_TAC o SYM) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC) in + REPEAT GEN_TAC THEN STRIP_TAC THEN + MAP_EVERY X_GEN_TAC [`g:(1->num)->A`; `h:(1->num)->A`] THEN + STRIP_TAC THEN + ASM_CASES_TAC `poly_deg r (g:(1->num)->A) = 0` THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `poly_deg r (h:(1->num)->A) = 0` THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `~(g = ring_0(poly_ring r (:1)):(1->num)->A) /\ + ~(h = ring_0(poly_ring r (:1)):(1->num)->A)` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN DISCH_TAC THENL + [UNDISCH_TAC `~(poly_deg r (g:(1->num)->A) = 0)`; + UNDISCH_TAC `~(poly_deg r (h:(1->num)->A) = 0)`] THEN + ASM_REWRITE_TAC[POLY_RING_CLAUSES; POLY_DEG_0]; ALL_TAC] THEN + SUBGOAL_THEN `ring_polynomial r (g:(1->num)->A) /\ + ring_polynomial r (h:(1->num)->A) /\ + ring_polynomial r (f:(1->num)->A)` STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(p:A) IN ring_carrier r /\ ~(p = ring_0 r)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime]; ALL_TAC] THEN + ABBREV_TAC `j = ideal_generated (r:A ring) {p:A}` THEN + SUBGOAL_THEN `prime_ideal (r:A ring) j` ASSUME_TAC THENL + [EXPAND_TAC "j" THEN ASM_MESON_TAC[RING_PRIME_IDEAL]; ALL_TAC] THEN + SUBGOAL_THEN `ring_ideal (r:A ring) j` ASSUME_TAC THENL + [ASM_MESON_TAC[prime_ideal; proper_ideal]; ALL_TAC] THEN + SUBGOAL_THEN `integral_domain(quotient_ring (r:A ring) j)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[INTEGRAL_DOMAIN_QUOTIENT_RING]; ALL_TAC] THEN + SUBGOAL_THEN `!a:A. a IN ring_carrier r + ==> (ring_coset r j a = ring_0(quotient_ring r j) <=> + ring_divides r p a)` (LABEL_TAC "coset_eq") THENL + [X_GEN_TAC `a:A` THEN DISCH_TAC THEN + ASM_SIMP_TAC[QUOTIENT_RING_0] THEN + ASM_SIMP_TAC[RING_COSET_EQ_IDEAL] THEN EXPAND_TAC "j" THEN + ASM_SIMP_TAC[IN_IDEAL_GENERATED_SING_EQ]; ALL_TAC] THEN + SUBGOAL_THEN `ring_homomorphism (r, quotient_ring (r:A ring) j) + (ring_coset r j)` (LABEL_TAC "hom_coset") THENL + [MATCH_MP_TAC RING_HOMOMORPHISM_RING_COSET THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_homomorphism (poly_ring r (:1), + poly_ring (quotient_ring (r:A ring) j) (:1)) + (\q:(1->num)->A. ring_coset r j o q)` + (LABEL_TAC "hom_poly") THENL + [MATCH_MP_TAC RING_HOMOMORPHISM_POLY_RINGS THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(!m:1->num. (g:(1->num)->A) m IN ring_carrier r) /\ + (!m:1->num. (h:(1->num)->A) m IN ring_carrier r) /\ + (!m:1->num. (f:(1->num)->A) m IN ring_carrier r)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN `poly_mul r (g:(1->num)->A) h = f` ASSUME_TAC THENL + [UNDISCH_TAC `ring_mul (poly_ring r (:1)) (g:(1->num)->A) h = f` THEN + REWRITE_TAC[POLY_RING_CLAUSES]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (g:(1->num)->A) + + poly_deg r (h:(1->num)->A) = poly_deg r (f:(1->num)->A)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `g:(1->num)->A`; + `h:(1->num)->A`] POLY_DEG_MUL) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [SUBGOAL_THEN + `poly_0 (r:A ring) = + ring_0(poly_ring r (:1)):(1->num)->A` + (fun th -> ASM_REWRITE_TAC[th]) THEN + REWRITE_TAC[POLY_RING_CLAUSES]; + DISCH_TAC THEN ASM_MESON_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `(f:(1->num)->A) monomial_1 = + ring_mul r ((g:(1->num)->A) monomial_1) + ((h:(1->num)->A) monomial_1)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `g:(1->num)->A`; + `h:(1->num)->A`] POLY_MUL_MONOMIAL_1) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_coset r j o (g:(1->num)->A) IN + ring_carrier(poly_ring (quotient_ring r j) (:1)) /\ + ring_coset r j o (h:(1->num)->A) IN + ring_carrier(poly_ring (quotient_ring r j) (:1)) /\ + ring_coset r j o (f:(1->num)->A) IN + ring_carrier(poly_ring (quotient_ring r j) (:1))` + STRIP_ASSUME_TAC THENL + [USE_THEN "hom_poly" (MP_TAC o REWRITE_RULE + [ring_homomorphism; SUBSET; FORALL_IN_IMAGE]) THEN + STRIP_TAC THEN REPEAT CONJ_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_mul (poly_ring (quotient_ring (r:A ring) j) (:1)) + (ring_coset r j o (g:(1->num)->A)) + (ring_coset r j o h) = + ring_coset r j o (f:(1->num)->A)` ASSUME_TAC THENL + [USE_THEN "hom_poly" (MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(MP_TAC o SPECL [`g:(1->num)->A`; `h:(1->num)->A`]) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + AP_TERM_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `poly_mul (quotient_ring (r:A ring) j) + (ring_coset r j o (g:(1->num)->A)) + (ring_coset r j o (h:(1->num)->A)) = + ring_coset r j o (f:(1->num)->A)` ASSUME_TAC THENL + [UNDISCH_TAC `ring_mul (poly_ring (quotient_ring (r:A ring) j) (:1)) + (ring_coset r j o (g:(1->num)->A)) + (ring_coset r j o h) = + ring_coset r j o (f:(1->num)->A)` THEN + REWRITE_TAC[POLY_RING_CLAUSES]; ALL_TAC] THEN + SUBGOAL_THEN + `!k. k < poly_deg r (f:(1->num)->A) + ==> (ring_coset r j o f) (\v:1. k) = + ring_0(quotient_ring (r:A ring) j)` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN REWRITE_TAC[o_THM] THEN + USE_THEN "coset_eq" + (MP_TAC o SPEC `(f:(1->num)->A) (\v:1. k)`) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `~((ring_coset r j o (f:(1->num)->A)) + (\v:1. poly_deg r f) = + ring_0(quotient_ring (r:A ring) j))` ASSUME_TAC THENL + [REWRITE_TAC[o_THM] THEN USE_THEN "coset_eq" + (MP_TAC o SPEC `(f:(1->num)->A) (\v:1. poly_deg r f)`) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_polynomial (quotient_ring (r:A ring) j) + (ring_coset r j o (g:(1->num)->A)) /\ + ring_polynomial (quotient_ring r j) + (ring_coset r j o (h:(1->num)->A)) /\ + ring_polynomial (quotient_ring r j) + (ring_coset r j o (f:(1->num)->A))` STRIP_ASSUME_TAC THENL + [RULE_ASSUM_TAC(REWRITE_RULE[IN_POLY_RING_CARRIER]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg (quotient_ring (r:A ring) j) + (ring_coset r j o (f:(1->num)->A)) = poly_deg r f` + ASSUME_TAC THENL + [ONCE_REWRITE_TAC[GSYM LE_ANTISYM] THEN CONJ_TAC THENL + [MATCH_MP_TAC POLY_DEG_HOMOMORPHIC_IMAGE THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`quotient_ring (r:A ring) j`; + `ring_coset r j o (f:(1->num)->A)`; + `(\v:1. poly_deg r (f:(1->num)->A)):1->num`; + `poly_deg r (f:(1->num)->A)`] POLY_DEG_GE) THEN + ASM_REWRITE_TAC[MONOMIAL_DEG_UNIVARIATE; + LE_REFL; o_THM]]; ALL_TAC] THEN + SUBGOAL_THEN `~(ring_coset r j o (f:(1->num)->A) = + ring_0(poly_ring (quotient_ring r j) (:1)) + :(1->num)->(A->bool))` ASSUME_TAC THENL + [DISCH_TAC THEN UNDISCH_TAC + `~((ring_coset r j o (f:(1->num)->A)) + (\v:1. poly_deg r f) = + ring_0(quotient_ring (r:A ring) j))` THEN + ASM_REWRITE_TAC[POLY_RING_CLAUSES; poly_0; poly_const] THEN + COND_CASES_TAC THEN REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `~(ring_coset r j o (g:(1->num)->A) = + ring_0(poly_ring (quotient_ring r j) (:1)) + :(1->num)->(A->bool)) /\ + ~(ring_coset r j o (h:(1->num)->A) = + ring_0(poly_ring (quotient_ring r j) (:1)) + :(1->num)->(A->bool))` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN DISCH_TAC THEN UNDISCH_TAC + `~(ring_coset r j o (f:(1->num)->A) = + ring_0(poly_ring (quotient_ring r j) (:1)) + :(1->num)->(A->bool))` THEN + UNDISCH_TAC `ring_mul (poly_ring (quotient_ring (r:A ring) j) (:1)) + (ring_coset r j o (g:(1->num)->A)) (ring_coset r j o h) = + ring_coset r j o (f:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + ASM_SIMP_TAC[RING_MUL_LZERO; RING_MUL_RZERO]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg (quotient_ring (r:A ring) j) + (ring_coset r j o (g:(1->num)->A)) <= poly_deg r g /\ + poly_deg (quotient_ring r j) + (ring_coset r j o (h:(1->num)->A)) <= poly_deg r h` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC POLY_DEG_HOMOMORPHIC_IMAGE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg (quotient_ring (r:A ring) j) + (ring_coset r j o (g:(1->num)->A)) + + poly_deg (quotient_ring r j) + (ring_coset r j o (h:(1->num)->A)) = + poly_deg r (f:(1->num)->A)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`quotient_ring (r:A ring) j`; + `ring_coset r j o (g:(1->num)->A)`; + `ring_coset r j o (h:(1->num)->A)`] POLY_DEG_MUL) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [SUBGOAL_THEN `poly_0 (quotient_ring (r:A ring) j) = + ring_0(poly_ring (quotient_ring r j) (:1)) + :(1->num)->(A->bool)` + (fun th -> ASM_REWRITE_TAC[th]) THEN REWRITE_TAC[POLY_RING_CLAUSES]; + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg (quotient_ring (r:A ring) j) + (ring_coset r j o (g:(1->num)->A)) = poly_deg r g /\ + poly_deg (quotient_ring r j) + (ring_coset r j o (h:(1->num)->A)) = poly_deg r h` + STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `ring_mul (quotient_ring (r:A ring) j) + (ring_coset r j ((g:(1->num)->A) monomial_1)) + (ring_coset r j ((h:(1->num)->A) monomial_1)) = + ring_0(quotient_ring r j)` ASSUME_TAC THENL + [USE_THEN "hom_coset" (MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(MP_TAC o SPECL [`(g:(1->num)->A) monomial_1`; + `(h:(1->num)->A) monomial_1`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN + USE_THEN "coset_eq" (MP_TAC o SPEC `ring_mul r + ((g:(1->num)->A) monomial_1) ((h:(1->num)->A) monomial_1)`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC RING_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `(f:(1->num)->A) monomial_1 = + ring_mul r ((g:(1->num)->A) monomial_1) + ((h:(1->num)->A) monomial_1)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN REWRITE_TAC[monomial_1] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `ring_coset r j ((g:(1->num)->A) monomial_1) = + ring_0(quotient_ring (r:A ring) j) \/ + ring_coset r j ((h:(1->num)->A) monomial_1) = + ring_0(quotient_ring r j)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`quotient_ring (r:A ring) j`; + `ring_coset r j ((g:(1->num)->A) monomial_1):A->bool`; + `ring_coset r j ((h:(1->num)->A) monomial_1):A->bool`] + INTEGRAL_DOMAIN_MUL_EQ_0) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THEN + USE_THEN "hom_coset" (MP_TAC o REWRITE_RULE + [ring_homomorphism; SUBSET; FORALL_IN_IMAGE]) THEN + STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `~(ring_coset r j ((g:(1->num)->A) monomial_1) = + ring_0(quotient_ring (r:A ring) j) /\ + ring_coset r j ((h:(1->num)->A) monomial_1) = + ring_0(quotient_ring r j))` ASSUME_TAC THENL + [STRIP_TAC THEN UNDISCH_TAC + `~ring_divides r (ring_pow r (p:A) 2) + ((f:(1->num)->A) monomial_1)` THEN + REWRITE_TAC[] THEN ASM_SIMP_TAC[RING_POW_2] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `ring_divides r (p:A) ((g:(1->num)->A) monomial_1) /\ + ring_divides r p ((h:(1->num)->A) monomial_1)` + STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RING_DIVIDES_MUL2 THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM DISJ_CASES_TAC THENL + [(* Case 1: pi(g(0)) = 0 *) + SUBGOAL_THEN `~(ring_coset r j ((h:(1->num)->A) monomial_1) = + ring_0(quotient_ring (r:A ring) j))` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`poly_deg r (g:(1->num)->A)`; + `quotient_ring (r:A ring) j`; + `ring_coset r j o (g:(1->num)->A)`; + `ring_coset r j o (h:(1->num)->A)`] + peeling_lemma) THEN + ANTS_TAC THENL + [REWRITE_TAC[o_THM] THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + REWRITE_TAC[]]; + (* Case 2: pi(h(0)) = 0 *) + SUBGOAL_THEN `~(ring_coset r j ((g:(1->num)->A) monomial_1) = + ring_0(quotient_ring (r:A ring) j))` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `ring_mul (poly_ring (quotient_ring (r:A ring) j) (:1)) + (ring_coset r j o (h:(1->num)->A)) (ring_coset r j o g) = + ring_coset r j o (f:(1->num)->A)` ASSUME_TAC THENL + [UNDISCH_TAC `ring_mul (poly_ring (quotient_ring (r:A ring) j) (:1)) + (ring_coset r j o (g:(1->num)->A)) (ring_coset r j o h) = + ring_coset r j o (f:(1->num)->A)` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN MATCH_MP_TAC RING_MUL_SYM THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `poly_deg r (h:(1->num)->A) + + poly_deg r (g:(1->num)->A) = poly_deg r (f:(1->num)->A)` + ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`poly_deg r (h:(1->num)->A)`; + `quotient_ring (r:A ring) j`; + `ring_coset r j o (h:(1->num)->A)`; + `ring_coset r j o (g:(1->num)->A)`] + peeling_lemma) THEN + ANTS_TAC THENL + [REWRITE_TAC[o_THM] THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + REWRITE_TAC[]]]);; + +(* Eisenstein + primitive ==> ring_irreducible in R[X] *) + +let EISENSTEIN_IRREDUCIBILITY = prove + (`!(r:A ring) p (f:(1->num)->A). + UFD r /\ ring_prime r p /\ + f IN ring_carrier(poly_ring r (:1)) /\ + 1 <= poly_deg r f /\ + ~ring_divides r p (coeff (poly_deg r f) f) /\ + (!k. k < poly_deg r f ==> ring_divides r p (coeff k f)) /\ + ~ring_divides r (ring_pow r p 2) (f monomial_1) /\ + (!q. ring_prime r q + ==> ~ring_divides (poly_ring r (:1)) + (poly_const r q) f) + ==> ring_irreducible (poly_ring r (:1)) f`, + REWRITE_TAC[coeff] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + SUBGOAL_THEN + `!d:(1->num)->A. + d IN ring_carrier(poly_ring r (:1)) /\ + ring_divides (poly_ring r (:1)) d f /\ + poly_deg r d = 0 + ==> ring_unit (poly_ring r (:1)) d` + (LABEL_TAC "deg0_unit") THENL + [X_GEN_TAC `d:(1->num)->A` THEN STRIP_TAC THEN + SUBGOAL_THEN + `?c:A. c IN ring_carrier r /\ + d:(1->num)->A = poly_const r c` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `d:(1->num)->A`] + POLY_DEG_EQ_0) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[IN_POLY_RING_CARRIER]; ASM_MESON_TAC[]]; + ALL_TAC] THEN + ASM_REWRITE_TAC[RING_UNIT_POLY_CONST] THEN + ASM_CASES_TAC `ring_unit r (c:A)` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `~(c:A = ring_0 r)` ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `1 <= poly_deg r (f:(1->num)->A)` THEN + REWRITE_TAC[NOT_LE; ARITH_RULE `x < 1 <=> x = 0`] THEN + SUBGOAL_THEN + `f = ring_0(poly_ring r (:1)):(1->num)->A` + (fun th -> REWRITE_TAC[th; POLY_RING; POLY_DEG_0]) THEN + ASM_MESON_TAC[ring_divides; POLY_CONST_0; + RING_MUL_LZERO; POLY_RING]; ALL_TAC] THEN + MP_TAC(ISPECL [`r:A ring`; `c:A`] + UFD_PRIME_FACTOR_EXISTS) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `q:A` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `q:A`) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC RING_DIVIDES_TRANS THEN + EXISTS_TAC `poly_const r (c:A):(1->num)->A` THEN + CONJ_TAC THENL + [ASM_MESON_TAC[RING_DIVIDES_HOMOMORPHIC_IMAGE; + RING_HOMOMORPHISM_POLY_CONST]; + ASM_MESON_TAC[]]; ALL_TAC] THEN + REWRITE_TAC[ring_irreducible] THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + DISCH_TAC THEN + UNDISCH_TAC `1 <= poly_deg r (f:(1->num)->A)` THEN + ASM_REWRITE_TAC[POLY_RING; POLY_DEG_0] THEN ARITH_TAC; + DISCH_TAC THEN + MP_TAC(ISPECL [`r:A ring`; `(:1)`; `f:(1->num)->A`] + POLY_DEG_UNIT) THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + MAP_EVERY X_GEN_TAC [`g:(1->num)->A`; `h:(1->num)->A`] THEN + STRIP_TAC THEN + MP_TAC(ISPECL [`r:A ring`; `p:A`; `f:(1->num)->A`] + (REWRITE_RULE[coeff] EISENSTEIN_IRREDUCIBILITY_GEN)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL + [`g:(1->num)->A`; `h:(1->num)->A`]) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THENL + [DISJ1_TAC; DISJ2_TAC] THEN + USE_THEN "deg0_unit" MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[ring_divides; RING_MUL_SYM]]);; + +(* Eisenstein irreducibility over the fraction field: reduce to the + primitive case via POLY_MAKE_PRIMITIVE, then compose + EISENSTEIN_IRREDUCIBILITY and IRREDUCIBLE_PRIMITIVE_POLY_FRACTION_RING *) + +let EISENSTEIN_IRREDUCIBILITY_FRACTION_RING = prove + (`!(r:A ring) p (f:(1->num)->A). + UFD r /\ ring_prime r p /\ + f IN ring_carrier(poly_ring r (:1)) /\ + 1 <= poly_deg r f /\ + ~ring_divides r p (coeff (poly_deg r f) f) /\ + (!k. k < poly_deg r f ==> ring_divides r p (coeff k f)) /\ + ~ring_divides r (ring_pow r p 2) (f monomial_1) + ==> ring_irreducible + (poly_ring (fraction_ring r) (:1)) + (ring_fractionate r {a | ring_regular r a} o f)`, + REWRITE_TAC[coeff] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(ASSUME_TAC o MATCH_MP UFD_IMP_INTEGRAL_DOMAIN) THEN + ABBREV_TAC + `frc:A->(A#A->bool) = + ring_fractionate r {a | ring_regular r a}` THEN + SUBGOAL_THEN `field(fraction_ring (r:A ring))` ASSUME_TAC THENL + [ASM_REWRITE_TAC[FRACTION_FIELD]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_monomorphism (r:A ring,fraction_ring r) frc` + ASSUME_TAC THENL + [EXPAND_TAC "frc" THEN + REWRITE_TAC[RING_MONOMORPHISM_FRACTIONATE]; ALL_TAC] THEN + SUBGOAL_THEN + `ring_homomorphism (r:A ring,fraction_ring r) frc` + ASSUME_TAC THENL + [ASM_MESON_TAC[RING_MONOMORPHISM_IMP_HOMOMORPHISM]; + ALL_TAC] THEN + SUBGOAL_THEN + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring (r:A ring)) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` + ASSUME_TAC THENL + [ASM_MESON_TAC[RING_MONOMORPHISM_IMP_HOMOMORPHISM; + RING_MONOMORPHISM_POLY_RINGS]; ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN ring_carrier r + ==> (frc:A->(A#A->bool)) x IN + ring_carrier(fraction_ring r)` + ASSUME_TAC THENL + [UNDISCH_TAC + `ring_homomorphism (r:A ring,fraction_ring r) frc` THEN + REWRITE_TAC[ring_homomorphism; SUBSET; FORALL_IN_IMAGE] THEN + MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `~(f = ring_0(poly_ring r (:1)):(1->num)->A)` + ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `1 <= poly_deg r (f:(1->num)->A)` THEN + ASM_REWRITE_TAC[POLY_RING; POLY_DEG_0] THEN ARITH_TAC; + ALL_TAC] THEN + (* Factor out content: f = poly_const(c) * g, g primitive *) + MP_TAC(ISPECL [`r:A ring`; `f:(1->num)->A`] POLY_MAKE_PRIMITIVE) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `c:A` (X_CHOOSE_THEN `g:(1->num)->A` + STRIP_ASSUME_TAC)) THEN + (* Coefficient relationship: f m = c * g m *) + SUBGOAL_THEN + `!m:(1->num). (f:(1->num)->A) m = + ring_mul (r:A ring) c ((g:(1->num)->A) m)` + ASSUME_TAC THENL + [GEN_TAC THEN ASM_SIMP_TAC[POLY_RING_CLAUSES; + POLY_MUL_CONST; RING_POLYNOMIAL; BETA_THM]; + ALL_TAC] THEN + ABBREV_TAC `n = poly_deg r (f:(1->num)->A)` THEN + SUBGOAL_THEN `poly_deg r (g:(1->num)->A) = n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(p:A) IN ring_carrier r` ASSUME_TAC THENL + [ASM_MESON_TAC[ring_prime]; ALL_TAC] THEN + SUBGOAL_THEN + `(g:(1->num)->A) (\v:1. n) IN ring_carrier r` + ASSUME_TAC THENL + [ASM_MESON_TAC[POLY_MONOMIAL_IN_CARRIER]; ALL_TAC] THEN + (* p does not divide c *) + SUBGOAL_THEN `~ring_divides r (p:A) c` ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC + `~ring_divides r (p:A) + ((f:(1->num)->A) (\v:1. n))` THEN + REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(\v:1. (n:num))`) THEN + DISCH_THEN SUBST1_TAC THEN MATCH_MP_TAC RING_DIVIDES_RMUL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Transfer Eisenstein conditions to g *) + SUBGOAL_THEN + `~ring_divides r (p:A) ((g:(1->num)->A) (\v:1. n))` + ASSUME_TAC THENL + [UNDISCH_TAC + `~ring_divides r (p:A) + ((f:(1->num)->A) (\v:1. n))` THEN + REWRITE_TAC[CONTRAPOS_THM] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o + SPEC `(\v:1. (n:num))`) THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC RING_DIVIDES_LMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!k. k < n ==> + ring_divides r (p:A) ((g:(1->num)->A) (\v:1. k))` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + SUBGOAL_THEN + `ring_divides r p + (ring_mul r (c:A) ((g:(1->num)->A) (\v:1. k)))` + MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `(\v:1. k):(1->num)`) THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ASM_MESON_TAC[ring_prime; POLY_MONOMIAL_IN_CARRIER]]; + ALL_TAC] THEN + SUBGOAL_THEN + `~ring_divides r (ring_pow r (p:A) 2) + ((g:(1->num)->A) monomial_1)` + ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC + `~ring_divides r (ring_pow r (p:A) 2) + ((f:(1->num)->A) monomial_1)` THEN + REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `monomial_1:(1->num)`) THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC RING_DIVIDES_LMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Apply EISENSTEIN_IRREDUCIBILITY to g *) + SUBGOAL_THEN + `ring_irreducible (poly_ring r (:1)) (g:(1->num)->A)` + ASSUME_TAC THENL + [MATCH_MP_TAC(REWRITE_RULE[coeff] EISENSTEIN_IRREDUCIBILITY) THEN + EXISTS_TAC `p:A` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Apply IRREDUCIBLE_PRIMITIVE_POLY_FRACTION_RING to g *) + SUBGOAL_THEN + `ring_irreducible + (poly_ring (fraction_ring r) (:1)) + ((frc:A->(A#A->bool)) o (g:(1->num)->A))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`r:A ring`; `g:(1->num)->A`] + IRREDUCIBLE_PRIMITIVE_POLY_FRACTION_RING) THEN + ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC + `ring_fractionate (r:A ring) {a | ring_regular r a} = + (frc:A->(A#A->bool))` THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Show frc o f = poly_const_K(frc c) * (frc o g) *) + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (f:(1->num)->A) = + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) (frc c)) + (frc o (g:(1->num)->A))` + ASSUME_TAC THENL + [SUBGOAL_THEN + `(frc:A->(A#A->bool)) o + poly_const (r:A ring) c = + poly_const (fraction_ring r) (frc c) + :(1->num)->(A#A->bool)` + ASSUME_TAC THENL + [MATCH_MP_TAC POLY_COMPOSE_HOMOMORPHISM_CONST THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC + `f = ring_mul (poly_ring r (:1)) + (poly_const r (c:A)) (g:(1->num)->A)` THEN + DISCH_THEN SUBST1_TAC THEN + UNDISCH_TAC + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + DISCH_THEN(MP_TAC o MATCH_MP RING_HOMOMORPHISM_MUL) THEN + DISCH_THEN(MP_TAC o SPECL + [`poly_const r (c:A):(1->num)->A`; + `g:(1->num)->A`]) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[POLY_CONST]; ALL_TAC] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN SUBST1_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* poly_const_K(frc c) is a unit in K[X] *) + SUBGOAL_THEN + `ring_unit (poly_ring (fraction_ring (r:A ring)) (:1)) + (poly_const (fraction_ring r) ((frc:A->(A#A->bool)) c) + :(1->num)->(A#A->bool))` + ASSUME_TAC THENL + [REWRITE_TAC[RING_UNIT_POLY_CONST] THEN + MP_TAC(ISPEC `fraction_ring (r:A ring)` FIELD_UNIT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + CONJ_TAC THENL + [ASM_MESON_TAC[]; + ASM_MESON_TAC[RING_MONOMORPHISM_EQ_0]]; + ALL_TAC] THEN + (* frc o g is in K[X] carrier *) + SUBGOAL_THEN + `(frc:A->(A#A->bool)) o (g:(1->num)->A) IN + ring_carrier(poly_ring (fraction_ring r) (:1))` + ASSUME_TAC THENL + [UNDISCH_TAC + `ring_homomorphism (poly_ring r (:1), + poly_ring (fraction_ring r) (:1)) + (\p:(1->num)->A. (frc:A->(A#A->bool)) o p)` THEN + REWRITE_TAC[ring_homomorphism; SUBSET; + FORALL_IN_IMAGE] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Conclude via associates: frc o f = unit * (frc o g) *) + MP_TAC(ISPECL + [`poly_ring (fraction_ring (r:A ring)) (:1)`; + `(frc:A->(A#A->bool)) o (g:(1->num)->A)`; + `(frc:A->(A#A->bool)) o (f:(1->num)->A)`] + RING_ASSOCIATES_IRREDUCIBLE) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [ASM_MESON_TAC[INTEGRAL_DOMAIN_POLY_RING; + FIELD_IMP_INTEGRAL_DOMAIN]; + UNDISCH_TAC + `(frc:A->(A#A->bool)) o (f:(1->num)->A) = + ring_mul (poly_ring (fraction_ring r) (:1)) + (poly_const (fraction_ring r) (frc c)) + (frc o (g:(1->num)->A))` THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC RING_ASSOCIATES_LMUL THEN + ASM_REWRITE_TAC[]]; + DISCH_THEN(fun th -> ASM_REWRITE_TAC[GSYM th])]);; + (* ------------------------------------------------------------------------- *) (* The Frobenius automorphism. *) (* ------------------------------------------------------------------------- *) diff --git a/Library/symmetric_group.ml b/Library/symmetric_group.ml new file mode 100644 index 00000000..45c0f695 --- /dev/null +++ b/Library/symmetric_group.ml @@ -0,0 +1,971 @@ +(* ========================================================================= *) +(* The symmetric group, of permutations on a set under composition. *) +(* *) +(* Definition and basic properties, plus the key theorem that S_n is not *) +(* solvable for n >= 5, following Stillwell's "Galois Theory for Beginners". *) +(* ========================================================================= *) + +needs "Library/permutations.ml";; +needs "Library/grouptheory.ml";; + +(* ------------------------------------------------------------------------- *) +(* Basic definition and properties *) +(* ------------------------------------------------------------------------- *) + +let symmetric_group = new_definition + `symmetric_group (s:A->bool) = + group({p:A->A | p permutes s}, I:(A->A), (inverse:(A->A)->A->A), (o))`;; + +let SYMMETRIC_GROUP = prove + (`(!s:A->bool. + group_carrier(symmetric_group s) = {p | p permutes s}) /\ + (!s:A->bool. group_id(symmetric_group s) = I) /\ + (!s:A->bool. group_inv(symmetric_group s) = (inverse:(A->A)->A->A)) /\ + (!s:A->bool. group_mul(symmetric_group s) = (o))`, + REWRITE_TAC[AND_FORALL_THM; GSYM PAIR_EQ] THEN + REWRITE_TAC[group_carrier; group_id; group_inv; group_mul] THEN + REWRITE_TAC[symmetric_group; GSYM(CONJUNCT2 group_tybij)] THEN + SIMP_TAC[o_ASSOC; I_O_ID; IN_ELIM_THM; PERMUTES_COMPOSE; + PERMUTES_I; PERMUTES_INVERSE] THEN + MESON_TAC[PERMUTES_INVERSES_o]);; + +let FINITE_SYMMETRIC_GROUP = prove + (`!s:A->bool. FINITE s ==> FINITE(group_carrier(symmetric_group s))`, + SIMP_TAC[SYMMETRIC_GROUP; FINITE_PERMUTATIONS]);; + +let CARD_SYMMETRIC_GROUP = prove + (`!s:A->bool. FINITE s + ==> CARD(group_carrier(symmetric_group s)) = FACT(CARD s)`, + SIMP_TAC[SYMMETRIC_GROUP; CARD_PERMUTATIONS]);; + +let SYMMETRIC_GROUP_MUL = prove + (`!s (p:A->A) q. group_mul (symmetric_group s) p q = p o q`, + REWRITE_TAC[SYMMETRIC_GROUP]);; + +let SYMMETRIC_GROUP_INV = prove + (`!s (p:A->A). group_inv (symmetric_group s) p = inverse p`, + REWRITE_TAC[SYMMETRIC_GROUP]);; + +let SYMMETRIC_GROUP_ID = prove + (`!s:A->bool. group_id (symmetric_group s) = I`, + REWRITE_TAC[SYMMETRIC_GROUP]);; + +let SWAP_IN_SYMMETRIC_GROUP = prove + (`!s a b:A. a IN s /\ b IN s + ==> swap(a,b) IN group_carrier(symmetric_group s)`, + SIMP_TAC[SYMMETRIC_GROUP; IN_ELIM_THM; PERMUTES_SWAP]);; + +let THREE_CYCLE_IN_SYMMETRIC = prove + (`!s a b c:A. a IN s /\ b IN s /\ c IN s /\ + ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> three_cycle a b c IN + group_carrier(symmetric_group s)`, + SIMP_TAC[SYMMETRIC_GROUP; IN_ELIM_THM; PERMUTES_THREE_CYCLE]);; + +(* ------------------------------------------------------------------------- *) +(* Cayley's theorem: every group embeds into the symmetric group on *) +(* its carrier via left multiplication *) +(* ------------------------------------------------------------------------- *) + +let CAYLEY_THEOREM_EXPLICIT = prove + (`!G:A group. + group_monomorphism (G,symmetric_group(group_carrier G)) + (\a x. if x IN group_carrier G + then group_mul G a x else x)`, + GEN_TAC THEN REWRITE_TAC[GROUP_MONOMORPHISM_ALT; GROUP_HOMOMORPHISM] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; SYMMETRIC_GROUP] THEN + REWRITE_TAC[FUN_EQ_THM; o_THM; IN_ELIM_THM; I_THM] THEN + SIMP_TAC[PERMUTES_INVERSE_FUNCTION; GSYM CONJ_ASSOC] THEN CONJ_TAC THENL + [ALL_TAC; + MESON_TAC[GROUP_MUL_ASSOC; GROUP_MUL_RID; GROUP_MUL; GROUP_ID]] THEN + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + EXISTS_TAC `group_mul G (group_inv G a:A)` THEN + ASM_SIMP_TAC[GROUP_MUL; GROUP_INV] THEN + REPEAT STRIP_TAC THEN + W(MATCH_MP_TAC o GROUP_RULE o snd) THEN ASM_REWRITE_TAC[]);; + +let CAYLEY_THEOREM = prove + (`!G:A group. + ?h. h subgroup_of symmetric_group(group_carrier G) /\ + subgroup_generated (symmetric_group(group_carrier G)) h + isomorphic_group G`, + GEN_TAC THEN ONCE_REWRITE_TAC[ISOMORPHIC_GROUP_SYM] THEN + EXISTS_TAC + `group_image ((G:A group), + symmetric_group(group_carrier (G:A group))) + (\(a:A) (x:A). if x IN group_carrier G + then group_mul G a x else x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUBGROUP_GROUP_IMAGE THEN + MATCH_MP_TAC GROUP_MONOMORPHISM_IMP_HOMOMORPHISM THEN + REWRITE_TAC[CAYLEY_THEOREM_EXPLICIT]; + REWRITE_TAC[isomorphic_group] THEN + EXISTS_TAC + `\(a:A) (x:A). if x IN group_carrier (G:A group) + then group_mul G a x else x` THEN + REWRITE_TAC[GROUP_ISOMORPHISM_ONTO_IMAGE; CAYLEY_THEOREM_EXPLICIT]]);; + +let SYMMETRIC_GROUP_ACTION = prove + (`!s:A->bool. group_action (symmetric_group s) s (\f x. (f:A->A) x)`, + GEN_TAC THEN REWRITE_TAC[group_action; SYMMETRIC_GROUP; IN_ELIM_THM] THEN + SIMP_TAC[] THEN REPEAT CONJ_TAC THENL + [MESON_TAC[PERMUTES_IN_IMAGE]; + GEN_TAC THEN REWRITE_TAC[I_THM]; + REPEAT STRIP_TAC THEN REWRITE_TAC[o_THM]]);; + +(* ------------------------------------------------------------------------- *) +(* S_n is not solvable for n >= 5 *) +(* ------------------------------------------------------------------------- *) + +(* Stillwell p.26-27 (within proof of Theorem 3): "We use [the commutator *) +(* fact] to prove by induction on i that, if n >= 5, each G_i contains all *) +(* 3-cycles. [...] But G_k = {1} contains no 3-cycles, contradiction." *) +(* Stillwell credits this argument to Milgram's appendix to Artin [1]. *) + +(* Generalized chain step: works for any group with composition/inverse *) + +let CHAIN_STEP_THREE_CYCLES_GEN = prove + (`!s:A->bool (H:(A->A) group) (n:(A->A)->bool). + 5 <= CARD s /\ FINITE s /\ + n normal_subgroup_of H /\ + abelian_group(quotient_group H n) /\ + group_mul H = (o) /\ group_inv H = (inverse:(A->A)->A->A) /\ + (!a b c. a IN s /\ b IN s /\ c IN s /\ + ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> three_cycle a b c IN group_carrier H) + ==> (!a b c. a IN s /\ b IN s /\ c IN s /\ + ~(a = b) /\ ~(b = c) /\ ~(a = c) + ==> three_cycle a b c IN n)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `?d:A. d IN s /\ ~(d = a) /\ ~(d = b) /\ ~(d = c)` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC(SET_RULE + `~(s SUBSET {a,b,c:A}) + ==> ?d. d IN s /\ ~(d = a) /\ ~(d = b) /\ ~(d = c)`) THEN + DISCH_THEN(MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ] CARD_SUBSET)) THEN + REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY] THEN + MP_TAC(ISPECL [`a:A`; `b:A`; `c:A`] CARD_LE_3) THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `?e:A. e IN s /\ ~(e = a) /\ ~(e = b) /\ ~(e = c) /\ ~(e = d)` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC(SET_RULE + `~(s SUBSET {a,b,c,d:A}) + ==> ?e. e IN s /\ ~(e = a) /\ ~(e = b) /\ ~(e = c) /\ ~(e = d)`) THEN + DISCH_THEN(MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ] CARD_SUBSET)) THEN + REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY] THEN + MP_TAC(ISPECL [`a:A`; `b:A`; `c:A`; `d:A`] CARD_LE_4) THEN + ASM_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`H:(A->A) group`; `n:(A->A)->bool`] + ABELIAN_QUOTIENT_COMMUTATOR) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPECL + [`three_cycle d a (c:A)`; `three_cycle c e (b:A)`]) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `three_cycle a b (c:A) = + inverse(three_cycle d a c) o + (inverse(three_cycle c e b) o + (three_cycle d a c o three_cycle c e b))` SUBST1_TAC THENL + [MATCH_MP_TAC THREE_CYCLE_COMMUTATOR THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]);; + +(* Stillwell p.26-27 (Theorem 3 proof, second half): S_n is not solvable *) +(* for n >= 5. The proof shows that any solvability chain *) +(* G_0 > G_1 > ... > G_k = {1} must have all 3-cycles in every G_i, *) +(* contradicting G_k = {1}. *) + +let NOT_SOLVABLE_SYMMETRIC_GROUP = prove + (`!s:A->bool. FINITE s /\ 5 <= CARD s + ==> ~(solvable_group(symmetric_group s))`, + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [solvable_group]) THEN + REWRITE_TAC[SYMMETRIC_GROUP_ID] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` (X_CHOOSE_THEN `c:num->(A->A)->bool` + STRIP_ASSUME_TAC)) THEN + (* Induction: all 3-cycles are in c(i) for i <= k *) + SUBGOAL_THEN + `!i. i <= k + ==> (c:num->(A->A)->bool) i subgroup_of symmetric_group (s:A->bool) /\ + (!a b c'. a IN s /\ b IN s /\ c' IN s /\ + ~(a = b) /\ ~(b = c') /\ ~(a = c') + ==> three_cycle a b c' IN c i)` + MP_TAC THENL + [INDUCT_TAC THENL + [(* Base case: i = 0 *) + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[CARRIER_SUBGROUP_OF] THEN + SIMP_TAC[THREE_CYCLE_IN_SYMMETRIC]; + (* Inductive step: SUC i <= k *) + DISCH_TAC THEN + SUBGOAL_THEN `i <= (k:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN `i < (k:num)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(c:num->(A->A)->bool) (SUC i) normal_subgroup_of + subgroup_generated (symmetric_group (s:A->bool)) (c i) /\ + abelian_group(quotient_group + (subgroup_generated (symmetric_group s) (c i)) (c(SUC i)))` + STRIP_ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* c(SUC i) subgroup_of subgroup_generated(sym s)(c i) *) + SUBGOAL_THEN + `(c:num->(A->A)->bool) (SUC i) subgroup_of + subgroup_generated (symmetric_group (s:A->bool)) (c i)` + ASSUME_TAC THENL + [ASM_MESON_TAC[NORMAL_SUBGROUP_IMP_SUBGROUP]; ALL_TAC] THEN + (* c(SUC i) subgroup_of symmetric_group s and SUBSET c(i) *) + SUBGOAL_THEN + `(c:num->(A->A)->bool) (SUC i) subgroup_of + symmetric_group (s:A->bool) /\ + c(SUC i) SUBSET c i` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPECL [`symmetric_group (s:A->bool)`; + `(c:num->(A->A)->bool) (SUC i)`; + `(c:num->(A->A)->bool) i`] + SUBGROUP_OF_SUBGROUP_GENERATED_SUBGROUP_EQ) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* All 3-cycles in c(SUC i) via generalized chain step *) + MATCH_MP_TAC CHAIN_STEP_THREE_CYCLES_GEN THEN + EXISTS_TAC `subgroup_generated (symmetric_group (s:A->bool)) + ((c:num->(A->A)->bool) i)` THEN + ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[SUBGROUP_GENERATED; SYMMETRIC_GROUP]; + REWRITE_TAC[SUBGROUP_GENERATED; SYMMETRIC_GROUP]; + ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP] THEN + ASM_REWRITE_TAC[]]]; + (* Specialize to i = k: 3-cycles in c(k) = {I}, contradiction *) + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN REWRITE_TAC[LE_REFL] THEN + STRIP_TAC THEN + (* Find 3 distinct elements in s *) + SUBGOAL_THEN `?x:A. x IN s` STRIP_ASSUME_TAC THENL + [REWRITE_TAC[MEMBER_NOT_EMPTY] THEN + DISCH_THEN SUBST_ALL_TAC THEN + RULE_ASSUM_TAC(REWRITE_RULE[CARD_CLAUSES]) THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `?y:A. y IN s /\ ~(y = x)` STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC(SET_RULE + `~(s SUBSET {x:A}) ==> ?y. y IN s /\ ~(y = x)`) THEN + DISCH_THEN(MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ] CARD_SUBSET)) THEN + REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY] THEN + MP_TAC(ISPEC `x:A` CARD_SING) THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `?z:A. z IN s /\ ~(z = x) /\ ~(z = y)` STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC(SET_RULE + `~(s SUBSET {x:A, y}) ==> ?z. z IN s /\ ~(z = x) /\ ~(z = y)`) THEN + DISCH_THEN(MP_TAC o MATCH_MP(REWRITE_RULE[IMP_CONJ] CARD_SUBSET)) THEN + REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY] THEN + MP_TAC(ISPECL [`x:A`; `y:A`] CARD_LE_2) THEN ASM_ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`x:A`; `y:A`; `z:A`]) THEN + ASM_REWRITE_TAC[IN_SING] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`x:A`; `y:A`; `z:A`] THREE_CYCLE_NOT_I) THEN + ASM_MESON_TAC[THREE_CYCLE_NOT_I]]);; + +(* ------------------------------------------------------------------------- *) +(* Transpositions and generators of the symmetric group *) +(* ------------------------------------------------------------------------- *) + +(* Transpositions from a fixed point a generate all transpositions. *) +(* If a subgroup h of S_s contains swap(a,x) for every x in s \ {a}, *) +(* then it contains swap(x,y) for all distinct x,y in s. *) + +let POINT_TRANSPOSITIONS_GENERATE_ALL = prove + (`!s (a:A) h. + a IN s /\ + h subgroup_of (symmetric_group s) /\ + (!x. x IN s /\ ~(x = a) ==> swap(a,x) IN h) + ==> (!x y. x IN s /\ y IN s /\ ~(x = y) ==> swap(x,y) IN h)`, + REWRITE_TAC[subgroup_of; SYMMETRIC_GROUP] THEN REPEAT STRIP_TAC THEN + ASM_CASES_TAC `x:A = a` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `y:A = a` THENL [ASM_MESON_TAC[SWAP_SYM]; ALL_TAC] THEN + ASM_CASES_TAC `x:A = y` THENL [ASM_MESON_TAC[SWAP_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `swap(x:A,y) = swap(a,x) o swap(a,y) o swap(a,x)` + SUBST1_TAC THEN ASM_MESON_TAC[SWAP_TRIPLE_ALT]);; + +(* The restriction map is a group homomorphism from any subgroup of *) +(* symmetric_group s that preserves t, to symmetric_group t *) + +let RESTRICT_SYMMETRIC_GROUP_HOMOMORPHISM = prove + (`!s t (h:(A->A)->bool). + FINITE t /\ t SUBSET s /\ + h subgroup_of symmetric_group s /\ + (!f. f IN h ==> IMAGE f t = t) + ==> group_homomorphism + (subgroup_generated (symmetric_group s) h, + symmetric_group t) + (\f:A->A. \x:A. if x IN t then f x else x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `group_carrier(subgroup_generated (symmetric_group s) (h:(A->A)->bool)) = h` + ASSUME_TAC THENL + [ASM_SIMP_TAC[CARRIER_SUBGROUP_GENERATED_SUBGROUP]; ALL_TAC] THEN + SUBGOAL_THEN `!f:A->A. f IN h ==> f permutes s` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + RULE_ASSUM_TAC(REWRITE_RULE + [subgroup_of; SYMMETRIC_GROUP; SUBSET; IN_ELIM_THM]) THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[group_homomorphism] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBGROUP_GENERATED; SYMMETRIC_GROUP] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [(* IMAGE: restriction permutes t *) + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `f:A->A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`s:A->bool`; `t:A->bool`; `f:A->A`] + RESTRICT_PERMUTES_SUBSET) THEN + ASM_SIMP_TAC[]; + (* Identity: restrict(I) = I *) + REWRITE_TAC[RESTRICT_I]; + (* Inverse: restrict(inverse f) = inverse(restrict f) *) + X_GEN_TAC `f:A->A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`s:A->bool`; `t:A->bool`; `f:A->A`] + RESTRICT_INVERSE) THEN + ASM_SIMP_TAC[]; + (* Multiplication: restrict(f o g) = restrict(f) o restrict(g) *) + MAP_EVERY X_GEN_TAC [`f:A->A`; `g:A->A`] THEN STRIP_TAC THEN + MP_TAC(ISPECL [`s:A->bool`; `t:A->bool`; `f:A->A`; `g:A->A`] + RESTRICT_COMPOSE) THEN + ASM_SIMP_TAC[]]);; + +(* Helper: restricting a subgroup of symmetric_group(s) to permutations of *) +(* a subset t gives a subgroup of symmetric_group(t). *) + +let SUBGROUP_RESTRICT_PERMUTES = prove + (`!s t (h:(A->A)->bool). + t SUBSET s /\ + h subgroup_of (symmetric_group s) + ==> (h INTER group_carrier(symmetric_group t)) subgroup_of + (symmetric_group t)`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[subgroup_of; SYMMETRIC_GROUP; INTER_SUBSET] THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + REPEAT CONJ_TAC THENL + [(* I IN h *) + ASM_MESON_TAC[subgroup_of; SYMMETRIC_GROUP]; + (* I permutes t *) + REWRITE_TAC[PERMUTES_I]; + (* Closed under inverse *) + X_GEN_TAC `p:A->A` THEN STRIP_TAC THEN CONJ_TAC THENL + [SUBGOAL_THEN `(p:A->A) IN group_carrier(symmetric_group (s:A->bool))` + ASSUME_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM] THEN + MATCH_MP_TAC PERMUTES_SUBSET THEN EXISTS_TAC `t:A->bool` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `inverse (p:A->A) = + group_inv (symmetric_group (s:A->bool)) p` SUBST1_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP]; ALL_TAC] THEN + ASM_MESON_TAC[IN_SUBGROUP_INV]; + MATCH_MP_TAC PERMUTES_INVERSE THEN ASM_REWRITE_TAC[]]; + (* Closed under composition *) + MAP_EVERY X_GEN_TAC [`p:A->A`; `q:A->A`] THEN STRIP_TAC THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(p:A->A) IN group_carrier(symmetric_group (s:A->bool)) /\ + (q:A->A) IN group_carrier(symmetric_group (s:A->bool))` + STRIP_ASSUME_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM] THEN CONJ_TAC THEN + MATCH_MP_TAC PERMUTES_SUBSET THEN EXISTS_TAC `t:A->bool` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(p:A->A) o (q:A->A) = + group_mul (symmetric_group (s:A->bool)) p q` SUBST1_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP]; ALL_TAC] THEN + MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PERMUTES_COMPOSE THEN ASM_REWRITE_TAC[]]]);; + +(* Every permutation of a finite set is generated by transpositions. *) +(* If a subgroup of S_s contains all transpositions, it contains all of S_s. *) + +let ALL_TRANSPOSITIONS_GENERATE_SYMMETRIC = prove + (`!s (h:(A->A)->bool). + FINITE s /\ + h subgroup_of (symmetric_group s) /\ + (!a b. a IN s /\ b IN s /\ ~(a = b) ==> swap(a,b) IN h) + ==> group_carrier(symmetric_group s) SUBSET h`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[SYMMETRIC_GROUP; SUBSET; IN_ELIM_THM] THEN + MATCH_MP_TAC PERMUTES_INDUCT_STRONG THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [subgroup_of]) THEN + REWRITE_TAC[SYMMETRIC_GROUP] THEN ASM SET_TAC[]);; + +(* ------------------------------------------------------------------------- *) +(* Machinery for: transposition + p-cycle generates S_p *) +(* ------------------------------------------------------------------------- *) + +(* group_pow in symmetric_group is independent of the underlying set *) + +let SYMMETRIC_GROUP_POW = prove + (`!s t (sigma:A->A) n. + group_pow (symmetric_group s) sigma n = + group_pow (symmetric_group t) sigma n`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN + ASM_REWRITE_TAC[group_pow; SYMMETRIC_GROUP]);; + +(* group_pow in symmetric_group preserves membership *) + +let SYMMETRIC_GROUP_POW_IN = prove + (`!s (sigma:A->A) n a. + sigma permutes s /\ a IN s + ==> group_pow (symmetric_group s) sigma n a IN s`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN + REWRITE_TAC[group_pow; SYMMETRIC_GROUP; I_THM; o_THM] THENL + [MESON_TAC[]; + ASM_MESON_TAC[PERMUTES_IN_IMAGE]]);; + +(* Element of prime order p in S_p has no fixed points *) + +let PRIME_ORDER_PERM_NO_FIXPOINT = prove + (`!s (sigma:A->A) a. + FINITE s /\ prime(CARD s) /\ + sigma permutes s /\ + group_element_order (symmetric_group s) sigma = CARD s /\ + a IN s + ==> ~(sigma a = a)`, + REPEAT STRIP_TAC THEN + (* sigma permutes s DELETE a *) + SUBGOAL_THEN `(sigma:A->A) permutes (s DELETE (a:A))` ASSUME_TAC THENL + [MATCH_MP_TAC PERMUTES_SUPERSET THEN EXISTS_TAC `s:A->bool` THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[IN_DIFF; IN_DELETE] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(sigma:A->A) IN + group_carrier(symmetric_group(s DELETE (a:A)))` ASSUME_TAC THENL + [ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; ALL_TAC] THEN + (* sigma^(CARD s) = I in symmetric_group s *) + SUBGOAL_THEN `group_pow (symmetric_group (s:A->bool)) + (sigma:A->A) (CARD s) = group_id(symmetric_group s)` ASSUME_TAC THENL + [ASM_SIMP_TAC[GROUP_POW_EQ_ID; SYMMETRIC_GROUP; IN_ELIM_THM; + DIVIDES_REFL]; + ALL_TAC] THEN + (* Transfer to symmetric_group(s DELETE a) *) + SUBGOAL_THEN `group_pow (symmetric_group (s DELETE (a:A))) + (sigma:A->A) (CARD(s:A->bool)) = + group_id(symmetric_group(s DELETE a))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`s DELETE (a:A)`; `s:A->bool`; `sigma:A->A`; + `CARD(s:A->bool)`] SYMMETRIC_GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP]; + ALL_TAC] THEN + (* group_element_order in symm(s DELETE a) divides CARD s *) + SUBGOAL_THEN `group_element_order (symmetric_group(s DELETE (a:A))) + (sigma:A->A) divides CARD(s:A->bool)` ASSUME_TAC THENL + [ASM_SIMP_TAC[GSYM GROUP_POW_EQ_ID]; + ALL_TAC] THEN + (* Since prime(CARD s), the order is 1 or CARD s *) + SUBGOAL_THEN + `group_element_order (symmetric_group(s DELETE (a:A))) + (sigma:A->A) = 1 \/ + group_element_order (symmetric_group(s DELETE (a:A))) + (sigma:A->A) = CARD(s:A->bool)` MP_TAC THENL + [ASM_MESON_TAC[prime]; ALL_TAC] THEN + DISCH_THEN DISJ_CASES_TAC THENL + [(* Case: order = 1, so sigma = I *) + MP_TAC(ISPECL [`symmetric_group(s DELETE (a:A))`; `sigma:A->A`] + GROUP_ELEMENT_ORDER_EQ_1) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP] THEN DISCH_TAC THEN + MP_TAC(ISPEC `symmetric_group(s:A->bool)` GROUP_ELEMENT_ORDER_ID) THEN + REWRITE_TAC[SYMMETRIC_GROUP] THEN + ASM_MESON_TAC[PRIME_1]; + (* Case: order = CARD s, so CARD s divides FACT(CARD s - 1) *) + SUBGOAL_THEN `(CARD(s:A->bool)) divides FACT(CARD s - 1)` MP_TAC THENL + [SUBGOAL_THEN + `FINITE(group_carrier(symmetric_group(s DELETE (a:A))))` + ASSUME_TAC THENL + [ASM_SIMP_TAC[FINITE_SYMMETRIC_GROUP; FINITE_DELETE]; ALL_TAC] THEN + MP_TAC(ISPECL [`symmetric_group(s DELETE (a:A))`; `sigma:A->A`] + GROUP_ELEMENT_ORDER_DIVIDES_GROUP_ORDER) THEN + ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[CARD_SYMMETRIC_GROUP; FINITE_DELETE; CARD_DELETE]; + ASM_SIMP_TAC[DIVIDES_FACT_PRIME] THEN + ASM_MESON_TAC[PRIME_0; PRIME_1; + ARITH_RULE `~(p = 0) /\ ~(p = 1) ==> ~(p <= p - 1)`]]]);; + +(* Helper: order of sigma^d is still CARD s when 0 < d < CARD s *) + +let PRIME_ORDER_POW_PERM = prove + (`!s (sigma:A->A) d. + FINITE s /\ prime(CARD s) /\ + sigma permutes s /\ + group_element_order (symmetric_group s) sigma = CARD s /\ + 0 < d /\ d < CARD s + ==> group_element_order (symmetric_group s) + (group_pow (symmetric_group s) sigma d) = CARD s`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `d:num`] + GROUP_ELEMENT_ORDER_POW_GEN) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM] THEN + ASM_SIMP_TAC[ARITH_RULE `0 < d ==> ~(d = 0)`] THEN + SUBGOAL_THEN `gcd(CARD(s:A->bool), d) = 1` SUBST1_TAC THENL + [REWRITE_TAC[GSYM COPRIME_GCD] THEN + ASM_SIMP_TAC[PRIME_COPRIME_EQ] THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`CARD(s:A->bool)`; `d:num`] DIVIDES_LE) THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + REWRITE_TAC[DIV_1]]);; + +(* Orbit of a prime-order permutation covers the whole set *) + +let PRIME_ORDER_PERM_ORBIT = prove + (`!s (sigma:A->A) a x. + FINITE s /\ prime(CARD s) /\ + sigma permutes s /\ + group_element_order (symmetric_group s) sigma = CARD s /\ + a IN s /\ x IN s + ==> ?k. k < CARD s /\ + group_pow (symmetric_group s) sigma k a = x`, + REPEAT STRIP_TAC THEN + (* Show IMAGE (\k. sigma^k a) {k | k < CARD s} = s *) + SUBGOAL_THEN + `IMAGE (\k. group_pow (symmetric_group (s:A->bool)) (sigma:A->A) k a) + {k | k < CARD s} = s` MP_TAC THENL + [ALL_TAC; + REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM] THEN + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN + MESON_TAC[]] THEN + MATCH_MP_TAC CARD_SUBSET_EQ THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* IMAGE is a subset of s *) + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SYMMETRIC_GROUP_POW_IN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* CARD of IMAGE = CARD s by injectivity *) + MATCH_MP_TAC EQ_TRANS THEN + EXISTS_TAC `CARD {k:num | k < CARD(s:A->bool)}` THEN CONJ_TAC THENL + [MATCH_MP_TAC CARD_IMAGE_INJ THEN + REWRITE_TAC[FINITE_NUMSEG_LT; IN_ELIM_THM] THEN + (* Injectivity: sigma^i(a) = sigma^j(a) with i,j < p ==> i = j *) + MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN STRIP_TAC THEN + (* Suffices to show: for any d with 0 < d < CARD s, + sigma^d(a) <> a. Then i = j by contradiction. *) + ASM_CASES_TAC `i:num = j` THEN ASM_REWRITE_TAC[] THEN + (* Derive a contradictory fixed point *) + SUBGOAL_THEN `?d. 0 < d /\ d < CARD(s:A->bool) /\ + group_pow (symmetric_group s) (sigma:A->A) d a = a` MP_TAC THENL + [ASM_CASES_TAC `i:num < j` THENL + [EXISTS_TAC `j - i:num` THEN CONJ_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + (* sigma^j(a) = (sigma^i o sigma^{j-i})(a), and + sigma^j(a) = sigma^i(a) *) + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; + `i:num`; `j - i:num`] GROUP_POW_ADD) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM] THEN + ASM_SIMP_TAC[ARITH_RULE `i < j ==> i + (j - i) = j:num`] THEN + REWRITE_TAC[SYMMETRIC_GROUP; o_THM] THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`group_pow (symmetric_group (s:A->bool)) (sigma:A->A) i`; + `s:A->bool`] PERMUTES_INJECTIVE) THEN + ANTS_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `i:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + ALL_TAC] THEN + DISCH_THEN(fun th -> MP_TAC(fst(EQ_IMP_RULE(SPECL + [`group_pow (symmetric_group (s:A->bool)) (sigma:A->A) (j - i) (a:A)`; + `a:A`] th)))) THEN + ANTS_TAC THENL + [UNDISCH_TAC + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) j = + group_pow (symmetric_group s) sigma i o + group_pow (symmetric_group s) sigma (j - i)` THEN + DISCH_THEN(fun th -> + REWRITE_TAC[GSYM(REWRITE_RULE[o_THM] (AP_THM th `a:A`))]) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + (* i > j case: symmetric, use i - j *) + EXISTS_TAC `i - j:num` THEN CONJ_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; + `j:num`; `i - j:num`] GROUP_POW_ADD) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM] THEN + ASM_SIMP_TAC[ARITH_RULE + `~(i < j) /\ ~(i:num = j) ==> j + (i - j) = i`] THEN + REWRITE_TAC[SYMMETRIC_GROUP; o_THM] THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`group_pow (symmetric_group (s:A->bool)) (sigma:A->A) j`; + `s:A->bool`] PERMUTES_INJECTIVE) THEN + ANTS_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `j:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + ALL_TAC] THEN + DISCH_THEN(fun th -> MP_TAC(fst(EQ_IMP_RULE(SPECL + [`group_pow (symmetric_group (s:A->bool)) (sigma:A->A) (i - j) (a:A)`; + `a:A`] th)))) THEN + ANTS_TAC THENL + [UNDISCH_TAC + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) i = + group_pow (symmetric_group s) sigma j o + group_pow (symmetric_group s) sigma (i - j)` THEN + DISCH_THEN(fun th -> + REWRITE_TAC[GSYM(REWRITE_RULE[o_THM] (AP_THM th `a:A`))]) THEN + FIRST_X_ASSUM(fun th -> REWRITE_TAC[SYM th]); + REWRITE_TAC[]]]; + ALL_TAC] THEN + (* Now we have d with 0 < d < CARD s and sigma^d(a) = a *) + STRIP_TAC THEN + SUBGOAL_THEN + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) d + permutes s` ASSUME_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `d:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + ALL_TAC] THEN + SUBGOAL_THEN + `group_element_order (symmetric_group (s:A->bool)) + (group_pow (symmetric_group s) (sigma:A->A) d) = CARD s` + ASSUME_TAC THENL + [MATCH_MP_TAC PRIME_ORDER_POW_PERM THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`s:A->bool`; + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) d`; + `a:A`] PRIME_ORDER_PERM_NO_FIXPOINT) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[CARD_NUMSEG_LT]]);; + +(* Helper: conjugate of swap(a,b) by sigma^k is swap(sigma^k a, sigma^k b) *) + +let SWAP_CONJUGATE_IN_SUBGROUP = prove + (`!s (sigma:A->A) a b h k. + FINITE s /\ + h subgroup_of symmetric_group s /\ + sigma permutes s /\ + sigma IN h /\ + swap(a,b) IN h /\ + a IN s /\ b IN s + ==> swap(group_pow (symmetric_group s) sigma k a, + group_pow (symmetric_group s) sigma k b) IN h`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) k permutes s` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `k:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + ALL_TAC] THEN + SUBGOAL_THEN + `swap(group_pow (symmetric_group (s:A->bool)) (sigma:A->A) k a, + group_pow (symmetric_group s) sigma k b) = + group_conjugation (symmetric_group s) + (group_pow (symmetric_group s) sigma k) (swap(a:A,b))` + SUBST1_TAC THENL + [REWRITE_TAC[group_conjugation; SYMMETRIC_GROUP; o_ASSOC] THEN + MP_TAC(ISPECL [`group_pow (symmetric_group (s:A->bool)) (sigma:A->A) k`; + `s:A->bool`; `a:A`; `b:A`] SWAP_CONJUGATE) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(fun th -> REWRITE_TAC[SYM th]) THEN + REWRITE_TAC[o_ASSOC]; + ALL_TAC] THEN + MATCH_MP_TAC IN_SUBGROUP_CONJUGATION THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC IN_SUBGROUP_POW THEN + ASM_REWRITE_TAC[]);; + +(* A transposition and a p-cycle generate S_p. The key step is showing that *) +(* swap(a,x) IN h for all x in s, by setting tau = sigma^m where b = tau(a) *) +(* and inducting on k to get swap(a, tau^k(a)) IN h using SWAP_TRIPLE. *) + +let TRANSPOSITION_PCYCLE_GENERATES = prove + (`!s (sigma:A->A) a b h. + FINITE s /\ prime(CARD s) /\ + h subgroup_of symmetric_group s /\ + sigma IN h /\ + group_element_order (symmetric_group s) sigma = CARD s /\ + swap(a,b) IN h /\ + a IN s /\ b IN s /\ ~(a = b) + ==> group_carrier(symmetric_group s) SUBSET h`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(sigma:A->A) permutes s` ASSUME_TAC THENL + [MP_TAC(ISPEC `symmetric_group(s:A->bool)` SUBGROUP_OF_IMP_SUBSET) THEN + DISCH_THEN(MP_TAC o SPEC `h:(A->A)->bool`) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM; SUBSET] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 1: Show swap(x,y) IN h for all x,y IN s with x <> y *) + MATCH_MP_TAC ALL_TRANSPOSITIONS_GENERATE_SYMMETRIC THEN + ASM_REWRITE_TAC[] THEN + (* Step 2: First show swap(a,x) IN h for all x IN s with x <> a *) + SUBGOAL_THEN `!x:A. x IN s /\ ~(x = a) ==> swap(a,x) IN h` + ASSUME_TAC THENL + [ALL_TAC; + (* Then derive swap(x,y) IN h for all x,y IN s *) + MAP_EVERY X_GEN_TAC [`x':A`; `y':A`] THEN STRIP_TAC THEN + ASM_CASES_TAC `(x':A) = a` THENL + [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + ASM_CASES_TAC `(y':A) = a` THENL + [ASM_REWRITE_TAC[SWAP_SYM] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `swap(x':A,y') = + group_mul (symmetric_group (s:A->bool)) + (swap(a,x')) + (group_mul (symmetric_group s) (swap(a,y')) (swap(a:A,x')))` + SUBST1_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP] THEN + CONV_TAC SYM_CONV THEN MATCH_MP_TAC SWAP_TRIPLE_ALT THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[]; + MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[]]] THEN + (* Now prove: for all x IN s with x <> a, swap(a,x) IN h *) + X_GEN_TAC `c:A` THEN STRIP_TAC THEN + (* b = sigma^m(a) for some m with 0 < m < p by orbit *) + MP_TAC(ISPECL [`s:A->bool`; `sigma:A->A`; `a:A`; `b:A`] + PRIME_ORDER_PERM_ORBIT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `0 < m` ASSUME_TAC THENL + [ASM_CASES_TAC `m = 0` THEN ASM_REWRITE_TAC[LT_NZ] THEN + UNDISCH_TAC + `group_pow (symmetric_group (s:A->bool)) (sigma:A->A) m a = b` THEN + ASM_REWRITE_TAC[group_pow; SYMMETRIC_GROUP; I_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Let tau = sigma^m. tau permutes s with order p, and tau(a) = b *) + ABBREV_TAC `tau:A->A = group_pow (symmetric_group s) sigma m` THEN + SUBGOAL_THEN `(tau:A->A) permutes s` ASSUME_TAC THENL + [EXPAND_TAC "tau" THEN + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `sigma:A->A`; `m:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + ALL_TAC] THEN + SUBGOAL_THEN `group_element_order (symmetric_group (s:A->bool)) (tau:A->A) = + CARD s` ASSUME_TAC THENL + [EXPAND_TAC "tau" THEN + MP_TAC(ISPECL [`s:A->bool`; `sigma:A->A`; `m:num`] + PRIME_ORDER_POW_PERM) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(tau:A->A) a = b` ASSUME_TAC THENL + [EXPAND_TAC "tau" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(tau:A->A) IN h` ASSUME_TAC THENL + [EXPAND_TAC "tau" THEN + MATCH_MP_TAC IN_SUBGROUP_POW THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `swap(a:A,b) IN h` ASSUME_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* c = tau^n(a) for some n with 0 < n < p by orbit *) + MP_TAC(ISPECL [`s:A->bool`; `tau:A->A`; `a:A`; `c:A`] + PRIME_ORDER_PERM_ORBIT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `0 < n` ASSUME_TAC THENL + [ASM_CASES_TAC `n = 0` THEN ASM_REWRITE_TAC[LT_NZ] THEN + UNDISCH_TAC + `group_pow (symmetric_group (s:A->bool)) (tau:A->A) n a = c` THEN + ASM_REWRITE_TAC[group_pow; SYMMETRIC_GROUP; I_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Rewrite c back to tau^n(a) so the induction result can match *) + UNDISCH_TAC `group_pow (symmetric_group (s:A->bool)) (tau:A->A) n a = c` THEN + DISCH_THEN(fun th -> REWRITE_TAC[SYM th]) THEN + (* Goal is now: swap(a, group_pow ... tau n a) IN h *) + SUBGOAL_THEN + `!k. 0 < k /\ k < CARD(s:A->bool) + ==> swap(a:A, group_pow (symmetric_group s) (tau:A->A) k a) IN h` + (fun th -> MATCH_MP_TAC th THEN ASM_REWRITE_TAC[]) THEN + INDUCT_TAC THENL [ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN + ASM_CASES_TAC `k = 0` THENL + [(* Base: n = 1, tau^1(a) = tau(a) = b, swap(a,b) IN h *) + ASM_REWRITE_TAC[ONE; group_pow; SYMMETRIC_GROUP; o_THM; I_THM]; + ALL_TAC] THEN + SUBGOAL_THEN + `swap(a:A, group_pow (symmetric_group (s:A->bool)) (tau:A->A) k a) IN h` + ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + (* tau^{SUC k}(a) = tau(tau^k(a)) *) + SUBGOAL_THEN + `group_pow (symmetric_group (s:A->bool)) (tau:A->A) (SUC k) a = + tau(group_pow (symmetric_group s) tau k a)` + SUBST1_TAC THENL + [REWRITE_TAC[group_pow; SYMMETRIC_GROUP; o_THM]; ALL_TAC] THEN + ABBREV_TAC + `x0 = group_pow (symmetric_group (s:A->bool)) (tau:A->A) k (a:A)` THEN + (* x0 IN s *) + SUBGOAL_THEN `(x0:A) IN s` ASSUME_TAC THENL + [EXPAND_TAC "x0" THEN MATCH_MP_TAC SYMMETRIC_GROUP_POW_IN THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* x0 <> a *) + SUBGOAL_THEN `~((x0:A) = a)` ASSUME_TAC THENL + [EXPAND_TAC "x0" THEN + MP_TAC(ISPECL [`s:A->bool`; + `group_pow (symmetric_group (s:A->bool)) (tau:A->A) k`; + `a:A`] PRIME_ORDER_PERM_NO_FIXPOINT) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `tau:A->A`; `k:num`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + MP_TAC(ISPECL [`s:A->bool`; `tau:A->A`; `k:num`] + PRIME_ORDER_POW_PERM) THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]; + REWRITE_TAC[]]; + ALL_TAC] THEN + (* tau(x0) <> a: tau^{SUC k} has no fixed points *) + SUBGOAL_THEN `~((tau:A->A) (x0:A) = a)` ASSUME_TAC THENL + [EXPAND_TAC "x0" THEN + SUBGOAL_THEN + `(tau:A->A) (group_pow (symmetric_group (s:A->bool)) tau k a) = + group_pow (symmetric_group s) tau (SUC k) a` + SUBST1_TAC THENL + [REWRITE_TAC[group_pow; SYMMETRIC_GROUP; o_THM]; ALL_TAC] THEN + MP_TAC(ISPECL [`s:A->bool`; + `group_pow (symmetric_group (s:A->bool)) (tau:A->A) (SUC k)`; + `a:A`] PRIME_ORDER_PERM_NO_FIXPOINT) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `tau:A->A`; `SUC k`] + GROUP_POW) THEN + ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; + MP_TAC(ISPECL [`s:A->bool`; `tau:A->A`; `SUC k`] + PRIME_ORDER_POW_PERM) THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]; + REWRITE_TAC[]]; + ALL_TAC] THEN + (* tau(x0) <> x0: tau has no fixed points *) + SUBGOAL_THEN `~((tau:A->A) (x0:A) = x0)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`s:A->bool`; `tau:A->A`; `x0:A`] + PRIME_ORDER_PERM_NO_FIXPOINT) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* swap(x0, tau(x0)) IN h by conjugation *) + SUBGOAL_THEN `swap(x0:A, (tau:A->A) x0) IN h` ASSUME_TAC THENL + [EXPAND_TAC "x0" THEN + (* tau^k(a) and tau(tau^k(a)) = tau^k(tau(a)) = tau^k(b) *) + SUBGOAL_THEN + `(tau:A->A)(group_pow (symmetric_group (s:A->bool)) tau k a) = + group_pow (symmetric_group s) tau k b` + SUBST1_TAC THENL + [SUBGOAL_THEN + `(tau:A->A)(group_pow (symmetric_group (s:A->bool)) tau k a) = + group_pow (symmetric_group s) tau k ((tau:A->A) a)` + SUBST1_TAC THENL + [(* tau(tau^k(a)) = tau^{k+1}(a) = tau^k(tau(a)) *) + SUBGOAL_THEN + `(tau:A->A)(group_pow (symmetric_group (s:A->bool)) tau k a) = + group_pow (symmetric_group s) tau (SUC k) a` + SUBST1_TAC THENL + [REWRITE_TAC[group_pow; SYMMETRIC_GROUP; o_THM]; ALL_TAC] THEN + REWRITE_TAC[ADD1] THEN + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `tau:A->A`; + `k:num`; `1`] GROUP_POW_ADD) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[SYMMETRIC_GROUP; o_THM] THEN + MP_TAC(ISPECL [`symmetric_group(s:A->bool)`; `tau:A->A`] + GROUP_POW_1) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[SYMMETRIC_GROUP; IN_ELIM_THM]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]); + ALL_TAC] THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC SWAP_CONJUGATE_IN_SUBGROUP THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* swap(a, tau(x0)) = swap(a,x0) o swap(x0,tau x0) o swap(a,x0) *) + SUBGOAL_THEN `swap(a:A, (tau:A->A) x0) = + group_mul (symmetric_group (s:A->bool)) + (swap(a,x0)) + (group_mul (symmetric_group s) (swap(x0, tau x0)) (swap(a:A,x0)))` + SUBST1_TAC THENL + [REWRITE_TAC[SYMMETRIC_GROUP] THEN + CONV_TAC SYM_CONV THEN MATCH_MP_TAC SWAP_TRIPLE THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC IN_SUBGROUP_MUL THEN ASM_REWRITE_TAC[]);; + +(* Main theorem: transitive subgroup with transposition generates S_p *) + +let TRANSITIVE_TRANSPOSITION_GENERATES_SYMMETRIC = prove + (`!s (a:A) b h. + FINITE s /\ prime(CARD s) /\ + h subgroup_of symmetric_group s /\ + (!x y. x IN s /\ y IN s ==> ?sigma. sigma IN h /\ sigma x = y) /\ + swap(a,b) IN h /\ + a IN s /\ b IN s /\ ~(a = b) + ==> group_carrier(symmetric_group s) SUBSET h`, + REPEAT STRIP_TAC THEN + (* Step 1: h is finite *) + SUBGOAL_THEN `FINITE(h:(A->A)->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `group_carrier(symmetric_group(s:A->bool))` THEN + ASM_SIMP_TAC[FINITE_SYMMETRIC_GROUP] THEN + ASM_MESON_TAC[SUBGROUP_OF_IMP_SUBSET]; + ALL_TAC] THEN + (* Step 2: Set up group action of subgroup on s *) + ABBREV_TAC `H:(A->A)group = subgroup_generated (symmetric_group s) h` THEN + SUBGOAL_THEN `group_carrier(H:(A->A)group) = h` ASSUME_TAC THENL + [EXPAND_TAC "H" THEN + MATCH_MP_TAC CARRIER_SUBGROUP_GENERATED_SUBGROUP THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `FINITE(group_carrier(H:(A->A)group))` ASSUME_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `group_action (H:(A->A)group) (s:A->bool) (\f x. f x)` + ASSUME_TAC THENL + [EXPAND_TAC "H" THEN + MATCH_MP_TAC GROUP_ACTION_FROM_SUBGROUP THEN + REWRITE_TAC[SYMMETRIC_GROUP_ACTION]; + ALL_TAC] THEN + (* Step 3: Orbit of a under H = s (by transitivity) *) + SUBGOAL_THEN + `group_orbit (H:(A->A)group) (s:A->bool) (\f x. f x) a = s` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM SUBSET_ANTISYM_EQ] THEN CONJ_TAC THENL + [REWRITE_TAC[GROUP_ORBIT_SUBSET]; + REWRITE_TAC[SUBSET; IN_GROUP_ORBIT] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`a:A`; `y:A`]) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `sigma:A->A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `sigma:A->A` THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 4: By orbit-stabilizer, CARD s divides CARD h *) + SUBGOAL_THEN `CARD(s:A->bool) divides CARD(h:(A->A)->bool)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`H:(A->A)group`; `s:A->bool`; + `\(f:A->A) (x:A). f x`; `a:A`] + ORBIT_STABILIZER_MUL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + REWRITE_TAC[divides] THEN + EXISTS_TAC `CARD(group_stabilizer (H:(A->A)group) (\f x. f x) (a:A))` THEN + ASM_MESON_TAC[MULT_SYM]; + ALL_TAC] THEN + (* Step 5: By Cauchy, H has element of order CARD s *) + MP_TAC(ISPECL [`H:(A->A)group`; `CARD(s:A->bool)`] + CAUCHY_GROUP_THEOREM) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `sigma:A->A` STRIP_ASSUME_TAC) THEN + (* Step 6: sigma has order CARD s in symmetric_group s *) + SUBGOAL_THEN + `group_element_order (symmetric_group (s:A->bool)) (sigma:A->A) = CARD s` + ASSUME_TAC THENL + [UNDISCH_TAC + `group_element_order (H:(A->A)group) (sigma:A->A) = CARD(s:A->bool)` THEN + EXPAND_TAC "H" THEN + REWRITE_TAC[GROUP_ELEMENT_ORDER_SUBGROUP_GENERATED]; + ALL_TAC] THEN + (* Step 7: sigma IN h *) + SUBGOAL_THEN `(sigma:A->A) IN h` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Step 8: Apply TRANSPOSITION_PCYCLE_GENERATES *) + MATCH_MP_TAC TRANSPOSITION_PCYCLE_GENERATES THEN + MAP_EVERY EXISTS_TAC [`sigma:A->A`; `a:A`; `b:A`] THEN + ASM_REWRITE_TAC[]);; diff --git a/Probability/characteristic_functions.ml b/Probability/characteristic_functions.ml index a44f4051..7641261f 100644 --- a/Probability/characteristic_functions.ml +++ b/Probability/characteristic_functions.ml @@ -22,19 +22,19 @@ let simple_cdf = new_definition prob p {a | a IN prob_carrier p /\ X a <= x}`;; (* Characteristic function of a simple RV (real and imaginary parts) *) -let char_fn_re = new_definition - `char_fn_re (p:A prob_space) (X:A->real) (t:real) = +let simple_char_fn_re = new_definition + `simple_char_fn_re (p:A prob_space) (X:A->real) (t:real) = simple_expectation p (\x. cos(t * X x))`;; -let char_fn_im = new_definition - `char_fn_im (p:A prob_space) (X:A->real) (t:real) = +let simple_char_fn_im = new_definition + `simple_char_fn_im (p:A prob_space) (X:A->real) (t:real) = simple_expectation p (\x. sin(t * X x))`;; (* Characteristic function at 0: phi(0) = 1 + 0i *) -let CHAR_FN_ZERO = prove +let SIMPLE_CHAR_FN_ZERO = prove (`!p:A prob_space (X:A->real). - char_fn_re p X (&0) = &1 /\ char_fn_im p X (&0) = &0`, - REPEAT GEN_TAC THEN REWRITE_TAC[char_fn_re; char_fn_im] THEN + simple_char_fn_re p X (&0) = &1 /\ simple_char_fn_im p X (&0) = &0`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_char_fn_re; simple_char_fn_im] THEN REWRITE_TAC[REAL_MUL_LZERO; SIN_0; COS_0] THEN REWRITE_TAC[SIMPLE_EXPECTATION_CONST]);; @@ -55,7 +55,7 @@ let SIMPLE_CDF_BOUNDS = prove (* Helper: composition of a function with a simple RV preserving finite range *) (* Measurability: preimage of (-inf,a] under f o X is finite union of level - sets of X, hence measurable. Currently CHEAT'd, will be filled in. *) + sets of X, hence measurable. *) let SIMPLE_RV_REAL_COMPOSE = prove (`!p:A prob_space X (f:real->real). simple_rv p X ==> simple_rv p (\x. f(X x))`, @@ -139,10 +139,10 @@ let SIMPLE_EXPECTATION_LOWER_BOUND = prove ASM_REWRITE_TAC[SIMPLE_RV_CONST]);; (* Characteristic function real part bounded by 1 *) -let CHAR_FN_RE_BOUND = prove +let SIMPLE_CHAR_FN_RE_BOUND = prove (`!p:A prob_space (X:A->real) t. - simple_rv p X ==> abs(char_fn_re p X t) <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re] THEN + simple_rv p X ==> abs(simple_char_fn_re p X t) <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_char_fn_re] THEN (* Upper bound: E[cos(tX)] <= 1 *) SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x:A. cos(t * X x)) <= &1` @@ -176,10 +176,10 @@ let CHAR_FN_RE_BOUND = prove ASM_REAL_ARITH_TAC);; (* Characteristic function imaginary part bounded by 1 *) -let CHAR_FN_IM_BOUND = prove +let SIMPLE_CHAR_FN_IM_BOUND = prove (`!p:A prob_space (X:A->real) t. - simple_rv p X ==> abs(char_fn_im p X t) <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_im] THEN + simple_rv p X ==> abs(simple_char_fn_im p X t) <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_char_fn_im] THEN SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x:A. sin(t * X x)) <= &1` ASSUME_TAC THENL @@ -601,14 +601,14 @@ let SIMPLE_EXPECTATION_PRODUCT_COMPOSE_INDEP = prove (* Characteristic function of sum of independent RVs - real part *) (* phi_{X+Y}(t) = phi_X(t) * phi_Y(t) for real part (with imaginary cross term) *) -let CHAR_FN_ADD_INDEP_RE = prove +let SIMPLE_CHAR_FN_ADD_INDEP_RE = prove (`!p:A prob_space (X:A->real) (Y:A->real) t. simple_rv p X /\ simple_rv p Y /\ indep_rv p X Y - ==> char_fn_re p (\x. X x + Y x) t = - char_fn_re p X t * char_fn_re p Y t - - char_fn_im p X t * char_fn_im p Y t`, + ==> simple_char_fn_re p (\x. X x + Y x) t = + simple_char_fn_re p X t * simple_char_fn_re p Y t - + simple_char_fn_im p X t * simple_char_fn_im p Y t`, REPEAT STRIP_TAC THEN - REWRITE_TAC[char_fn_re; char_fn_im] THEN + REWRITE_TAC[simple_char_fn_re; simple_char_fn_im] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN (* Establish simple_rv for trig compositions using ISPECL *) SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (X:A->real) x))` @@ -691,14 +691,14 @@ let CHAR_FN_ADD_INDEP_RE = prove SIMPLE_EXPECTATION_PRODUCT_COMPOSE_INDEP) THEN BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);; -let CHAR_FN_ADD_INDEP_IM = prove +let SIMPLE_CHAR_FN_ADD_INDEP_IM = prove (`!p:A prob_space (X:A->real) (Y:A->real) t. simple_rv p X /\ simple_rv p Y /\ indep_rv p X Y - ==> char_fn_im p (\x. X x + Y x) t = - char_fn_re p X t * char_fn_im p Y t + - char_fn_im p X t * char_fn_re p Y t`, + ==> simple_char_fn_im p (\x. X x + Y x) t = + simple_char_fn_re p X t * simple_char_fn_im p Y t + + simple_char_fn_im p X t * simple_char_fn_re p Y t`, REPEAT STRIP_TAC THEN - REWRITE_TAC[char_fn_re; char_fn_im] THEN + REWRITE_TAC[simple_char_fn_re; simple_char_fn_im] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN (* Establish simple_rv for trig compositions using ISPECL *) SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (X:A->real) x))` @@ -795,11 +795,11 @@ let SIMPLE_EXPECTATION_SQ_LE = prove (* |phi(t)|^2 <= 1: characteristic function modulus bound *) (* Uses E[cos(tX)]^2 + E[sin(tX)]^2 <= E[cos^2(tX)] + E[sin^2(tX)] = E[1] = 1 *) -let CHAR_FN_MODULUS_LE = prove +let SIMPLE_CHAR_FN_MODULUS_LE = prove (`!p:A prob_space (X:A->real) t. simple_rv p X - ==> char_fn_re p X t pow 2 + char_fn_im p X t pow 2 <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re; char_fn_im] THEN + ==> simple_char_fn_re p X t pow 2 + simple_char_fn_im p X t pow 2 <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_char_fn_re; simple_char_fn_im] THEN (* Establish simple_rv for cos and sin compositions *) SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (X:A->real) x))` ASSUME_TAC THENL @@ -865,17 +865,17 @@ let COMPLEX_PRODUCT_MODULUS_SQ = prove REPEAT GEN_TAC THEN CONV_TAC REAL_RING);; (* N-fold char fn modulus factorization for i.i.d. simple RVs *) -let CHAR_FN_SUM_IID_MODULUS = prove +let SIMPLE_CHAR_FN_SUM_IID_MODULUS = prove (`!p:A prob_space (X:num->A->real) n t. (!i. i <= n ==> simple_rv p (X i)) /\ (!i. i <= n ==> - char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> char_fn_re p (\x. sum(0..n) (\i. X i x)) t pow 2 + - char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = - (char_fn_re p (X 0) t pow 2 + - char_fn_im p (X 0) t pow 2) pow (SUC n)`, + ==> simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) t pow 2 + + simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = + (simple_char_fn_re p (X 0) t pow 2 + + simple_char_fn_im p (X 0) t pow 2) pow (SUC n)`, GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [(* Base case: n = 0, sum(0..0) = X 0 *) REPEAT STRIP_TAC THEN @@ -909,13 +909,13 @@ let CHAR_FN_SUM_IID_MODULUS = prove MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - CHAR_FN_ADD_INDEP_RE) THEN + SIMPLE_CHAR_FN_ADD_INDEP_RE) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - CHAR_FN_ADD_INDEP_IM) THEN + SIMPLE_CHAR_FN_ADD_INDEP_IM) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN (* Step 4: Rewrite goal and apply modulus identity *) @@ -923,19 +923,19 @@ let CHAR_FN_SUM_IID_MODULUS = prove REWRITE_TAC[COMPLEX_PRODUCT_MODULUS_SQ] THEN (* Step 5: Replace X(SUC n) char fns with X(0) *) SUBGOAL_THEN - `char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = - char_fn_re p (X 0) t /\ - char_fn_im p (X (SUC n)) t = char_fn_im p (X 0) t` + `simple_char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = + simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X (SUC n)) t = simple_char_fn_im p (X 0) t` STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[LE_REFL]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN (* Step 6: Apply IH for partial sum modulus *) SUBGOAL_THEN - `char_fn_re (p:A prob_space) + `simple_char_fn_re (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t pow 2 + - char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = - (char_fn_re p (X 0) t pow 2 + - char_fn_im p (X 0) t pow 2) pow (SUC n)` + simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = + (simple_char_fn_re p (X 0) t pow 2 + + simple_char_fn_im p (X 0) t pow 2) pow (SUC n)` SUBST1_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC THEN REPEAT CONJ_TAC THENL [ASM_MESON_TAC[ARITH_RULE `i <= n ==> i <= SUC n`]; @@ -959,14 +959,14 @@ let COS_APPROX_BOUND = prove SIMP_TAC[REAL_EVENPOW_ABS; ARITH] THEN REAL_ARITH_TAC);; (* Characteristic function real part approximation by second moment *) -let CHAR_FN_RE_APPROX = prove +let SIMPLE_CHAR_FN_RE_APPROX = prove (`!p:A prob_space (X:A->real) t. simple_rv p X - ==> abs(char_fn_re p X t - + ==> abs(simple_char_fn_re p X t - (&1 - t pow 2 * simple_expectation p (\x. X x pow 2) / &2)) <= t pow 4 * simple_expectation p (\x. X x pow 4) / &6`, REPEAT STRIP_TAC THEN - REWRITE_TAC[char_fn_re] THEN + REWRITE_TAC[simple_char_fn_re] THEN (* Establish simple_rv for composed functions *) SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (X:A->real) x))` ASSUME_TAC THENL @@ -1432,13 +1432,13 @@ let REALLIM_POW_EXP_NEG_PERTURB = prove (* Combine via triangle inequality *) ASM_REAL_ARITH_TAC);; -(* Key lemma for CLT: char_fn_re power converges to exponential *) -let CHAR_FN_RE_POW_CONV_EXP = prove +(* Key lemma for CLT: simple_char_fn_re power converges to exponential *) +let SIMPLE_CHAR_FN_RE_POW_CONV_EXP = prove (`!p:A prob_space (X:A->real) t. simple_rv p X /\ simple_expectation p X = &0 /\ &0 < simple_expectation p (\x. X x pow 2) - ==> ((\n. char_fn_re p X (t / sqrt(&(SUC n))) pow (SUC n)) + ==> ((\n. simple_char_fn_re p X (t / sqrt(&(SUC n))) pow (SUC n)) ---> exp(--(t pow 2 * simple_expectation p (\x. X x pow 2) / &2))) sequentially`, REPEAT STRIP_TAC THEN @@ -1449,7 +1449,7 @@ let CHAR_FN_RE_POW_CONV_EXP = prove (* Case t = 0: trivial *) ASM_CASES_TAC `t = &0` THENL [ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; REAL_INV_0; - CHAR_FN_ZERO; REAL_POW_ONE; + SIMPLE_CHAR_FN_ZERO; REAL_POW_ONE; REAL_POW_2; REAL_MUL_RZERO; REAL_NEG_0; REAL_EXP_0; REALLIM_CONST]; ALL_TAC] THEN @@ -1463,7 +1463,7 @@ let CHAR_FN_RE_POW_CONV_EXP = prove REAL_ARITH_TAC]; ALL_TAC] THEN ABBREV_TAC `h = \n:num. &(SUC n) * - (&1 - char_fn_re (p:A prob_space) (X:A->real) (t / sqrt(&(SUC n)))) - c` THEN + (&1 - simple_char_fn_re (p:A prob_space) (X:A->real) (t / sqrt(&(SUC n)))) - c` THEN MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC `\n. (&1 - (c + (h:num->real) n) / &(SUC n)) pow (SUC n)` THEN CONJ_TAC THENL @@ -1494,12 +1494,12 @@ let CHAR_FN_RE_POW_CONV_EXP = prove UNDISCH_TAC `~(&(SUC n) = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; - `t / sqrt(&(SUC n))`] CHAR_FN_RE_APPROX) THEN + `t / sqrt(&(SUC n))`] SIMPLE_CHAR_FN_RE_APPROX) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBGOAL_THEN - `&(SUC n) * (&1 - char_fn_re (p:A prob_space) (X:A->real) + `&(SUC n) * (&1 - simple_char_fn_re (p:A prob_space) (X:A->real) (t / sqrt(&(SUC n)))) - c = - --(&(SUC n) * (char_fn_re p X (t / sqrt(&(SUC n))) - + --(&(SUC n) * (simple_char_fn_re p X (t / sqrt(&(SUC n))) - (&1 - (t / sqrt(&(SUC n))) pow 2 * sigma_sq / &2)))` SUBST1_TAC THENL [UNDISCH_TAC `(t / sqrt (&(SUC n))) pow 2 * sigma_sq / &2 = c / &(SUC n)` THEN @@ -1534,7 +1534,7 @@ let REAL_MUL_SUB_REARRANGE = prove (* Helper: triangle inequality for the inductive step *) (* |R*r - S*s - r*r^n| <= |r|*|R - r^n| + |S|*|s| *) -let CHAR_FN_SUM_IID_TRIANGLE = prove +let SIMPLE_CHAR_FN_SUM_IID_TRIANGLE = prove (`!R S r s:real n. abs r <= &1 /\ abs S <= &1 /\ abs(R - r pow (SUC n)) <= &(SUC n) * abs s @@ -1555,18 +1555,18 @@ let CHAR_FN_SUM_IID_TRIANGLE = prove REWRITE_TAC[REAL_MUL_LID] THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC] THEN REAL_ARITH_TAC]);; -(* Bound on IID sum char_fn_re deviation from power *) +(* Bound on IID sum simple_char_fn_re deviation from power *) (* |Re(phi_sum) - (Re phi)^(n+1)| <= (n+1) * |Im phi| *) -let CHAR_FN_SUM_IID_RE_BOUND = prove +let SIMPLE_CHAR_FN_SUM_IID_RE_BOUND = prove (`!p:A prob_space (X:num->A->real) n t. (!i. i <= n ==> simple_rv p (X i)) /\ (!i. i <= n ==> - char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> abs(char_fn_re p (\x. sum(0..n) (\i. X i x)) t - - char_fn_re p (X 0) t pow (SUC n)) - <= &(SUC n) * abs(char_fn_im p (X 0) t)`, + ==> abs(simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) t - + simple_char_fn_re p (X 0) t pow (SUC n)) + <= &(SUC n) * abs(simple_char_fn_im p (X 0) t)`, GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [(* Base case: n = 0 *) REPEAT STRIP_TAC THEN @@ -1599,24 +1599,24 @@ let CHAR_FN_SUM_IID_RE_BOUND = prove MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - CHAR_FN_ADD_INDEP_RE) THEN + SIMPLE_CHAR_FN_ADD_INDEP_RE) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN SUBGOAL_THEN - `char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = - char_fn_re p (X 0) t /\ - char_fn_im p (X (SUC n)) t = char_fn_im p (X 0) t` + `simple_char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = + simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X (SUC n)) t = simple_char_fn_im p (X 0) t` STRIP_ASSUME_TAC THENL [FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[real_pow] THEN - MATCH_MP_TAC CHAR_FN_SUM_IID_TRIANGLE THEN + MATCH_MP_TAC SIMPLE_CHAR_FN_SUM_IID_TRIANGLE THEN CONJ_TAC THENL - [MATCH_MP_TAC CHAR_FN_RE_BOUND THEN + [MATCH_MP_TAC SIMPLE_CHAR_FN_RE_BOUND THEN FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC CHAR_FN_IM_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + [MATCH_MP_TAC SIMPLE_CHAR_FN_IM_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN CONJ_TAC THENL [GEN_TAC THEN DISCH_TAC THEN @@ -1640,14 +1640,14 @@ let SIN_APPROX_BOUND = prove REWRITE_TAC[IM_CX; REAL_ABS_0; REAL_EXP_0; REAL_MUL_LID] THEN SIMP_TAC[REAL_EVENPOW_ABS; ARITH] THEN REAL_ARITH_TAC);; -(* char_fn_im bound for mean-zero RVs: |E[sin(tX)]| <= |t|^3 * E[|X|^3] / 2 *) -let CHAR_FN_IM_MEAN_ZERO_BOUND = prove +(* simple_char_fn_im bound for mean-zero RVs: |E[sin(tX)]| <= |t|^3 * E[|X|^3] / 2 *) +let SIMPLE_CHAR_FN_IM_MEAN_ZERO_BOUND = prove (`!p:A prob_space (X:A->real) t. simple_rv p X /\ simple_expectation p X = &0 - ==> abs(char_fn_im p X t) + ==> abs(simple_char_fn_im p X t) <= abs(t) pow 3 * simple_expectation p (\x. abs(X x) pow 3) / &2`, REPEAT STRIP_TAC THEN - REWRITE_TAC[char_fn_im] THEN + REWRITE_TAC[simple_char_fn_im] THEN (* Establish simple_rv for sin(tX) *) SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. sin(t * (X:A->real) x))` ASSUME_TAC THENL @@ -1731,10 +1731,10 @@ let REALLIM_INV_SQRT_SUC = prove (* CLT error term: (n+1) * |Im phi(t/sqrt(n+1))| -> 0 for mean-zero X *) -let CLT_IM_ERROR_VANISHES = prove +let SIMPLE_CLT_IM_ERROR_VANISHES = prove (`!p:A prob_space (X:A->real) t. simple_rv p X /\ simple_expectation p X = &0 - ==> ((\n. &(SUC n) * abs(char_fn_im p X (t / sqrt(&(SUC n))))) + ==> ((\n. &(SUC n) * abs(simple_char_fn_im p X (t / sqrt(&(SUC n))))) ---> &0) sequentially`, REPEAT STRIP_TAC THEN ABBREV_TAC `m3 = simple_expectation (p:A prob_space) @@ -1746,7 +1746,7 @@ let CLT_IM_ERROR_VANISHES = prove REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; - `t / sqrt(&(SUC n))`] CHAR_FN_IM_MEAN_ZERO_BOUND) THEN + `t / sqrt(&(SUC n))`] SIMPLE_CHAR_FN_IM_MEAN_ZERO_BOUND) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_ABS] THEN SUBGOAL_THEN `abs(&(SUC n)) = &(SUC n)` SUBST1_TAC THENL @@ -1787,27 +1787,27 @@ let CLT_IM_ERROR_VANISHES = prove REWRITE_TAC[REALLIM_INV_SQRT_SUC]]);; (* CLT: characteristic function of IID sum converges *) -let CLT_CHAR_FN_CONVERGENCE = prove +let SIMPLE_CLT_CHAR_FN_CONVERGENCE = prove (`!p:A prob_space (X:num->A->real) t. (!n. simple_rv p (X n)) /\ simple_expectation p (X 0) = &0 /\ &0 < simple_expectation p (\x. X 0 x pow 2) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. char_fn_re p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> exp(--(t pow 2 * simple_expectation p (\x. X 0 x pow 2) / &2))) sequentially`, REPEAT STRIP_TAC THEN MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_TRANSFORM) THEN EXISTS_TAC - `\n. char_fn_re (p:A prob_space) (X 0) (t / sqrt(&(SUC n))) pow (SUC n)` THEN + `\n. simple_char_fn_re (p:A prob_space) (X 0) (t / sqrt(&(SUC n))) pow (SUC n)` THEN CONJ_TAC THENL [(* Difference -> 0 *) MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_COMPARISON) THEN EXISTS_TAC - `\n. &(SUC n) * abs(char_fn_im (p:A prob_space) (X 0) + `\n. &(SUC n) * abs(simple_char_fn_im (p:A prob_space) (X 0) (t / sqrt(&(SUC n))))` THEN CONJ_TAC THENL [(* Eventually bound *) @@ -1815,15 +1815,15 @@ let CLT_CHAR_FN_CONVERGENCE = prove X_GEN_TAC `n:num` THEN DISCH_TAC THEN ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN MATCH_MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; - `t / sqrt(&(SUC n))`] CHAR_FN_SUM_IID_RE_BOUND) THEN + `t / sqrt(&(SUC n))`] SIMPLE_CHAR_FN_SUM_IID_RE_BOUND) THEN ASM_MESON_TAC[]; (* Limit: (n+1)*|Im phi(t/sqrt(n+1))| -> 0 *) MATCH_MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CLT_IM_ERROR_VANISHES) THEN + SIMPLE_CLT_IM_ERROR_VANISHES) THEN ASM_REWRITE_TAC[]]; - (* char_fn_re pow -> exp *) + (* simple_char_fn_re pow -> exp *) MATCH_MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CHAR_FN_RE_POW_CONV_EXP) THEN + SIMPLE_CHAR_FN_RE_POW_CONV_EXP) THEN ASM_REWRITE_TAC[]]);; (* Algebraic identity for product-subtraction decomposition *) @@ -1928,46 +1928,46 @@ let S_SQ_DECOMP_BOUND = prove ASM_REAL_ARITH_TAC]);; (* Bound on Im^2 of characteristic function of IID sum: - Im_Sn^2 <= 3*(n+1)*|char_fn_im(X_0, t)| *) -let CHAR_FN_SUM_IID_IM_SQ_BOUND = prove + Im_Sn^2 <= 3*(n+1)*|simple_char_fn_im(X_0, t)| *) +let SIMPLE_CHAR_FN_SUM_IID_IM_SQ_BOUND = prove (`!p:A prob_space (X:num->A->real) n t. (!i. i <= n ==> simple_rv p (X i)) /\ (!i. i <= n ==> - char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 - <= &3 * (&(SUC n) * abs(char_fn_im p (X 0) t))`, + ==> simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 + <= &3 * (&(SUC n) * abs(simple_char_fn_im p (X 0) t))`, REPEAT STRIP_TAC THEN - ABBREV_TAC `r = char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN - ABBREV_TAC `s = char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN - ABBREV_TAC `R = char_fn_re (p:A prob_space) + ABBREV_TAC `r = simple_char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN + ABBREV_TAC `s = simple_char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN + ABBREV_TAC `R = simple_char_fn_re (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN - ABBREV_TAC `S' = char_fn_im (p:A prob_space) + ABBREV_TAC `S' = simple_char_fn_im (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN (* Step 1: R^2+S'^2 = (r^2+s^2)^(n+1) via MP_TAC *) MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; `t:real`] - CHAR_FN_SUM_IID_MODULUS) THEN + SIMPLE_CHAR_FN_SUM_IID_MODULUS) THEN ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 2: |R-r^(n+1)| <= (n+1)|s| *) MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; `t:real`] - CHAR_FN_SUM_IID_RE_BOUND) THEN + SIMPLE_CHAR_FN_SUM_IID_RE_BOUND) THEN ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 3: r^2+s^2 <= 1 *) MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CHAR_FN_MODULUS_LE) THEN + SIMPLE_CHAR_FN_MODULUS_LE) THEN ANTS_TAC THENL [ASM_MESON_TAC[LE_0]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 4: |s| <= 1 *) MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CHAR_FN_IM_BOUND) THEN + SIMPLE_CHAR_FN_IM_BOUND) THEN ANTS_TAC THENL [ASM_MESON_TAC[LE_0]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 5: |r| <= 1 *) MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CHAR_FN_RE_BOUND) THEN + SIMPLE_CHAR_FN_RE_BOUND) THEN ANTS_TAC THENL [ASM_MESON_TAC[LE_0]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 5b: |r^(n+1)| <= 1 *) @@ -1977,7 +1977,7 @@ let CHAR_FN_SUM_IID_IM_SQ_BOUND = prove (* Step 6: |R| <= 1 *) MP_TAC(ISPECL [`p:A prob_space`; `(\x:A. sum(0..n) (\i. (X:num->A->real) i x))`; `t:real`] - CHAR_FN_RE_BOUND) THEN + SIMPLE_CHAR_FN_RE_BOUND) THEN ANTS_TAC THENL [MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN @@ -2006,22 +2006,22 @@ let CHAR_FN_SUM_IID_IM_SQ_BOUND = prove ASM_REWRITE_TAC[]);; (* CLT: Imaginary part of char fn of standardized sum converges to 0 *) -let CLT_CHAR_FN_IM_CONVERGENCE = prove +let SIMPLE_CLT_CHAR_FN_IM_CONVERGENCE = prove (`!p:A prob_space (X:num->A->real) t. (!n. simple_rv p (X n)) /\ simple_expectation p (X 0) = &0 /\ &0 < simple_expectation p (\x. X 0 x pow 2) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. char_fn_im p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> &0) sequentially`, REPEAT STRIP_TAC THEN MATCH_MP_TAC REALLIM_NULL_SQABS THEN BETA_TAC THEN MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_COMPARISON) THEN EXISTS_TAC `\n. &3 * - (&(SUC n) * abs(char_fn_im (p:A prob_space) ((X:num->A->real) 0) + (&(SUC n) * abs(simple_char_fn_im (p:A prob_space) ((X:num->A->real) 0) (t / sqrt(&(SUC n)))))` THEN CONJ_TAC THENL [(* Eventually bound: |Im_Sn^2| <= 3*(n+1)*|s_n| *) @@ -2032,12 +2032,12 @@ let CLT_CHAR_FN_IM_CONVERGENCE = prove [GEN_TAC THEN MP_TAC(SPEC `y:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; ALL_TAC] THEN MATCH_MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; - `t / sqrt(&(SUC n))`] CHAR_FN_SUM_IID_IM_SQ_BOUND) THEN + `t / sqrt(&(SUC n))`] SIMPLE_CHAR_FN_SUM_IID_IM_SQ_BOUND) THEN ASM_MESON_TAC[]; (* Limit: 3 * ((n+1)*|s_n|) -> 0 *) MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_LMUL) THEN MATCH_MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - CLT_IM_ERROR_VANISHES) THEN + SIMPLE_CLT_IM_ERROR_VANISHES) THEN ASM_MESON_TAC[]]);; (* Combined CLT: characteristic function of standardized IID sum converges @@ -2047,19 +2047,19 @@ let CLT_CHAR_FN_CONVERGENCE_FULL = prove (!n. simple_rv p (X n)) /\ simple_expectation p (X 0) = &0 /\ &0 < simple_expectation p (\x. X 0 x pow 2) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. char_fn_re p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> exp(--(t pow 2 * simple_expectation p (\x. X 0 x pow 2) / &2))) sequentially /\ - ((\n. char_fn_im p (\x. sum(0..n) (\i. X i x)) + ((\n. simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> &0) sequentially`, REPEAT GEN_TAC THEN DISCH_TAC THEN CONJ_TAC THENL - [MATCH_MP_TAC CLT_CHAR_FN_CONVERGENCE; - MATCH_MP_TAC CLT_CHAR_FN_IM_CONVERGENCE] THEN + [MATCH_MP_TAC SIMPLE_CLT_CHAR_FN_CONVERGENCE; + MATCH_MP_TAC SIMPLE_CLT_CHAR_FN_IM_CONVERGENCE] THEN ASM_MESON_TAC[]);; (* Standardized CLT: after normalizing by sigma, char fn converges to @@ -2069,15 +2069,15 @@ let CLT_STANDARDIZED = prove (!n. simple_rv p (X n)) /\ simple_expectation p (X 0) = &0 /\ &0 < simple_expectation p (\x. X 0 x pow 2) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. char_fn_re p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / (sqrt(simple_expectation p (\x. X 0 x pow 2)) * sqrt(&(SUC n))))) ---> exp(--(t pow 2 / &2))) sequentially /\ - ((\n. char_fn_im p (\x. sum(0..n) (\i. X i x)) + ((\n. simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / (sqrt(simple_expectation p (\x. X 0 x pow 2)) * sqrt(&(SUC n))))) ---> &0) sequentially`, @@ -2128,14 +2128,14 @@ let CLT_VARIANCE_FORM = prove (!n. simple_rv p (X n)) /\ simple_expectation p (X 0) = &0 /\ &0 < simple_variance p (X 0) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. char_fn_re p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. simple_char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n))))) ---> exp(--(t pow 2 / &2))) sequentially /\ - ((\n. char_fn_im p (\x. sum(0..n) (\i. X i x)) + ((\n. simple_char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n))))) ---> &0) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN @@ -2974,28 +2974,6 @@ let HOEFFDING_SUM_GENERAL = prove (* AZUMA-HOEFFDING INEQUALITY *) (* ========================================================================= *) -(* Helper: strict inequality level set is in sub-sigma-algebra *) -let MEASURABLE_WRT_STRICT_LT = prove - (`!p:A prob_space G (X:A->real) v. - sub_sigma_algebra p G /\ measurable_wrt p G X - ==> {x | x IN prob_carrier p /\ X x < v} IN G`, - REPEAT STRIP_TAC THEN - REWRITE_TAC[ISPECL [`X:A->real`; `v:real`; `prob_carrier (p:A prob_space)`] - OPEN_HALFLINE_AS_UNION] THEN - MATCH_MP_TAC SIGMA_ALGEBRA_UNION_COUNTABLE THEN - CONJ_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN - CONJ_TAC THENL - [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIV] THEN - X_GEN_TAC `s:A->bool` THEN DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN - ASM_REWRITE_TAC[] THEN - UNDISCH_TAC `measurable_wrt (p:A prob_space) G X` THEN - REWRITE_TAC[measurable_wrt] THEN - DISCH_THEN(MP_TAC o SPEC `v - inv(&n + &1)`) THEN - MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN - REWRITE_TAC[EXTENSION; IN_ELIM_THM]; - REWRITE_TAC[SIMPLE_IMAGE] THEN - MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]]);; - (* Level sets of G-measurable functions are in G *) let MEASURABLE_WRT_LEVEL_SET = prove (`!p:A prob_space G (X:A->real) v. @@ -3008,12 +2986,7 @@ let MEASURABLE_WRT_LEVEL_SET = prove {x | x IN prob_carrier p /\ X x <= v} DIFF {x | x IN prob_carrier p /\ X x < v}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `y:A` THEN EQ_TAC THENL - [STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; - STRIP_TAC THEN ASM_REWRITE_TAC[] THEN - SUBGOAL_THEN `~((X:A->real) y < v)` MP_TAC THENL - [ASM_MESON_TAC[]; ASM_REAL_ARITH_TAC]]; + [SET_TAC[REAL_ARITH `!x v:real. x = v <=> x <= v /\ ~(x < v)`]; ALL_TAC] THEN MATCH_MP_TAC(ISPEC `p:A prob_space` SUB_SIGMA_ALGEBRA_DIFF) THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL @@ -3021,14 +2994,14 @@ let MEASURABLE_WRT_LEVEL_SET = prove MATCH_MP_TAC MEASURABLE_WRT_STRICT_LT THEN ASM_REWRITE_TAC[]]);; (* Martingale difference has zero expectation on any F_n-event *) -let MARTINGALE_DIFF_INDICATOR_ZERO = prove +let SIMPLE_MARTINGALE_DIFF_INDICATOR_ZERO = prove (`!p:A prob_space FF (X:num->A->real) n (B:A->bool). - martingale p FF X /\ B IN FF n + simple_martingale p FF X /\ B IN FF n ==> simple_expectation p (\x. (X (SUC n) x - X n x) * indicator_fn B x) = &0`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `(B:A->bool) IN prob_events p` ASSUME_TAC THENL - [ASM_MESON_TAC[martingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_martingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN SUBGOAL_THEN `(\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (B:A->bool) x) = (\x. X (SUC n) x * indicator_fn B x - X n x * indicator_fn B x)` @@ -3041,16 +3014,16 @@ let MARTINGALE_DIFF_INDICATOR_ZERO = prove [CONJ_TAC THENL [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL - [ASM_MESON_TAC[martingale]; + [ASM_MESON_TAC[simple_martingale]; MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL - [ASM_MESON_TAC[martingale]; + [ASM_MESON_TAC[simple_martingale]; MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]]; ALL_TAC] THEN ASM_SIMP_TAC[SIMPLE_EXPECTATION_SUB] THEN MATCH_MP_TAC(REAL_ARITH `a = b ==> a - b = &0`) THEN - ASM_MESON_TAC[martingale]);; + ASM_MESON_TAC[simple_martingale]);; (* Composition of measurable simple RV with any function is measurable *) let MEASURABLE_WRT_COMPOSE = prove @@ -3089,12 +3062,12 @@ let MEASURABLE_WRT_COMPOSE = prove MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `R:real->bool` THEN ASM_REWRITE_TAC[] THEN SET_TAC[]]);; -(* Conditional convex MGF bound for martingale differences on an event *) +(* Conditional convex MGF bound for simple_martingale differences on an event *) (* For A in FF_n: E[exp(s*D) * 1_A] <= (b/(b-a)*exp(sa) + (-a)/(b-a)*exp(sb))*P(A) *) -let MARTINGALE_DIFF_CONVEX_INDICATOR = prove +let SIMPLE_MARTINGALE_DIFF_CONVEX_INDICATOR = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (n:num) (s:real) (a:real) (b:real) (A:A->bool). - martingale p FF X /\ + simple_martingale p FF X /\ A IN FF n /\ (!x. x IN prob_carrier p ==> a <= X (SUC n) x - X n x /\ X (SUC n) x - X n x <= b) /\ @@ -3106,11 +3079,11 @@ let MARTINGALE_DIFF_CONVEX_INDICATOR = prove REPEAT STRIP_TAC THEN (* Prerequisites *) SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL - [ASM_MESON_TAC[martingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_martingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN SUBGOAL_THEN `simple_rv p (\x:A. (X:num->A->real) (SUC n) x - X n x)` ASSUME_TAC THENL [MATCH_MP_TAC SIMPLE_RV_SUB THEN REWRITE_TAC[ETA_AX] THEN - ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN SUBGOAL_THEN `~(b - a = &0)` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN (* Step 1: Pointwise bound via monotonicity *) @@ -3214,18 +3187,18 @@ let MARTINGALE_DIFF_CONVEX_INDICATOR = prove ALL_TAC] THEN BETA_TAC THEN DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[]; ALL_TAC] THEN - (* Step 3: E[D*1_A] = 0 from MARTINGALE_DIFF_INDICATOR_ZERO *) + (* Step 3: E[D*1_A] = 0 from SIMPLE_MARTINGALE_DIFF_INDICATOR_ZERO *) MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `n:num`; `A:A->bool`] - MARTINGALE_DIFF_INDICATOR_ZERO) THEN + SIMPLE_MARTINGALE_DIFF_INDICATOR_ZERO) THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN REAL_ARITH_TAC);; (* Conditional Hoeffding bound: combines convex bound with analytic lemma *) -let MARTINGALE_DIFF_EXP_INDICATOR_BOUND = prove +let SIMPLE_MARTINGALE_DIFF_EXP_INDICATOR_BOUND = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (n:num) (s:real) (a:real) (b:real) (A:A->bool). - martingale p FF X /\ + simple_martingale p FF X /\ A IN FF n /\ (!x. x IN prob_carrier p ==> a <= X (SUC n) x - X n x /\ X (SUC n) x - X n x <= b) /\ @@ -3239,15 +3212,15 @@ let MARTINGALE_DIFF_EXP_INDICATOR_BOUND = prove [SUBGOAL_THEN `simple_rv p (\x:A. (X:num->A->real) (SUC n) x - X n x)` ASSUME_TAC THENL [MATCH_MP_TAC SIMPLE_RV_SUB THEN REWRITE_TAC[ETA_AX] THEN - ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN SUBGOAL_THEN `simple_expectation p (\x:A. (X:num->A->real) (SUC n) x - X n x) = &0` ASSUME_TAC THENL [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC n)`; `(X:num->A->real) n`] SIMPLE_EXPECTATION_SUB) THEN - ANTS_TAC THENL [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ANTS_TAC THENL [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN DISCH_THEN SUBST1_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; - `X:num->A->real`] MARTINGALE_EXPECTATION_CONST) THEN + `X:num->A->real`] SIMPLE_MARTINGALE_EXPECTATION_CONST) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_THEN(fun th -> SUBST1_TAC(SPEC `SUC n` th) THEN SUBST1_TAC(SPEC `n:num` th)) THEN @@ -3282,64 +3255,20 @@ let MARTINGALE_DIFF_EXP_INDICATOR_BOUND = prove EXISTS_TAC `(b / (b - a) * exp(s * a) + --a / (b - a) * exp(s * b)) * prob p (A:A->bool)` THEN CONJ_TAC THENL - [MATCH_MP_TAC MARTINGALE_DIFF_CONVEX_INDICATOR THEN + [MATCH_MP_TAC SIMPLE_MARTINGALE_DIFF_CONVEX_INDICATOR THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL [MATCH_MP_TAC HOEFFDING_ANALYTIC_LEMMA THEN ASM_REAL_ARITH_TAC; MATCH_MP_TAC PROB_POSITIVE THEN - ASM_MESON_TAC[martingale; filtration; sub_sigma_algebra; SUBSET]]);; - -(* Subtraction preserves measurability for simple RVs *) -let MEASURABLE_WRT_SUB = prove - (`!p:A prob_space G (Y1:A->real) (Y2:A->real). - sub_sigma_algebra p G /\ - simple_rv p Y1 /\ measurable_wrt p G Y1 /\ - simple_rv p Y2 /\ measurable_wrt p G Y2 - ==> measurable_wrt p G (\x. Y1 x - Y2 x)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[measurable_wrt] THEN - X_GEN_TAC `v:real` THEN - ABBREV_TAC `R2 = IMAGE (Y2:A->real) (prob_carrier p)` THEN - SUBGOAL_THEN `FINITE (R2:real->bool)` ASSUME_TAC THENL - [EXPAND_TAC "R2" THEN REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN - ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN - (* {Y1 - Y2 <= v} = UNIONS_{u in R2} ({Y2 = u} INTER {Y1 <= v + u}) *) - SUBGOAL_THEN - `{x:A | x IN prob_carrier p /\ (Y1:A->real) x - Y2 x <= v} = - UNIONS (IMAGE (\u. {x | x IN prob_carrier p /\ Y2 x = u} INTER - {x | x IN prob_carrier p /\ Y1 x <= v + u}) - R2)` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNIONS; EXISTS_IN_IMAGE; IN_INTER; IN_ELIM_THM] THEN - X_GEN_TAC `x:A` THEN EQ_TAC THENL - [STRIP_TAC THEN EXISTS_TAC `(Y2:A->real) x` THEN - CONJ_TAC THENL - [EXPAND_TAC "R2" THEN REWRITE_TAC[IN_IMAGE] THEN - EXISTS_TAC `x:A` THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; - DISCH_THEN(X_CHOOSE_THEN `u:real` STRIP_ASSUME_TAC) THEN - ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; - ALL_TAC] THEN - MATCH_MP_TAC SIGMA_ALGEBRA_UNION_COUNTABLE THEN - CONJ_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN - CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN - X_GEN_TAC `u:real` THEN DISCH_TAC THEN - MATCH_MP_TAC(ISPEC `p:A prob_space` SUB_SIGMA_ALGEBRA_INTER) THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC(ISPEC `p:A prob_space` MEASURABLE_WRT_LEVEL_SET) THEN - ASM_REWRITE_TAC[]; - ACCEPT_TAC(SPEC `v + u:real` (REWRITE_RULE[measurable_wrt] - (ASSUME `measurable_wrt (p:A prob_space) G (Y1:A->real)`)))]; - MATCH_MP_TAC COUNTABLE_IMAGE THEN MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN - ASM_REWRITE_TAC[]]);; + ASM_MESON_TAC[simple_martingale; filtration; sub_sigma_algebra; SUBSET]]);; (* Step lemma for Azuma: E[Z * exp(s*D)] <= exp(s^2*c^2/8) * E[Z] *) (* for F_n-measurable non-negative simple Z *) -let MARTINGALE_DIFF_EXP_ADAPTED_BOUND = prove +let SIMPLE_MARTINGALE_DIFF_EXP_ADAPTED_BOUND = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (n:num) (s:real) (a:real) (b:real) (Z:A->real). - martingale p FF X /\ + simple_martingale p FF X /\ simple_rv p Z /\ measurable_wrt p (FF n) Z /\ (!x. x IN prob_carrier p ==> &0 <= Z x) /\ (!x. x IN prob_carrier p ==> @@ -3354,7 +3283,7 @@ let MARTINGALE_DIFF_EXP_ADAPTED_BOUND = prove [EXPAND_TAC "S" THEN REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL - [ASM_MESON_TAC[martingale; filtration]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_martingale; filtration]; ALL_TAC] THEN SUBGOAL_THEN `!u:real. {x:A | x IN prob_carrier p /\ (Z:A->real) x = u} IN (FF:num->(A->bool)->bool) (n:num)` ASSUME_TAC THENL @@ -3368,7 +3297,7 @@ let MARTINGALE_DIFF_EXP_ADAPTED_BOUND = prove ASSUME_TAC THENL [MATCH_MP_TAC SIMPLE_RV_EXP THEN MATCH_MP_TAC SIMPLE_RV_SUB THEN REWRITE_TAC[ETA_AX] THEN - ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN (* Step 1: Pointwise decomposition Z * exp(s*D) = sum_v v * 1_{Z=v} * exp(s*D) *) SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> @@ -3488,14 +3417,14 @@ let MARTINGALE_DIFF_EXP_ADAPTED_BOUND = prove GEN_REWRITE_TAC RAND_CONV [CONJUNCT2(CONJUNCT2 REAL_MUL_AC)] THEN MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC MARTINGALE_DIFF_EXP_INDICATOR_BOUND THEN + MATCH_MP_TAC SIMPLE_MARTINGALE_DIFF_EXP_INDICATOR_BOUND THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]);; (* Azuma MGF bound by induction *) let AZUMA_MGF_BOUND = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (a:num->real) (b:num->real) (s:real) (n:num). - martingale p FF X /\ + simple_martingale p FF X /\ (!i. i <= n ==> !x. x IN prob_carrier p ==> a i <= X (SUC i) x - X i x /\ X (SUC i) x - X i x <= b i) /\ @@ -3515,15 +3444,15 @@ let AZUMA_MGF_BOUND = prove ANTS_TAC THENL [CONJ_TAC THENL [MATCH_MP_TAC SIMPLE_RV_SUB THEN REWRITE_TAC[ETA_AX] THEN - ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN CONJ_TAC THENL [(* E[X 1 - X 0] = 0 *) MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC 0)`; `(X:num->A->real) 0`] SIMPLE_EXPECTATION_SUB) THEN - ANTS_TAC THENL [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ANTS_TAC THENL [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN DISCH_THEN SUBST1_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; - `X:num->A->real`] MARTINGALE_EXPECTATION_CONST) THEN + `X:num->A->real`] SIMPLE_MARTINGALE_EXPECTATION_CONST) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_THEN(fun th -> SUBST1_TAC(SPEC `SUC 0` th) THEN SUBST1_TAC(SPEC `0` th)) THEN @@ -3555,32 +3484,32 @@ let AZUMA_MGF_BOUND = prove ALL_TAC] THEN (* Z = exp(s*(X(SUC n) - X 0)) is simple_rv and FF(SUC n)-measurable *) ABBREV_TAC `Z = \x:A. exp(s * ((X:num->A->real) (SUC n) x - X 0 x))` THEN - (* Extract needed facts from martingale via explicit CONJUNCT navigation *) - (* martingale = A /\ (B /\ (C /\ D)) where A=filtration, B=simple_adapted, + (* Extract needed facts from simple_martingale via explicit CONJUNCT navigation *) + (* simple_martingale = A /\ (B /\ (C /\ D)) where A=filtration, B=simple_adapted, C=!n.simple_rv, D=conditional expectations *) SUBGOAL_THEN `!k:num. simple_rv p ((X:num->A->real) k)` ASSUME_TAC THENL - [MP_TAC(ASSUME `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN - REWRITE_TAC[martingale] THEN + [MP_TAC(ASSUME `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN + REWRITE_TAC[simple_martingale] THEN DISCH_THEN(fun th -> ACCEPT_TAC(CONJUNCT1(CONJUNCT2(CONJUNCT2 th)))); ALL_TAC] THEN SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) (SUC n))` ASSUME_TAC THENL - [MP_TAC(ASSUME `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN - REWRITE_TAC[martingale; filtration] THEN + [MP_TAC(ASSUME `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN + REWRITE_TAC[simple_martingale; filtration] THEN DISCH_THEN(fun th -> ACCEPT_TAC(SPEC `SUC n` (CONJUNCT1(CONJUNCT1 th)))); ALL_TAC] THEN SUBGOAL_THEN `measurable_wrt p ((FF:num->(A->bool)->bool) (SUC n)) ((X:num->A->real) (SUC n))` ASSUME_TAC THENL - [MP_TAC(ASSUME `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN - REWRITE_TAC[martingale; simple_adapted; adapted] THEN + [MP_TAC(ASSUME `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN + REWRITE_TAC[simple_martingale; simple_adapted; adapted] THEN DISCH_THEN(fun th -> ACCEPT_TAC(SPEC `SUC n` (CONJUNCT1(CONJUNCT1(CONJUNCT2 th))))); ALL_TAC] THEN SUBGOAL_THEN `measurable_wrt p ((FF:num->(A->bool)->bool) (SUC n)) ((X:num->A->real) 0)` ASSUME_TAC THENL [MATCH_MP_TAC(ISPEC `p:A prob_space` MEASURABLE_WRT_MONO) THEN EXISTS_TAC `(FF:num->(A->bool)->bool) 0` THEN CONJ_TAC THENL - [MP_TAC(ASSUME `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN - REWRITE_TAC[martingale; simple_adapted; adapted] THEN + [MP_TAC(ASSUME `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN + REWRITE_TAC[simple_martingale; simple_adapted; adapted] THEN DISCH_THEN(fun th -> ACCEPT_TAC(SPEC `0` (CONJUNCT1(CONJUNCT1(CONJUNCT2 th))))); - MP_TAC(ASSUME `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN - REWRITE_TAC[martingale; filtration] THEN + MP_TAC(ASSUME `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`) THEN + REWRITE_TAC[simple_martingale; filtration] THEN DISCH_THEN(MP_TAC o CONJUNCT1) THEN DISCH_THEN(MP_TAC o CONJUNCT2) THEN DISCH_THEN(MP_TAC o SPECL [`0`; `SUC n`]) THEN @@ -3613,7 +3542,7 @@ let AZUMA_MGF_BOUND = prove exp(s pow 2 * ((b:num->real) (SUC n) - (a:num->real) (SUC n)) pow 2 / &8) * simple_expectation p Z` (LABEL_TAC "STEP") THENL - [MATCH_MP_TAC MARTINGALE_DIFF_EXP_ADAPTED_BOUND THEN + [MATCH_MP_TAC SIMPLE_MARTINGALE_DIFF_EXP_ADAPTED_BOUND THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ASM_MESON_TAC[LE_REFL]; ASM_MESON_TAC[LE_REFL]]; @@ -3645,10 +3574,10 @@ let AZUMA_MGF_BOUND = prove REAL_ARITH_TAC]);; (* Azuma-Hoeffding inequality for martingales *) -let AZUMA_HOEFFDING = prove +let SIMPLE_AZUMA_HOEFFDING = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (a:num->real) (b:num->real) (t:real) (n:num). - martingale p FF X /\ + simple_martingale p FF X /\ (!i. i <= n ==> !x. x IN prob_carrier p ==> a i <= X (SUC i) x - X i x /\ X (SUC i) x - X i x <= b i) /\ @@ -3677,7 +3606,7 @@ let AZUMA_HOEFFDING = prove REWRITE_TAC[simple_mgf] THEN BETA_TAC THEN ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_SUB THEN - REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[martingale]; + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[simple_martingale]; REWRITE_TAC[]]; ALL_TAC] THEN (* Step 2: MGF bound *) @@ -3713,53 +3642,112 @@ let AZUMA_HOEFFDING = prove EXPAND_TAC "s0" THEN EXPAND_TAC "V" THEN CONV_TAC REAL_FIELD]);; +(* Finite sigma-algebra + measurability implies simple_rv *) +let MEASURABLE_WRT_FINITE_SIMPLE_RV = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ measurable_wrt p G X /\ FINITE G /\ + random_variable p X + ==> simple_rv p X`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[simple_rv] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\s. (X:A->real)(CHOICE s)) (G:(A->bool)->bool)` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[FINITE_IMAGE]; ALL_TAC] THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `y:real` THEN STRIP_TAC THEN + EXISTS_TAC `sigma_atom G (x:A)` THEN CONJ_TAC THENL + [SUBGOAL_THEN `(x:A) IN sigma_atom G x` ASSUME_TAC THENL + [MATCH_MP_TAC SIGMA_ATOM_CONTAINS THEN + ASM_MESON_TAC[sub_sigma_algebra; random_variable; IN]; + ALL_TAC] THEN + SUBGOAL_THEN `(X:A->real) (CHOICE (sigma_atom G (x:A))) = X x` SUBST1_TAC THENL + [MATCH_MP_TAC MEASURABLE_WRT_CONSTANT_ON_ATOM THEN + EXISTS_TAC `p:A prob_space` THEN EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC CHOICE_DEF THEN + ASM_MESON_TAC[MEMBER_NOT_EMPTY]; + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + ASM_MESON_TAC[sub_sigma_algebra; random_variable; IN]]);; + +(* martingale + simple_rv ==> simple_martingale *) +let MARTINGALE_IMP_MARTINGALE = prove + (`!p:A prob_space FF X. + martingale p FF X /\ (!n. simple_rv p (X n)) + ==> simple_martingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[martingale; simple_martingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `a IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN + UNDISCH_TAC `!n:num. sub_sigma_algebra (p:A prob_space) + ((FF:num->(A->bool)->bool) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[sub_sigma_algebra] THEN STRIP_TAC THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET + prob_events (p:A prob_space)` THEN + REWRITE_TAC[SUBSET] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p (\x:A. X (n:num) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X (SUC n) x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC n)`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]]; + ASM_SIMP_TAC[GSYM EXPECTATION_SIMPLE_AGREE] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]]);; + +(* Azuma-Hoeffding for martingale *) +let AZUMA_HOEFFDING = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) + (a:num->real) (b:num->real) (t:real) (n:num). + martingale p FF X /\ + (!n. FINITE (FF n)) /\ + (!i. i <= n ==> + !x. x IN prob_carrier p ==> + a i <= X (SUC i) x - X i x /\ X (SUC i) x - X i x <= b i) /\ + (!i. i <= n ==> a i < b i) /\ + &0 < t /\ &0 < sum(0..n) (\i. (b i - a i) pow 2) + ==> prob p {x | x IN prob_carrier p /\ X (SUC n) x - X 0 x >= t} <= + exp(--(&2 * t pow 2 / sum(0..n) (\i. (b i - a i) pow 2)))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `!m:num. integrable (p:A prob_space) ((X:num->A->real) m)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `!m. simple_rv (p:A prob_space) ((X:num->A->real) m)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC MEASURABLE_WRT_FINITE_SIMPLE_RV THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) m` THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[adapted]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_martingale (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC MARTINGALE_IMP_MARTINGALE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_AZUMA_HOEFFDING THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]);; + (* ========================================================================= *) (* DOOB DECOMPOSITION AND HELPERS *) (* ========================================================================= *) -(* Measurability under addition *) -let MEASURABLE_WRT_ADD = prove - (`!p:A prob_space G (Y1:A->real) (Y2:A->real). - sub_sigma_algebra p G /\ - simple_rv p Y1 /\ measurable_wrt p G Y1 /\ - simple_rv p Y2 /\ measurable_wrt p G Y2 - ==> measurable_wrt p G (\x. Y1 x + Y2 x)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[measurable_wrt] THEN - X_GEN_TAC `v:real` THEN - ABBREV_TAC `R2 = IMAGE (Y2:A->real) (prob_carrier p)` THEN - SUBGOAL_THEN `FINITE (R2:real->bool)` ASSUME_TAC THENL - [EXPAND_TAC "R2" THEN REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN - ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN - SUBGOAL_THEN - `{x:A | x IN prob_carrier p /\ (Y1:A->real) x + Y2 x <= v} = - UNIONS (IMAGE (\u. {x | x IN prob_carrier p /\ Y2 x = u} INTER - {x | x IN prob_carrier p /\ Y1 x <= v - u}) - R2)` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNIONS; EXISTS_IN_IMAGE; IN_INTER; IN_ELIM_THM] THEN - X_GEN_TAC `x:A` THEN EQ_TAC THENL - [STRIP_TAC THEN EXISTS_TAC `(Y2:A->real) x` THEN - CONJ_TAC THENL - [EXPAND_TAC "R2" THEN REWRITE_TAC[IN_IMAGE] THEN - EXISTS_TAC `x:A` THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; - DISCH_THEN(X_CHOOSE_THEN `u:real` STRIP_ASSUME_TAC) THEN - ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; - ALL_TAC] THEN - MATCH_MP_TAC SIGMA_ALGEBRA_UNION_COUNTABLE THEN - CONJ_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN - CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN - X_GEN_TAC `u:real` THEN DISCH_TAC THEN - MATCH_MP_TAC(ISPEC `p:A prob_space` SUB_SIGMA_ALGEBRA_INTER) THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC(ISPEC `p:A prob_space` MEASURABLE_WRT_LEVEL_SET) THEN - ASM_REWRITE_TAC[]; - ACCEPT_TAC(SPEC `v - u:real` (REWRITE_RULE[measurable_wrt] - (ASSUME `measurable_wrt (p:A prob_space) G (Y1:A->real)`)))]; - MATCH_MP_TAC COUNTABLE_IMAGE THEN MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN - ASM_REWRITE_TAC[]]);; - (* E[Y * 1_atom] = Y(x) * P(atom) when Y is G-measurable *) let SIMPLE_EXPECTATION_INDICATOR_MEASURABLE = prove (`!p:A prob_space G (Y:A->real) x. @@ -3795,14 +3783,14 @@ let SIMPLE_EXPECTATION_INDICATOR_MEASURABLE = prove ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR]);; (* Submartingale ==> E[X_{n+1}|F_n](x) >= X_n(x) on positive-prob atoms *) -let SUBMARTINGALE_COND_EXP_GE = prove +let SIMPLE_SUBMARTINGALE_COND_EXP_GE = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) n x. - submartingale p FF X /\ FINITE (FF n) /\ + simple_submartingale p FF X /\ FINITE (FF n) /\ x IN prob_carrier p /\ ~(prob p (sigma_atom (FF n) x) = &0) ==> X n x <= simple_cond_exp p (FF n) (X (SUC n)) x`, REPEAT STRIP_TAC THEN FIRST_ASSUM(fun th -> - STRIP_ASSUME_TAC(GEN_REWRITE_RULE I [submartingale] th)) THEN + STRIP_ASSUME_TAC(GEN_REWRITE_RULE I [simple_submartingale] th)) THEN SUBGOAL_THEN `sub_sigma_algebra p ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL [ASM_MESON_TAC[filtration]; ALL_TAC] THEN SUBGOAL_THEN `(x:A) IN UNIONS ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL @@ -3860,7 +3848,7 @@ let SUBMARTINGALE_COND_EXP_GE = prove ASSUME_TAC THENL [MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR_MEASURABLE THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 4: submartingale inequality *) + (* Step 4: simple_submartingale inequality *) SUBGOAL_THEN `simple_expectation p (\z. (X:num->A->real) n z * @@ -4004,12 +3992,12 @@ let COND_EXP_INDICATOR_DIFF_ZERO = prove REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN REAL_ARITH_TAC);; -(* Doob Decomposition: X = M + A with M martingale, A predictable increasing *) +(* Doob Decomposition: X = M + A with M simple_martingale, A predictable increasing *) (* Modified: increasing condition restricted to positive-probability atoms *) -let DOOB_DECOMPOSITION = prove +let SIMPLE_DOOB_DECOMPOSITION = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real). - submartingale p FF X /\ (!n. FINITE (FF n)) - ==> ?M A. martingale p FF M /\ + simple_submartingale p FF X /\ (!n. FINITE (FF n)) + ==> ?M A. simple_martingale p FF M /\ simple_adapted p FF A /\ (!x. x IN prob_carrier p ==> A 0 x = &0) /\ (!n x. x IN prob_carrier p /\ @@ -4019,7 +4007,7 @@ let DOOB_DECOMPOSITION = prove X n x = M n x + A n x)`, REPEAT STRIP_TAC THEN FIRST_ASSUM(fun th -> - STRIP_ASSUME_TAC(GEN_REWRITE_RULE I [submartingale] th)) THEN + STRIP_ASSUME_TAC(GEN_REWRITE_RULE I [simple_submartingale] th)) THEN (* Witnesses: M_n = X_n - A_n, A_n = sum of Doob increments *) EXISTS_TAC `\n (x:A). (X:num->A->real) n x - sum(1..n) (\k. simple_cond_exp p ((FF:num->(A->bool)->bool) (k-1)) @@ -4071,7 +4059,7 @@ let DOOB_DECOMPOSITION = prove ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Prove: martingale p FF M *) + (* Prove: simple_martingale p FF M *) (* First establish M_rv *) SUBGOAL_THEN `!n. simple_rv p (\x:A. (X:num->A->real) n x - @@ -4083,7 +4071,7 @@ let DOOB_DECOMPOSITION = prove USE_THEN "An_rv" (ACCEPT_TAC o SPEC `n:num`)]; ALL_TAC] THEN CONJ_TAC THENL - [REWRITE_TAC[martingale] THEN + [REWRITE_TAC[simple_martingale] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN (* Conjunct 1: filtration *) CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN @@ -4097,10 +4085,7 @@ let DOOB_DECOMPOSITION = prove MATCH_MP_TAC(ISPEC `p:A prob_space` MEASURABLE_WRT_SUB) THEN REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL [ASM_MESON_TAC[filtration]; ALL_TAC] THEN - CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL [ASM_MESON_TAC[simple_adapted; adapted]; ALL_TAC] THEN - CONJ_TAC THENL - [USE_THEN "An_rv" (ACCEPT_TAC o SPEC `n:num`); ALL_TAC] THEN MATCH_MP_TAC MEASURABLE_WRT_SUM_FILTRATION_1 THEN ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN @@ -4215,4673 +4200,10547 @@ let DOOB_DECOMPOSITION = prove REWRITE_TAC[SUM_CLAUSES_NUMSEG; ARITH_RULE `1 <= SUC n`] THEN REWRITE_TAC[real_ge; ARITH_RULE `SUC n - 1 = n`] THEN MATCH_MP_TAC(REAL_ARITH `x <= y ==> a <= a + (y - x)`) THEN - MATCH_MP_TAC SUBMARTINGALE_COND_EXP_GE THEN + MATCH_MP_TAC SIMPLE_SUBMARTINGALE_COND_EXP_GE THEN ASM_MESON_TAC[]; ALL_TAC] THEN (* X n x = M n x + A n x: trivial algebra *) REPEAT STRIP_TAC THEN REAL_ARITH_TAC);; (* ========================================================================= *) -(* CLT COMPLETION: CONVERGENCE IN DISTRIBUTION TO STANDARD NORMAL *) +(* GENERAL DOOB DECOMPOSITION (for submartingale) *) (* ========================================================================= *) +(* Doob compensator: recursive definition A_0 = 0, + A_{n+1} = A_n + E[X_{n+1} | FF_n] - X_n *) +let doob_compensator = define + `(doob_compensator (p:A prob_space) (FF:num->(A->bool)->bool) + (X:num->A->real) 0 (x:A) = &0) /\ + (doob_compensator p FF X (SUC n) x = + doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x - X n x)`;; + +(* Reverse bridge: submartingale + simple_rv ==> simple_submartingale *) +let SUBMARTINGALE_IMP_SUBMARTINGALE = prove + (`!p:A prob_space FF X. + submartingale p FF X /\ (!n. simple_rv p (X n)) + ==> simple_submartingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[submartingale; simple_submartingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `a IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN + UNDISCH_TAC `!n:num. sub_sigma_algebra (p:A prob_space) + ((FF:num->(A->bool)->bool) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[sub_sigma_algebra] THEN STRIP_TAC THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET + prob_events (p:A prob_space)` THEN + REWRITE_TAC[SUBSET] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p (\x:A. X (n:num) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X (SUC n) x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC n)`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]]; + ASM_SIMP_TAC[GSYM EXPECTATION_SIMPLE_AGREE] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]]);; + +(* Doob compensator is a simple random variable *) +let DOOB_COMPENSATOR_SIMPLE_RV = prove + (`!p:A prob_space FF X n. + simple_submartingale p FF X /\ (!n. FINITE (FF n)) + ==> simple_rv p (doob_compensator p FF X n)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN STRIP_TAC THENL + [(* Base case *) + SUBGOAL_THEN `doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; doob_compensator]; ALL_TAC] THEN + REWRITE_TAC[SIMPLE_RV_CONST]; + (* Step case *) + SUBGOAL_THEN `simple_rv (p:A prob_space) (doob_compensator p FF X n)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `doob_compensator (p:A prob_space) FF X (SUC n) = + (\x:A. doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; doob_compensator]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (simple_cond_exp p (FF (n:num)) (X (SUC n)))` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_COND_EXP_SIMPLE_RV THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [simple_submartingale]) THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN + SIMP_TAC[sub_sigma_algebra]; + ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [simple_submartingale]) THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. doob_compensator p FF X n x + simple_cond_exp p (FF n) (X (SUC n)) x`; + `(X:num->A->real) n`] SIMPLE_RV_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `doob_compensator (p:A prob_space) FF X n`; + `simple_cond_exp (p:A prob_space) (FF (n:num)) ((X:num->A->real) (SUC n))`] + SIMPLE_RV_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Doob compensator is measurable wrt FF n *) +let DOOB_COMPENSATOR_MEASURABLE = prove + (`!p:A prob_space FF X n. + simple_submartingale p FF X /\ (!n. FINITE (FF n)) + ==> measurable_wrt p (FF n) (doob_compensator p FF X n)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN STRIP_TAC THENL + [(* Base *) + SUBGOAL_THEN `doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; doob_compensator]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN + UNDISCH_TAC `simple_submartingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_submartingale; filtration] THEN SIMP_TAC[sub_sigma_algebra]; + (* Step *) + GEN_REWRITE_TAC RAND_CONV [GSYM ETA_AX] THEN REWRITE_TAC[doob_compensator] THEN + SUBGOAL_THEN `(\x:A. doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `simple_submartingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_submartingale] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN STRIP_TAC THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` ASSUME_TAC THENL + [ASM_MESON_TAC[FILTRATION_MONO; LE; LE_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) (SUC n))` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (doob_compensator p FF X n)` ASSUME_TAC THENL + [ASM_SIMP_TAC[DOOB_COMPENSATOR_SIMPLE_RV; simple_submartingale; filtration]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (simple_cond_exp p (FF n) (X (SUC n)))` ASSUME_TAC THENL + [ASM_SIMP_TAC[SIMPLE_COND_EXP_SIMPLE_RV]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) (doob_compensator p FF X n)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[simple_submartingale; filtration] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF (SUC n)) (doob_compensator p FF X n)` ASSUME_TAC THENL + [UNDISCH_TAC `measurable_wrt p (FF n) (doob_compensator (p:A prob_space) FF X n)` THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF (SUC n)) (simple_cond_exp p (FF n) (X (SUC n)))` ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(X:num->A->real) (SUC n)`] SIMPLE_COND_EXP_SIMPLE_RV_WRT) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[simple_rv_wrt; measurable_wrt; SUBSET] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) ((X:num->A->real) n)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_adapted; adapted] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) (SUC n)) ((X:num->A->real) n)` ASSUME_TAC THENL + [UNDISCH_TAC `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) n)` THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(FF:num->(A->bool)->bool) (SUC n)`; + `\x:A. doob_compensator p FF X n x + simple_cond_exp p (FF n) (X (SUC n)) x`; + `(X:num->A->real) n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(FF:num->(A->bool)->bool) (SUC n)`; + `doob_compensator (p:A prob_space) FF X n`; + `simple_cond_exp (p:A prob_space) (FF (n:num)) ((X:num->A->real) (SUC n))`] + MEASURABLE_WRT_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Doob compensator is predictable *) +let DOOB_COMPENSATOR_PREDICTABLE = prove + (`!p:A prob_space FF X. + simple_submartingale p FF X /\ (!n. FINITE (FF n)) + ==> predictable p FF (doob_compensator p FF X)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[predictable] THEN CONJ_TAC THENL + [(* Base: simple_rv_wrt p (FF 0) (doob_comp 0) *) + REWRITE_TAC[simple_rv_wrt] THEN CONJ_TAC THENL + [SUBGOAL_THEN `doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; doob_compensator]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN + UNDISCH_TAC `simple_submartingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_submartingale; filtration] THEN SIMP_TAC[sub_sigma_algebra]; + MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `0`] DOOB_COMPENSATOR_SIMPLE_RV) THEN + ASM_REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]; + GEN_TAC THEN REWRITE_TAC[simple_rv_wrt] THEN CONJ_TAC THENL + [(* measurable_wrt p (FF n) (doob_comp (SUC n)) *) + GEN_REWRITE_TAC RAND_CONV [GSYM ETA_AX] THEN REWRITE_TAC[doob_compensator] THEN + SUBGOAL_THEN `(\x:A. doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (doob_compensator p FF X n x + + simple_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `simple_submartingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_submartingale] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN STRIP_TAC THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (doob_compensator p FF X n)` ASSUME_TAC THENL + [ASM_SIMP_TAC[DOOB_COMPENSATOR_SIMPLE_RV; simple_submartingale; filtration]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (simple_cond_exp p (FF n) (X (SUC n)))` ASSUME_TAC THENL + [ASM_SIMP_TAC[SIMPLE_COND_EXP_SIMPLE_RV]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) (doob_compensator p FF X n)` ASSUME_TAC THENL + [ASM_SIMP_TAC[DOOB_COMPENSATOR_MEASURABLE; simple_submartingale; filtration]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) (simple_cond_exp p (FF n) (X (SUC n)))` ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(X:num->A->real) (SUC n)`] SIMPLE_COND_EXP_SIMPLE_RV_WRT) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[simple_rv_wrt] THEN SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) ((X:num->A->real) n)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_adapted; adapted] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN SIMP_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(FF:num->(A->bool)->bool) n`; + `\x:A. doob_compensator p FF X n x + simple_cond_exp p (FF n) (X (SUC n)) x`; + `(X:num->A->real) n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(FF:num->(A->bool)->bool) n`; + `doob_compensator (p:A prob_space) FF X n`; + `simple_cond_exp (p:A prob_space) (FF (n:num)) ((X:num->A->real) (SUC n))`] + MEASURABLE_WRT_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `SUC n`] DOOB_COMPENSATOR_SIMPLE_RV) THEN + ASM_REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]]);; + +(* Doob compensator is increasing on positive-probability atoms *) +let DOOB_COMPENSATOR_INCREASING = prove + (`!p:A prob_space FF X n x. + simple_submartingale p FF X /\ (!n. FINITE (FF n)) /\ + x IN prob_carrier p /\ ~(prob p (sigma_atom (FF n) x) = &0) + ==> doob_compensator p FF X n x <= doob_compensator p FF X (SUC n) x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[doob_compensator] THEN + MATCH_MP_TAC(REAL_ARITH `x <= y ==> a <= a + y - x`) THEN + ASM_SIMP_TAC[SIMPLE_SUBMARTINGALE_COND_EXP_GE]);; + +(* X - doob_compensator is a simple_martingale *) +let DOOB_COMPENSATOR_MARTINGALE = prove + (`!p:A prob_space FF X. + simple_submartingale p FF X /\ (!n. FINITE (FF n)) + ==> simple_martingale p FF (\n x. X n x - doob_compensator p FF X n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[simple_martingale] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `simple_adapted (p:A prob_space) FF X` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) (doob_compensator p FF X n)` ASSUME_TAC THENL + [ASM_SIMP_TAC[DOOB_COMPENSATOR_SIMPLE_RV]; ALL_TAC] THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) (\x:A. (X:num->A->real) n x - doob_compensator p FF X n x)` ASSUME_TAC THENL + [GEN_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `doob_compensator (p:A prob_space) FF X n`] SIMPLE_RV_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* simple_adapted *) + REWRITE_TAC[simple_adapted] THEN CONJ_TAC THENL + [REWRITE_TAC[adapted] THEN GEN_TAC THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(X:num->A->real) n`; + `doob_compensator (p:A prob_space) FF X n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[DOOB_COMPENSATOR_MEASURABLE] THEN + UNDISCH_TAC `simple_adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_adapted; adapted] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN SIMP_TAC[]; + GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]; + ALL_TAC] THEN + (* SE simple_martingale condition *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + (X (SUC n) x - doob_compensator p FF X (SUC n) x) * indicator_fn a x = + (X n x - doob_compensator p FF X n x) * indicator_fn a x + + (X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x) * indicator_fn a x` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[doob_compensator] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `a IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn (a:A->bool))` ASSUME_TAC THENL + [ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. (X n x - doob_compensator p FF X n x) * indicator_fn a x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. X n x - doob_compensator p FF X n x`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. (X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x) * indicator_fn a x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x`; + `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC n)`; + `simple_cond_exp (p:A prob_space) (FF (n:num)) (X (SUC n))`] SIMPLE_RV_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_COND_EXP_SIMPLE_RV THEN ASM_MESON_TAC[filtration]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x. (X (SUC n) x - doob_compensator p FF X (SUC n) x) * indicator_fn a x) = + simple_expectation p + (\x. (X n x - doob_compensator p FF X n x) * indicator_fn a x + + (X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x) * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (X n x - doob_compensator p FF X n x) * indicator_fn a x`; + `\x:A. (X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x) * indicator_fn a x`] + SIMPLE_EXPECTATION_ADD) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x. (X (SUC n) x - simple_cond_exp p (FF n) (X (SUC n)) x) * + indicator_fn a x) = &0` SUBST1_TAC THENL + [MATCH_MP_TAC COND_EXP_INDICATOR_DIFF_ZERO THEN + ASM_MESON_TAC[filtration]; + REAL_ARITH_TAC]);; -(* --- Phase 1: Parameterized Gaussian Integral and Fourier Transform --- *) +(* General Doob decomposition theorem *) +let DOOB_DECOMPOSITION = prove + (`!p:A prob_space FF X. + submartingale p FF X /\ (!n. FINITE (FF n)) /\ (!n. simple_rv p (X n)) + ==> ?M A. martingale p FF M /\ + predictable p FF A /\ + (!x. x IN prob_carrier p ==> A 0 x = &0) /\ + (!n x. x IN prob_carrier p /\ + ~(prob p (sigma_atom (FF n) x) = &0) + ==> A n x <= A (SUC n) x) /\ + (!n x. x IN prob_carrier p ==> X n x = M n x + A n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + EXISTS_TAC `\n (x:A). X n x - doob_compensator (p:A prob_space) FF X n x` THEN + EXISTS_TAC `doob_compensator (p:A prob_space) FF X` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `simple_submartingale (p:A prob_space) FF X` ASSUME_TAC THENL + [ASM_SIMP_TAC[SUBMARTINGALE_IMP_SUBMARTINGALE]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_IMP_MARTINGALE THEN + ASM_SIMP_TAC[DOOB_COMPENSATOR_MARTINGALE]; + ASM_SIMP_TAC[DOOB_COMPENSATOR_PREDICTABLE]; + REWRITE_TAC[doob_compensator]; + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[DOOB_COMPENSATOR_INCREASING]; + REPEAT STRIP_TAC THEN REAL_ARITH_TAC]);; + +(* Helper: SE[f * 1_atom] = f(x) * P(atom) for G-measurable f *) +let SE_MEASURABLE_INDICATOR_ATOM = prove + (`!p:A prob_space G f x. + sub_sigma_algebra p G /\ FINITE G /\ simple_rv p f /\ + measurable_wrt p G f /\ x IN prob_carrier p + ==> simple_expectation p (\y. f y * indicator_fn (sigma_atom G x) y) = + f x * prob p (sigma_atom G x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `x:A IN UNIONS (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `!y:A. y IN sigma_atom G x ==> (f:A->real) y = f x` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `G:(A->bool)->bool`; `f:A->real`; + `x:A`; `y:A`] MEASURABLE_WRT_CONSTANT_ON_ATOM) THEN + ASM_REWRITE_TAC[] THEN SIMP_TAC[EQ_SYM_EQ]; + ALL_TAC] THEN + SUBGOAL_THEN `!y:A. y IN prob_carrier (p:A prob_space) ==> + (f:A->real) y * indicator_fn (sigma_atom G x) y = + f x * indicator_fn (sigma_atom G x) y` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN FIRST_ASSUM ACCEPT_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\y. f y * indicator_fn (sigma_atom G x) y) = + simple_expectation p (\y. f x * indicator_fn (sigma_atom G x) y)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom (G:(A->bool)->bool) x IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[SIGMA_ATOM_IN_G; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn (sigma_atom G (x:A)))` ASSUME_TAC THENL + [ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `indicator_fn (sigma_atom (G:(A->bool)->bool) (x:A))`; + `(f:A->real) x`] SIMPLE_EXPECTATION_CMUL) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR]);; -(* Helper: stretching an integral over all of R by a positive factor *) -let HAS_REAL_INTEGRAL_STRETCH_UNIV = prove - (`!(f:real->real) i m. - (f has_real_integral i) (:real) /\ &0 < m - ==> ((\x. f(m * x)) has_real_integral inv(m) * i) (:real)`, +(* A predictable simple_martingale starting at zero is identically zero *) +let PREDICTABLE_MARTINGALE_ZERO = prove + (`!p:A prob_space FF M. + simple_martingale p FF M /\ predictable p FF M /\ (!n. FINITE (FF n)) /\ + (!x. x IN prob_carrier p ==> M 0 x = &0) + ==> !n x. x IN prob_carrier p /\ + ~(prob p (sigma_atom (FF n) x) = &0) + ==> M n x = &0`, + REPEAT GEN_TAC THEN STRIP_TAC THEN INDUCT_TAC THENL + [ASM_MESON_TAC[]; + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN + SUBGOAL_THEN `!k:num. sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) k)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` ASSUME_TAC THENL + [ASM_MESON_TAC[FILTRATION_MONO; LE; LE_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `x:A IN UNIONS ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom ((FF:num->(A->bool)->bool) (SUC n)) x SUBSET sigma_atom (FF n) (x:A)` ASSUME_TAC THENL + [MATCH_MP_TAC SIGMA_ATOM_SUBSET THEN CONJ_TAC THENL + [UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN ASM_MESON_TAC[sub_sigma_algebra]; + MATCH_MP_TAC SIGMA_ATOM_CONTAINS THEN ASM_MESON_TAC[sub_sigma_algebra; SUBSET]]; + ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom ((FF:num->(A->bool)->bool) (SUC n)) (x:A) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [UNDISCH_TAC `!k. sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) k)` THEN + DISCH_THEN(MP_TAC o SPEC `SUC n`) THEN + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom ((FF:num->(A->bool)->bool) n) (x:A) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [UNDISCH_TAC `!k. sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) k)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `~(prob (p:A prob_space) (sigma_atom ((FF:num->(A->bool)->bool) n) (x:A)) = &0)` ASSUME_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `~(prob (p:A prob_space) (sigma_atom ((FF:num->(A->bool)->bool) (SUC n)) (x:A)) = &0)` THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `prob (p:A prob_space) (sigma_atom ((FF:num->(A->bool)->bool) (SUC n)) (x:A)) <= + prob p (sigma_atom (FF n) x)` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) (sigma_atom ((FF:num->(A->bool)->bool) (SUC n)) (x:A))` + MP_TAC THENL + [ASM_SIMP_TAC[PROB_POSITIVE]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(M:num->A->real) n x = &0` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom ((FF:num->(A->bool)->bool) n) (x:A) IN FF n` ASSUME_TAC THENL + [MATCH_MP_TAC SIGMA_ATOM_IN_G THEN ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `!k:num. simple_rv (p:A prob_space) ((M:num->A->real) k)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((M:num->A->real) (SUC n))` ASSUME_TAC THENL + [UNDISCH_TAC `predictable (p:A prob_space) FF M` THEN + REWRITE_TAC[predictable] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv_wrt] THEN SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((M:num->A->real) n)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_martingale (p:A prob_space) FF M` THEN + REWRITE_TAC[simple_martingale; simple_adapted; adapted] THEN + MESON_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `simple_martingale (p:A prob_space) FF (M:num->A->real)` THEN + REWRITE_TAC[simple_martingale] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `sigma_atom ((FF:num->(A->bool)->bool) n) (x:A)`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x'. (M:num->A->real) (SUC n) x' * indicator_fn (sigma_atom ((FF:num->(A->bool)->bool) n) x) x') = + M (SUC n) x * prob p (sigma_atom (FF n) x)` ASSUME_TAC THENL + [MATCH_MP_TAC SE_MEASURABLE_INDICATOR_ATOM THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x'. (M:num->A->real) n x' * indicator_fn (sigma_atom ((FF:num->(A->bool)->bool) n) x) x') = + M n x * prob p (sigma_atom (FF n) x)` ASSUME_TAC THENL + [MATCH_MP_TAC SE_MEASURABLE_INDICATOR_ATOM THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `(M:num->A->real) (SUC n) x * prob (p:A prob_space) (sigma_atom (FF n) x) = + M n x * prob p (sigma_atom (FF n) x)` MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN + ASM_MESON_TAC[REAL_ENTIRE]]);; + +(* Helper: simple_rv_wrt is closed under subtraction *) +let SIMPLE_RV_WRT_SUB = prove + (`!p:A prob_space G H1 H2. + sub_sigma_algebra p G /\ simple_rv_wrt p G H1 /\ simple_rv_wrt p G H2 + ==> simple_rv_wrt p G (\x. H1 x - H2 x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) H1 /\ simple_rv p H2` STRIP_ASSUME_TAC THENL + [ASM_MESON_TAC[SIMPLE_RV_WRT_IMP_SIMPLE_RV]; ALL_TAC] THEN + REWRITE_TAC[simple_rv_wrt] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `H1:A->real`; `H2:A->real`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[simple_rv_wrt]; + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. H1 x - H2 x)` MP_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `H1:A->real`; `H2:A->real`] SIMPLE_RV_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]]);; + +(* Martingale of difference *) +let SIMPLE_MARTINGALE_SUB = prove + (`!p:A prob_space FF M1 M2. + simple_martingale p FF M1 /\ simple_martingale p FF M2 + ==> simple_martingale p FF (\n x. M1 n x - M2 n x)`, REPEAT GEN_TAC THEN - REWRITE_TAC[has_real_integral; o_DEF; IMAGE_LIFT_UNIV] THEN - STRIP_TAC THEN - MP_TAC(ISPECL - [`\v:real^1. lift((f:real->real)(drop v))`; - `lift(i:real)`; - `(:real^1)`; - `m:real`; - `vec 0:real^1`] HAS_INTEGRAL_AFFINITY) THEN - ANTS_TAC THENL - [CONJ_TAC THENL [FIRST_ASSUM ACCEPT_TAC; ASM_REAL_ARITH_TAC]; + REWRITE_TAC[simple_martingale] THEN STRIP_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) (\x:A. (M1:num->A->real) n x - (M2:num->A->real) n x)` ASSUME_TAC THENL + [GEN_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `(M1:num->A->real) n`; `(M2:num->A->real) n`] SIMPLE_RV_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[simple_adapted] THEN CONJ_TAC THENL + [REWRITE_TAC[adapted] THEN GEN_TAC THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(M1:num->A->real) n`; `(M2:num->A->real) n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `simple_adapted (p:A prob_space) FF M1` THEN + UNDISCH_TAC `simple_adapted (p:A prob_space) FF M2` THEN + REWRITE_TAC[simple_adapted; adapted] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `a IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN + UNDISCH_TAC `!n:num. sub_sigma_algebra (p:A prob_space) + ((FF:num->(A->bool)->bool) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn (a:A->bool))` ASSUME_TAC THENL + [ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; ALL_TAC] THEN + SUBGOAL_THEN `!k:num. simple_rv (p:A prob_space) (\x:A. (M1:num->A->real) k x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. (M2:num->A->real) k x * indicator_fn a x)` ASSUME_TAC THENL + [GEN_TAC THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(M1:num->A->real) k`; `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`p:A prob_space`; `(M2:num->A->real) k`; `indicator_fn (a:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. ((M1:num->A->real) (SUC n) x - (M2:num->A->real) (SUC n) x) * indicator_fn (a:A->bool) x) = + simple_expectation p (\x. M1 (SUC n) x * indicator_fn a x) - + simple_expectation p (\x. M2 (SUC n) x * indicator_fn a x)` SUBST1_TAC THENL + [SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. ((M1:num->A->real) (SUC n) x - (M2:num->A->real) (SUC n) x) * indicator_fn (a:A->bool) x) = + simple_expectation p (\x. M1 (SUC n) x * indicator_fn a x - M2 (SUC n) x * indicator_fn a x)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (M1:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x`; + `\x:A. (M2:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x`] SIMPLE_EXPECTATION_SUB) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. ((M1:num->A->real) n x - (M2:num->A->real) n x) * indicator_fn (a:A->bool) x) = + simple_expectation p (\x. M1 n x * indicator_fn a x) - + simple_expectation p (\x. M2 n x * indicator_fn a x)` SUBST1_TAC THENL + [SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. ((M1:num->A->real) n x - (M2:num->A->real) n x) * indicator_fn (a:A->bool) x) = + simple_expectation p (\x. M1 n x * indicator_fn a x - M2 n x * indicator_fn a x)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (M1:num->A->real) n x * indicator_fn (a:A->bool) x`; + `\x:A. (M2:num->A->real) n x * indicator_fn (a:A->bool) x`] SIMPLE_EXPECTATION_SUB) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN SIMP_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC]);; + +(* Predictable of difference *) +let PREDICTABLE_SUB = prove + (`!p:A prob_space FF H1 H2. + predictable p FF H1 /\ predictable p FF H2 /\ filtration p FF + ==> predictable p FF (\n x. H1 n x - H2 n x)`, + REPEAT GEN_TAC THEN REWRITE_TAC[predictable] THEN STRIP_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) 0`; + `(H1:num->A->real) 0`; `(H2:num->A->real) 0`] SIMPLE_RV_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[filtration]; + GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(H1:num->A->real) (SUC n)`; `(H2:num->A->real) (SUC n)`] SIMPLE_RV_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[filtration]]);; + +(* Doob decomposition uniqueness *) +let SIMPLE_DOOB_DECOMPOSITION_UNIQUE = prove + (`!p:A prob_space FF M1 A1 M2 A2. + (!n. FINITE (FF n)) /\ + simple_martingale p FF M1 /\ predictable p FF A1 /\ + (!x. x IN prob_carrier p ==> A1 0 x = &0) /\ + simple_martingale p FF M2 /\ predictable p FF A2 /\ + (!x. x IN prob_carrier p ==> A2 0 x = &0) /\ + (!n x. x IN prob_carrier p ==> M1 n x + A1 n x = M2 n x + A2 n x) + ==> !n x. x IN prob_carrier p /\ + ~(prob p (sigma_atom (FF n) x) = &0) + ==> M1 n x = M2 n x /\ A1 n x = A2 n x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN + SUBGOAL_THEN `predictable (p:A prob_space) FF (\n x. (A2:num->A->real) n x - A1 n x)` ASSUME_TAC THENL + [MATCH_MP_TAC PREDICTABLE_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). x IN prob_carrier (p:A prob_space) ==> + (A2:num->A->real) n x - A1 n x = (M1:num->A->real) n x - M2 n x` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_martingale (p:A prob_space) FF (\n x. (M1:num->A->real) n x - M2 n x)` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_MARTINGALE_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* A2-A1 is both predictable and a simple_martingale (since it equals M1-M2 on carrier) *) + SUBGOAL_THEN `simple_martingale (p:A prob_space) FF (\n x. (A2:num->A->real) n x - A1 n x)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_martingale (p:A prob_space) FF (\n x. (M1:num->A->real) n x - M2 n x)` THEN + REWRITE_TAC[simple_martingale; simple_adapted; adapted] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `!k:num. simple_rv (p:A prob_space) (\x:A. (A2:num->A->real) k x - (A1:num->A->real) k x)` ASSUME_TAC THENL + [GEN_TAC THEN + UNDISCH_TAC `predictable (p:A prob_space) FF (\n x. (A2:num->A->real) n x - A1 n x)` THEN + REWRITE_TAC[predictable] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + STRIP_TAC THEN + DISJ_CASES_THEN2 SUBST_ALL_TAC (CHOOSE_THEN SUBST_ALL_TAC) + (SPEC `k:num` num_CASES) THENL + [MATCH_MP_TAC SIMPLE_RV_WRT_IMP_SIMPLE_RV THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) 0` THEN + ASM_MESON_TAC[filtration]; + MATCH_MP_TAC SIMPLE_RV_WRT_IMP_SIMPLE_RV THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN + CONJ_TAC THENL [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN SIMP_TAC[]]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [CONJ_TAC THENL + [X_GEN_TAC `k:num` THEN + UNDISCH_TAC `predictable (p:A prob_space) FF (\n x. (A2:num->A->real) n x - A1 n x)` THEN + REWRITE_TAC[predictable] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN STRIP_TAC THEN + DISJ_CASES_THEN2 SUBST_ALL_TAC (CHOOSE_THEN SUBST_ALL_TAC) + (SPEC `k:num` num_CASES) THENL + [UNDISCH_TAC `simple_rv_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) 0) + (\x. (A2:num->A->real) 0 x - A1 0 x)` THEN + REWRITE_TAC[simple_rv_wrt] THEN SIMP_TAC[]; + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[simple_rv_wrt] THEN STRIP_TAC THEN + UNDISCH_TAC `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) + (\x. (A2:num->A->real) (SUC n) x - A1 (SUC n) x)` THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` MP_TAC THENL + [ASM_MESON_TAC[FILTRATION_MONO; LE; LE_REFL]; ALL_TAC] THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]]; + X_GEN_TAC `k:num` THEN FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x. ((A2:num->A->real) (SUC n) x - A1 (SUC n) x) * indicator_fn (a:A->bool) x) = + simple_expectation p + (\x. ((M1:num->A->real) (SUC n) x - M2 (SUC n) x) * indicator_fn a x)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x. ((A2:num->A->real) n x - A1 n x) * indicator_fn (a:A->bool) x) = + simple_expectation p + (\x. ((M1:num->A->real) n x - M2 n x) * indicator_fn a x)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ASM_SIMP_TAC[]; + ASM_SIMP_TAC[]]]; ALL_TAC] THEN - REWRITE_TAC[VECTOR_ADD_RID; VECTOR_MUL_RZERO; VECTOR_NEG_0; - DIMINDEX_1; REAL_POW_1; DROP_CMUL; LIFT_CMUL] THEN - ASM_SIMP_TAC[REAL_ARITH `&0 < m ==> abs m = m`] THEN - SUBGOAL_THEN `IMAGE (\v:real^1. inv m % v) (:real^1) = (:real^1)` - ASSUME_TAC THENL - [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN - GEN_TAC THEN EXISTS_TAC `m % (x:real^1)` THEN - REWRITE_TAC[VECTOR_MUL_ASSOC] THEN - ASM_SIMP_TAC[REAL_MUL_LINV; REAL_LT_IMP_NZ; VECTOR_MUL_LID]; - ASM_REWRITE_TAC[]]);; + SUBGOAL_THEN `!x:A. x IN prob_carrier (p:A prob_space) ==> + (\n x. (A2:num->A->real) n x - A1 n x) 0 x = &0` ASSUME_TAC THENL + [CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_MESON_TAC[REAL_ARITH `a = &0 /\ b = &0 ==> a - b = &0`]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `\n (x:A). (A2:num->A->real) n x - A1 n x`] PREDICTABLE_MARTINGALE_ZERO) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_TAC THEN REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(A2:num->A->real) n x - A1 n x = &0` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(M1:num->A->real) n x - M2 n x = &0` ASSUME_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[REAL_ARITH `a - b = &0 ==> a = b`]);; -(* ========================================================================= *) -(* GAUSSIAN INTEGRAL PROOF *) -(* Proved via the H(a)+J(a)=pi/4 approach (no gamma.ml needed) *) -(* Fully proved (no CHEAT_TAC in this section) *) -(* ========================================================================= *) +(* Doob-Meyer decomposition for supermartingales *) +let SIMPLE_RV_WRT_NEG = prove + (`!p:A prob_space G X. + sub_sigma_algebra p G /\ simple_rv_wrt p G X + ==> simple_rv_wrt p G (\x. --(X x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_rv_wrt] THEN STRIP_TAC THEN + CONJ_TAC THENL + [MATCH_MP_TAC MEASURABLE_WRT_NEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\y:real. --y) {(X:A->real) x | x IN prob_carrier (p:A prob_space)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_IMAGE THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `y:real` THEN STRIP_TAC THEN + EXISTS_TAC `(X:A->real) x` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `x:A` THEN ASM_REWRITE_TAC[]]]);; + +let PREDICTABLE_NEG = prove + (`!p:A prob_space FF H. + filtration p FF /\ predictable p FF H + ==> predictable p FF (\n x. --((H:num->A->real) n x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[predictable; filtration] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN STRIP_TAC THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. --((H:num->A->real) 0 x)) = (\x. --(H 0 x))` SUBST1_TAC THENL + [REFL_TAC; ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_RV_WRT_NEG THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[ETA_AX]]; + GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RV_WRT_NEG THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[ETA_AX]]]);; -(* FTC for squaring an integral *) -let FTC_SQUARE_DERIV = prove - (`!f a b. - f real_continuous_on real_interval[a,b] - ==> !x. x IN real_interval[a,b] - ==> ((\u. real_integral (real_interval[a,u]) f pow 2) - has_real_derivative - (&2 * real_integral (real_interval[a,x]) f * f x)) - (atreal x within real_interval[a,b])`, +(* Two-sided Azuma-Hoeffding for martingale *) +let AZUMA_HOEFFDING_TWO_SIDED = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) + (a:num->real) (b:num->real) (t:real) (n:num). + martingale p FF X /\ + (!n. FINITE (FF n)) /\ + (!i. i <= n ==> + !x. x IN prob_carrier p ==> + a i <= X (SUC i) x - X i x /\ X (SUC i) x - X i x <= b i) /\ + (!i. i <= n ==> a i < b i) /\ + &0 < t /\ &0 < sum(0..n) (\i. (b i - a i) pow 2) + ==> prob p {x | x IN prob_carrier p /\ + abs(X (SUC n) x - X 0 x) >= t} <= + &2 * exp(--(&2 * t pow 2 / sum(0..n) (\i. (b i - a i) pow 2)))`, REPEAT STRIP_TAC THEN - MP_TAC(ISPECL [`f:real->real`; `a:real`; `b:real`] - REAL_INTEGRAL_HAS_REAL_DERIVATIVE) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(fun th -> - MP_TAC(ISPEC `2` (MATCH_MP HAS_REAL_DERIVATIVE_POW_WITHIN th))) THEN - CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[REAL_POW_1]);; - -let FTC_SQUARE = prove - (`!f a b. f real_continuous_on real_interval[a,b] /\ a <= b - ==> real_integral (real_interval[a,b]) f pow 2 = - real_integral (real_interval[a,b]) - (\x. &2 * real_integral (real_interval[a,x]) f * f x)`, - REPEAT STRIP_TAC THEN - CONV_TAC SYM_CONV THEN - MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + ABBREV_TAC `V = sum(0..n) (\i. ((b:num->real) i - (a:num->real) i) pow 2)` THEN + ABBREV_TAC `E = exp(--(&2 * t pow 2 / V))` THEN + (* Upper tail: P(X(n+1) - X(0) >= t) <= E *) + SUBGOAL_THEN + `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + (X:num->A->real) (SUC n) x - X 0 x >= t} <= E` + (LABEL_TAC "UP") THENL + [EXPAND_TAC "E" THEN EXPAND_TAC "V" THEN + MATCH_MP_TAC AZUMA_HOEFFDING THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Lower tail: P(X(0) - X(n+1) >= t) <= E *) SUBGOAL_THEN - `real_integral (real_interval[a,b]) (f:real->real) pow 2 = - real_integral (real_interval[a,b]) f pow 2 - - real_integral (real_interval[a,a]) f pow 2` - SUBST1_TAC THENL - [SUBGOAL_THEN `real_integral (real_interval[a,a]) (f:real->real) = &0` - SUBST1_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_NULL THEN REWRITE_TAC[REAL_LE_REFL]; - REWRITE_TAC[] THEN REAL_ARITH_TAC]; + `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + (X:num->A->real) 0 x - X (SUC n) x >= t} <= E` + (LABEL_TAC "LOW") THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:num->A->real) 0 x - X (SUC n) x >= t} = + {x | x IN prob_carrier p /\ + (\n x. --(X:num->A->real) n x) (SUC n) x - (\n x. --X n x) 0 x >= t}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + BETA_TAC THEN + REWRITE_TAC[REAL_ARITH `!a b:real. --a - --b = b - a`]; + ALL_TAC] THEN + EXPAND_TAC "E" THEN EXPAND_TAC "V" THEN + MP_TAC(ISPECL + [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `\n x:A. --((X:num->A->real) n x)`; + `\i. --((b:num->real) i)`; `\i. --((a:num->real) i)`; + `t:real`; `n:num`] AZUMA_HOEFFDING) THEN + CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[REAL_ARITH `!a b:real. (--a - --b) pow 2 = (b - a) pow 2`] THEN + DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC MARTINGALE_NEG THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!i. i <= n ==> !x:A. x IN prob_carrier (p:A prob_space) ==> + (a:num->real) i <= (X:num->A->real) (SUC i) x - X i x /\ + X (SUC i) x - X i x <= (b:num->real) i` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN - MP_TAC(ISPECL - [`\u:real. real_integral (real_interval[a,u]) (f:real->real) pow 2`; - `\x:real. &2 * real_integral (real_interval[a,x]) (f:real->real) * f x`; - `a:real`; `b:real`] - REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN - BETA_TAC THEN - ANTS_TAC THENL - [ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN - MP_TAC(ISPECL [`f:real->real`; `a:real`; `b:real`] FTC_SQUARE_DERIV) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN - ASM_REWRITE_TAC[]; - SIMP_TAC[]]);; + (* Combine: P(|f| >= t) <= P(f >= t) + P(-f >= t) <= 2E *) + SUBGOAL_THEN `random_variable (p:A prob_space) (\x:A. (X:num->A->real) (SUC n) x - X 0 x)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[martingale]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ (X:num->A->real) (SUC n) x - X 0 x >= t} + + prob p {x:A | x IN prob_carrier p /\ X 0 x - X (SUC n) x >= t}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + ({x:A | x IN prob_carrier p /\ (X:num->A->real) (SUC n) x - X 0 x >= t} UNION + {x:A | x IN prob_carrier p /\ X 0 x - X (SUC n) x >= t})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN + CONJ_TAC THEN MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[martingale]]; + REWRITE_TAC[SUBSET; IN_UNION; IN_ELIM_THM] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN REAL_ARITH_TAC]; + MATCH_MP_TAC PROB_SUBADDITIVE THEN + CONJ_TAC THEN MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[martingale]]]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `E + E:real` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN + CONJ_TAC THENL [USE_THEN "UP" ACCEPT_TAC; USE_THEN "LOW" ACCEPT_TAC]; + REAL_ARITH_TAC]]);; -(* Arctan integral *) -let ARCTAN_INTEGRAL = prove - (`((\t. inv(&1 + t pow 2)) has_real_integral (pi / &4)) - (real_interval [&0, &1])`, - SUBGOAL_THEN `pi / &4 = atn(&1) - atn(&0)` SUBST1_TAC THENL - [REWRITE_TAC[ATN_1; ATN_0] THEN REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS THEN - CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - REPEAT STRIP_TAC THEN - MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN THEN - REWRITE_TAC[HAS_REAL_DERIVATIVE_ATN]);; +(* ========================================================================= *) +(* DOOB CONCENTRATION INEQUALITIES *) +(* ========================================================================= *) -(* Antiderivative of x*exp(-cx^2) *) -let EXP_QUAD_ANTIDERIV = prove - (`!c a b. &0 < c /\ a <= b - ==> ((\x. x * exp(--(c * x pow 2))) - has_real_integral - (inv(&2 * c) * (exp(--(c * a pow 2)) - exp(--(c * b pow 2))))) - (real_interval[a,b])`, +(* One-sided Doob concentration: apply Azuma-Hoeffding to the Doob simple_martingale *) +let DOOB_CONCENTRATION = prove + (`!p:A prob_space FF (X:A->real) (a:num->real) (b:num->real) (t:real) (n:num). + filtration p FF /\ (!n. FINITE (FF n)) /\ integrable p X /\ + (!i. i <= n ==> + !x. x IN prob_carrier p ==> + a i <= cond_exp p (FF (SUC i)) X x - + cond_exp p (FF i) X x /\ + cond_exp p (FF (SUC i)) X x - + cond_exp p (FF i) X x <= b i) /\ + (!i. i <= n ==> a i < b i) /\ + &0 < t /\ &0 < sum(0..n) (\i. (b i - a i) pow 2) + ==> prob p {x | x IN prob_carrier p /\ + cond_exp p (FF (SUC n)) X x - + cond_exp p (FF 0) X x >= t} <= + exp(--(&2 * t pow 2 / sum(0..n) (\i. (b i - a i) pow 2)))`, REPEAT STRIP_TAC THEN - SUBGOAL_THEN - `inv(&2 * c) * (exp(--(c * a pow 2)) - exp(--(c * b pow 2))) = - (--inv(&2 * c) * exp(--(c * b pow 2))) - - (--inv(&2 * c) * exp(--(c * a pow 2)))` - SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `(\n. cond_exp p ((FF:num->(A->bool)->bool) n) (X:A->real))`; + `a:num->real`; `b:num->real`; `t:real`; `n:num`] + AZUMA_HOEFFDING) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN - REPEAT STRIP_TAC THEN - MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN THEN - SUBGOAL_THEN `~(&2 * c = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `x * exp(--(c * x pow 2)) = - --inv(&2 * c) * (--(c * &2 * x) * exp(--(c * x pow 2)))` - SUBST1_TAC THENL - [UNDISCH_TAC `~(&2 * c = &0)` THEN CONV_TAC REAL_FIELD; - ALL_TAC] THEN - MATCH_MP_TAC HAS_REAL_DERIVATIVE_LMUL_ATREAL THEN - REAL_DIFF_TAC THEN - CONV_TAC NUM_REDUCE_CONV THEN - REWRITE_TAC[REAL_POW_1; REAL_MUL_RID] THEN - REAL_ARITH_TAC);; + MATCH_MP_TAC DOOB_MARTINGALE THEN ASM_REWRITE_TAC[]);; -(* exp(-x^2) continuity and integrability *) -let EXP_NEG_X2_INTEGRABLE = prove - (`!a b. (\x. exp(--(x pow 2))) real_integrable_on real_interval[a,b]`, - REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; +(* Two-sided Doob concentration *) +let DOOB_CONCENTRATION_TWO_SIDED = prove + (`!p:A prob_space FF (X:A->real) (a:num->real) (b:num->real) (t:real) (n:num). + filtration p FF /\ (!n. FINITE (FF n)) /\ integrable p X /\ + (!i. i <= n ==> + !x. x IN prob_carrier p ==> + a i <= cond_exp p (FF (SUC i)) X x - + cond_exp p (FF i) X x /\ + cond_exp p (FF (SUC i)) X x - + cond_exp p (FF i) X x <= b i) /\ + (!i. i <= n ==> a i < b i) /\ + &0 < t /\ &0 < sum(0..n) (\i. (b i - a i) pow 2) + ==> prob p {x | x IN prob_carrier p /\ + abs(cond_exp p (FF (SUC n)) X x - + cond_exp p (FF 0) X x) >= t} <= + &2 * exp(--(&2 * t pow 2 / sum(0..n) (\i. (b i - a i) pow 2)))`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `(\n. cond_exp p ((FF:num->(A->bool)->bool) n) (X:A->real))`; + `a:num->real`; `b:num->real`; `t:real`; `n:num`] + AZUMA_HOEFFDING_TWO_SIDED) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC DOOB_MARTINGALE THEN ASM_REWRITE_TAC[]);; -let EXP_NEG_X2_CONTINUOUS = prove - (`(\x. exp(--(x pow 2))) real_continuous_on real_interval[a,b]`, - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; +(* ========================================================================= *) +(* McDIARMID'S INEQUALITY *) +(* ========================================================================= *) -(* Limit building blocks *) -let REALLIM_EXP_NEG = prove - (`((\x. exp(--x)) ---> &0) at_posinfinity`, - REWRITE_TAC[REALLIM_AT_POSINFINITY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - EXISTS_TAC `inv(e) + &1` THEN - X_GEN_TAC `x:real` THEN DISCH_TAC THEN - REWRITE_TAC[REAL_SUB_RZERO; REAL_EXP_NEG] THEN - SUBGOAL_THEN `abs(inv(exp x)) = inv(exp x)` SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; +(* Sigma-algebra generated by simple random variables X_0,...,X_{n-1}. + rv_sigma p X n contains exactly those subsets of the carrier that are + "determined by" X_0,...,X_{n-1}: if two points have the same X values, + they are either both in the set or both out. *) +let rv_sigma = new_definition + `rv_sigma (p:A prob_space) (X:num->A->real) (n:num) = + {a | a SUBSET prob_carrier p /\ + !x y. x IN prob_carrier p /\ y IN prob_carrier p /\ + (!k. k < n ==> (X:num->A->real) k x = X k y) + ==> (x IN a <=> y IN a)}`;; + +(* rv_sigma is a sigma-algebra *) +let SIGMA_ALGEBRA_RV_SIGMA = prove + (`!p:A prob_space X n. sigma_algebra (rv_sigma p X n)`, + REPEAT GEN_TAC THEN REWRITE_TAC[sigma_algebra; rv_sigma; IN_ELIM_THM] THEN + SUBGOAL_THEN `UNIONS {a | a SUBSET prob_carrier (p:A prob_space) /\ + (!x y. x IN prob_carrier p /\ y IN prob_carrier p /\ + (!k. k < n ==> (X:num->A->real) k x = X k y) + ==> (x IN a <=> y IN a))} = prob_carrier p` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_GSPEC; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN ASM SET_TAC[]; + DISCH_TAC THEN EXISTS_TAC `prob_carrier (p:A prob_space)` THEN + ASM_REWRITE_TAC[SUBSET_REFL] THEN MESON_TAC[]]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < inv(e)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < inv(e) + &1` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(inv(e) + &1)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `inv(&1 + x)` THEN - CONJ_TAC THENL - [MP_TAC(ISPECL [`&1 + x`; `exp x`] REAL_LE_INV2) THEN + ASM_REWRITE_TAC[SUBSET_REFL] THEN + REPEAT CONJ_TAC THENL + [MESON_TAC[]; + X_GEN_TAC `a:A->bool` THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM SET_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[IN_DIFF] THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`x:A`; `y:A`]) THEN + ASM_REWRITE_TAC[] THEN MESON_TAC[]]; + X_GEN_TAC `s:(A->bool)->bool` THEN STRIP_TAC THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_UNIONS] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN + DISCH_THEN(MP_TAC o SPEC `t:A->bool`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM SET_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[IN_UNIONS] THEN + EQ_TAC THEN STRIP_TAC THEN EXISTS_TAC `t:A->bool` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN + DISCH_THEN(MP_TAC o SPEC `t:A->bool`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL [`x:A`; `y:A`]) THEN + ASM_REWRITE_TAC[]]]);; + +(* rv_sigma at 0 is the trivial sigma-algebra *) +let RV_SIGMA_TRIVIAL = prove + (`!p:A prob_space X. + rv_sigma p X 0 = {{}:A->bool, prob_carrier p}`, + REPEAT GEN_TAC THEN REWRITE_TAC[rv_sigma; LT] THEN + REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `a:A->bool` THEN + REWRITE_TAC[IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY] THEN + EQ_TAC THENL + [STRIP_TAC THEN + ASM_CASES_TAC `a:A->bool = {}` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `a = prob_carrier (p:A prob_space)` (fun th -> REWRITE_TAC[th]) THEN + ASM_REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `z:A` THEN EQ_TAC THENL + [ASM_MESON_TAC[SUBSET]; + DISCH_TAC THEN + UNDISCH_TAC `~(a:A->bool = {})` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `w:A`) THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`w:A`; `z:A`]) THEN + ANTS_TAC THENL [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN + ASM_REWRITE_TAC[]]; + STRIP_TAC THEN ASM_REWRITE_TAC[EMPTY_SUBSET; SUBSET_REFL] THEN + REWRITE_TAC[NOT_IN_EMPTY] THEN MESON_TAC[]]);; + +(* rv_sigma is monotone increasing *) +let RV_SIGMA_MONO = prove + (`!p:A prob_space X m n. m <= n ==> rv_sigma p X m SUBSET rv_sigma p X n`, + REPEAT STRIP_TAC THEN REWRITE_TAC[rv_sigma; SUBSET] THEN + X_GEN_TAC `a:A->bool` THEN REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC);; + +(* X_k is measurable w.r.t. rv_sigma for k < n *) +let MEASURABLE_WRT_RV_SIGMA = prove + (`!p:A prob_space X k n. + k < n ==> measurable_wrt p (rv_sigma p X n) (X k)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[measurable_wrt; rv_sigma; IN_ELIM_THM] THEN + X_GEN_TAC `v:real` THEN CONJ_TAC THENL + [SET_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]);; + +(* UNIONS of rv_sigma is the carrier *) +let UNIONS_RV_SIGMA = prove + (`!p:A prob_space X n. UNIONS (rv_sigma p X n) = prob_carrier p`, + REPEAT GEN_TAC THEN + REWRITE_TAC[EXTENSION; IN_UNIONS; rv_sigma; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN ASM_MESON_TAC[SUBSET]; + DISCH_TAC THEN EXISTS_TAC `prob_carrier (p:A prob_space)` THEN + ASM_REWRITE_TAC[SUBSET_REFL] THEN MESON_TAC[]]);; + +(* Atoms of rv_sigma: the equivalence class of x *) +let rv_sigma_atom = new_definition + `rv_sigma_atom (p:A prob_space) (X:num->A->real) (n:num) (x:A) = + {y | y IN prob_carrier p /\ !k. k < n ==> X k y = X k x}`;; + +(* rv_sigma_atom equals sigma_atom of rv_sigma *) +let RV_SIGMA_ATOM_EQ = prove + (`!p:A prob_space X n x. + sigma_algebra (rv_sigma p X n) /\ x IN prob_carrier p + ==> sigma_atom (rv_sigma p X n) x = rv_sigma_atom p X n x`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `z:A` THEN + REWRITE_TAC[sigma_atom; IN_INTERS; IN_ELIM_THM] THEN + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM] THEN EQ_TAC THENL + [DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `prob_carrier (p:A prob_space)`) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[rv_sigma; IN_ELIM_THM; SUBSET_REFL] THEN MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) k y = X k x}`) THEN ANTS_TAC THENL [CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; - MP_TAC(SPEC `x:real` REAL_EXP_LE_X) THEN REAL_ARITH_TAC]; - SIMP_TAC[]]; - MP_TAC(ISPECL [`inv(e) + &1`; `&1 + x`] REAL_LE_INV2) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; SIMP_TAC[]]]; - SUBGOAL_THEN `inv(inv e + &1) * (inv e + &1) = &1` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_MUL_LINV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `e * inv e = &1` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_MUL_RINV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `inv(inv e + &1) * (inv e + &1) < e * (inv e + &1)` MP_TAC THENL - [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; - ASM_SIMP_TAC[REAL_LT_RMUL_EQ]]]);; + [REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MESON_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[]]; + SIMP_TAC[IN_ELIM_THM]]]; + STRIP_TAC THEN X_GEN_TAC `t:A->bool` THEN STRIP_TAC THEN + UNDISCH_TAC `t IN rv_sigma (p:A prob_space) (X:num->A->real) n` THEN + REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`z:A`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; + +(* rv_sigma_atom is in rv_sigma for simple RVs *) +let RV_SIGMA_ATOM_IN_SIGMA = prove + (`!p:A prob_space X n x. + (!k. k < n ==> simple_rv p (X k)) /\ x IN prob_carrier p + ==> rv_sigma_atom p X n x IN rv_sigma p X n`, + REPEAT STRIP_TAC THEN REWRITE_TAC[rv_sigma; rv_sigma_atom; IN_ELIM_THM] THEN + CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]);; -let REALLIM_EXP_NEG_SQ = prove - (`((\x. exp(--(x pow 2))) ---> &0) at_posinfinity`, - REWRITE_TAC[REALLIM_AT_POSINFINITY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - MP_TAC(SPEC `e:real` - (REWRITE_RULE[REALLIM_AT_POSINFINITY] REALLIM_EXP_NEG)) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_THEN `N:real` ASSUME_TAC) THEN - EXISTS_TAC `max (&1) N` THEN - X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `y pow 2 >= N` ASSUME_TAC THENL - [REWRITE_TAC[real_ge] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `y:real` THEN +(* Every element of rv_sigma is a union of rv_sigma_atoms *) +let RV_SIGMA_UNION_OF_ATOMS = prove + (`!p:A prob_space X n a. + a IN rv_sigma p X n + ==> a = UNIONS {rv_sigma_atom p X n x | x | x IN a}`, + REPEAT STRIP_TAC THEN + POP_ASSUM(MP_TAC o REWRITE_RULE[rv_sigma; IN_ELIM_THM]) THEN STRIP_TAC THEN + REWRITE_TAC[EXTENSION; IN_UNIONS; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [DISCH_TAC THEN + EXISTS_TAC `rv_sigma_atom (p:A prob_space) X n z` THEN CONJ_TAC THENL + [EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM] THEN + ASM_MESON_TAC[SUBSET]]; + STRIP_TAC THEN + SUBGOAL_THEN `(z:A) IN rv_sigma_atom (p:A prob_space) (X:num->A->real) n x` + MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM] THEN STRIP_TAC THEN + SUBGOAL_THEN `(x:A) IN prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`z:A`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; + +(* rv_sigma_atom is an event for simple RVs *) +let RV_SIGMA_ATOM_IN_EVENTS = prove + (`!p:A prob_space X n x. + (!k. k < n ==> simple_rv p (X k)) /\ x IN prob_carrier p + ==> rv_sigma_atom p X n x IN prob_events p`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN + REPEAT STRIP_TAC THENL + [REWRITE_TAC[rv_sigma_atom; LT; IN_ELIM_THM] THEN + SUBGOAL_THEN `{y:A | y IN prob_carrier p} = prob_carrier p` + (fun th -> REWRITE_TAC[th; PROB_CARRIER_IN_EVENTS]) THEN + SET_TAC[]; + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM; LT] THEN + SUBGOAL_THEN + `{y:A | y IN prob_carrier p /\ + !k. k = n \/ k < n ==> (X:num->A->real) k y = X k x} = + rv_sigma_atom p X n x INTER + {y | y IN prob_carrier p /\ X n y = X n x}` + SUBST1_TAC THENL + [REWRITE_TAC[rv_sigma_atom; EXTENSION; IN_INTER; IN_ELIM_THM] THEN + MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_MESON_TAC[LT_TRANS; LT_SUC_LE; LT_IMP_LE]; + SUBGOAL_THEN `random_variable (p:A prob_space) ((X:num->A->real) n)` + (fun th -> REWRITE_TAC[MATCH_MP RANDOM_VARIABLE_LEVEL_SET th]) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[LT; simple_rv] THEN MESON_TAC[]]]);; + +(* FINITE number of distinct rv_sigma_atoms *) +let FINITE_RV_SIGMA_ATOMS = prove + (`!p:A prob_space X n. + (!k. k < n ==> simple_rv p (X k)) + ==> FINITE {rv_sigma_atom p X n x | x | x IN prob_carrier p}`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [(* Base: n = 0, all atoms equal carrier *) + DISCH_TAC THEN MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{prob_carrier (p:A prob_space)}` THEN + REWRITE_TAC[FINITE_SING; SUBSET; IN_ELIM_THM; IN_SING] THEN + X_GEN_TAC `s:A->bool` THEN STRIP_TAC THEN + ASM_REWRITE_TAC[rv_sigma_atom; LT] THEN SET_TAC[]; + (* Step: atoms(SUC n) subset of {a INTER level_set | a, v} *) + DISCH_TAC THEN + SUBGOAL_THEN + `FINITE {rv_sigma_atom (p:A prob_space) X n x | x | + x IN prob_carrier p}` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `FINITE {(X:num->A->real) n x | x | x IN prob_carrier p}` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[LT; simple_rv] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC + `{(a:(A->bool)) INTER + {y:A | y IN prob_carrier p /\ (X:num->A->real) n y = v} | + a,v | + a IN {rv_sigma_atom p X n z | z | z IN prob_carrier p} /\ + v IN {X n z | z | z IN prob_carrier p}}` THEN CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; - REWRITE_TAC[REAL_POW_2] THEN - MP_TAC(ISPECL [`y:real`; `&1`; `y:real`] REAL_LE_LMUL) THEN - REWRITE_TAC[REAL_MUL_RID] THEN - DISCH_THEN MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC]; - ASM_MESON_TAC[]]);; + [MATCH_MP_TAC FINITE_PRODUCT_DEPENDENT THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `rv_sigma_atom (p:A prob_space) X n w` THEN + EXISTS_TAC `(X:num->A->real) n w` THEN + REPEAT CONJ_TAC THENL + [EXISTS_TAC `w:A` THEN ASM_REWRITE_TAC[]; + EXISTS_TAC `w:A` THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[rv_sigma_atom; EXTENSION; IN_INTER; IN_ELIM_THM; LT] THEN + MESON_TAC[]]]]);; + +(* Elements of rv_sigma are events *) +let RV_SIGMA_IN_EVENTS = prove + (`!p:A prob_space X n a. + (!k. k < n ==> simple_rv p (X k)) /\ a IN rv_sigma p X n + ==> a IN prob_events p`, + REPEAT STRIP_TAC THEN + ASM_CASES_TAC `a:A->bool = {}` THENL + [ASM_REWRITE_TAC[PROB_EMPTY_IN_EVENTS]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; `a:A->bool`] + RV_SIGMA_UNION_OF_ATOMS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `(a:A->bool) SUBSET prob_carrier p` ASSUME_TAC THENL + [UNDISCH_TAC `a IN rv_sigma (p:A prob_space) (X:num->A->real) n` THEN + REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `z:A` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC RV_SIGMA_ATOM_IN_EVENTS THEN + ASM_MESON_TAC[SUBSET]; + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{rv_sigma_atom (p:A prob_space) X n x | x | + x IN prob_carrier p}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA_ATOMS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_MESON_TAC[SUBSET]]]);; + +(* rv_sigma is a sub_sigma_algebra *) +let SUB_SIGMA_ALGEBRA_RV_SIGMA = prove + (`!p:A prob_space X n. + (!k. k < n ==> simple_rv p (X k)) + ==> sub_sigma_algebra p (rv_sigma p X n)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[sub_sigma_algebra] THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[SIGMA_ALGEBRA_RV_SIGMA]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC RV_SIGMA_IN_EVENTS THEN + EXISTS_TAC `X:num->A->real` THEN EXISTS_TAC `n:num` THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[UNIONS_RV_SIGMA]]);; -(* Integrand bound *) -let INTEGRAND_BOUND = prove - (`!B t. &0 <= t /\ t <= &1 - ==> exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) <= - exp(--(B pow 2))`, +(* rv_sigma is FINITE for simple RVs *) +let FINITE_RV_SIGMA = prove + (`!p:A prob_space X n. + (!k. k < n ==> simple_rv p (X k)) + ==> FINITE (rv_sigma p X n)`, REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `exp(--(B pow 2)) * inv(&1 + t pow 2)` THEN + SUBGOAL_THEN + `FINITE {rv_sigma_atom (p:A prob_space) X n x | x | x IN prob_carrier p}` + ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA_ATOMS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC + `IMAGE UNIONS + {s:(A->bool)->bool | + s SUBSET {rv_sigma_atom (p:A prob_space) X n x | x | + x IN prob_carrier p}}` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_EXP_MONO_LE; REAL_LE_NEG2] THEN - MP_TAC(SPEC `&1 + (t:real) pow 2` (SPEC `&1` - (SPEC `(B:real) pow 2` REAL_LE_LMUL))) THEN - REWRITE_TAC[REAL_MUL_RID] THEN - DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_LE_POW_2]; - MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; - MATCH_MP_TAC REAL_LE_INV THEN - MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; - MP_TAC(SPEC `&1` (SPEC `inv(&1 + (t:real) pow 2)` - (SPEC `exp(--((B:real) pow 2))` REAL_LE_LMUL))) THEN - REWRITE_TAC[REAL_MUL_RID] THEN - DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; - MATCH_MP_TAC REAL_INV_LE_1 THEN - MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]]);; - -(* H(B) -> 0 *) -let H_LIMIT_ZERO = prove - (`((\B. real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))) - ---> &0) at_posinfinity`, - MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN - EXISTS_TAC `\B:real. exp(--(B pow 2))` THEN + [MATCH_MP_TAC FINITE_IMAGE THEN + MATCH_MP_TAC FINITE_POWERSET THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `a:A->bool` THEN DISCH_TAC THEN + EXISTS_TAC `{rv_sigma_atom (p:A prob_space) X n x | x | + x IN (a:A->bool)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RV_SIGMA_UNION_OF_ATOMS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + SUBGOAL_THEN `(a:A->bool) SUBSET prob_carrier p` MP_TAC THENL + [UNDISCH_TAC `a IN rv_sigma (p:A prob_space) (X:num->A->real) n` THEN + REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN MESON_TAC[]; + REWRITE_TAC[SUBSET] THEN MESON_TAC[]]]]);; + +(* rv_sigma forms a filtration (capped at SUC n to ensure sub_sigma_algebra) *) +let FILTRATION_RV_SIGMA = prove + (`!p:A prob_space X n. + (!k. k <= n ==> simple_rv p (X k)) + ==> filtration p (\k. rv_sigma p X (MIN k (SUC n)))`, + REPEAT STRIP_TAC THEN REWRITE_TAC[filtration] THEN BETA_TAC THEN CONJ_TAC THENL - [REWRITE_TAC[EVENTUALLY_AT_POSINFINITY] THEN - EXISTS_TAC `&0` THEN X_GEN_TAC `B:real` THEN DISCH_TAC THEN + [GEN_TAC THEN MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REPEAT STRIP_TAC THEN MATCH_MP_TAC RV_SIGMA_MONO THEN ASM_ARITH_TAC]);; + +(* cond_exp with trivial sigma-algebra = expectation *) +let COND_EXP_RV_SIGMA_TRIVIAL = prove + (`!p:A prob_space X f x. + integrable p f /\ x IN prob_carrier p + ==> cond_exp p (rv_sigma p X 0) f x = expectation p f`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[cond_exp] THEN + (* sigma_atom of rv_sigma 0 at x is prob_carrier *) + SUBGOAL_THEN `sigma_atom (rv_sigma (p:A prob_space) X 0) x = + prob_carrier p` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `0`; `x:A`] + RV_SIGMA_ATOM_EQ) THEN + REWRITE_TAC[SIGMA_ALGEBRA_RV_SIGMA] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[rv_sigma_atom; LT] THEN SET_TAC[]; + ALL_TAC] THEN + (* prob p carrier = 1, not 0 *) + SUBGOAL_THEN `~(prob (p:A prob_space) (prob_carrier p) = &0)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[PROB_SPACE] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[PROB_SPACE] THEN + REWRITE_TAC[REAL_DIV_1] THEN + MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* cond_exp returns f when f is measurable w.r.t. G *) +let COND_EXP_SELF = prove + (`!p:A prob_space G (f:A->real) x. + sub_sigma_algebra p G /\ FINITE G /\ integrable p f /\ + measurable_wrt p G f /\ x IN prob_carrier p /\ + ~(prob p (sigma_atom G x) = &0) + ==> cond_exp p G f x = f x`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[cond_exp] THEN + ASM_REWRITE_TAC[] THEN + (* sigma_atom in events *) + SUBGOAL_THEN `sigma_atom G (x:A) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + (* f is constant on sigma_atom G x: f y = f x for y in atom *) + SUBGOAL_THEN `!y:A. y IN sigma_atom G x ==> (f:A->real) y = f x` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC MEASURABLE_WRT_CONSTANT_ON_ATOM THEN + EXISTS_TAC `p:A prob_space` THEN EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* E[f * 1_atom] = f(x) * P(atom) via chain of equalities *) + SUBGOAL_THEN + `expectation p (\y:A. (f:A->real) y * indicator_fn (sigma_atom G x) y) = + f x * prob p (sigma_atom G x)` SUBST1_TAC THENL + [MATCH_MP_TAC EQ_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\y:A. (f:A->real) x * indicator_fn (sigma_atom G x) y)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [AP_THM_TAC THEN AP_TERM_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; + (* E[\y. f(x) * 1_atom y] = f(x) * P(atom) *) + MATCH_MP_TAC EQ_TRANS THEN + EXISTS_TAC `(f:A->real) x * + expectation (p:A prob_space) + (indicator_fn (sigma_atom G (x:A)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + REWRITE_TAC[GSYM real_div] THEN + ASM_SIMP_TAC[REAL_DIV_REFL; REAL_MUL_RID]);; + +(* Mutual independence of a finite sequence of random variables *) +let mutually_indep_rv = new_definition + `mutually_indep_rv (p:A prob_space) (X:num->A->real) (n:num) <=> + (!k. k <= n ==> random_variable p (X k)) /\ + (!S f. FINITE S /\ S SUBSET (0..n) /\ ~(S = {}) + ==> prob p (INTERS (IMAGE (\k. {x | x IN prob_carrier p /\ + (X:num->A->real) k x = f k}) S)) = + product S (\k. prob p {x | x IN prob_carrier p /\ + X k x = f k}))`;; + +(* Bounded differences property: changing one variable changes f by at most c *) +let bounded_differences = new_definition + `bounded_differences (p:A prob_space) (X:num->A->real) + (f:A->real) (c:num->real) (n:num) <=> + (!i. i < n ==> &0 <= c i) /\ + (!i x y. i < n /\ x IN prob_carrier p /\ y IN prob_carrier p /\ + (!j. j < n /\ ~(j = i) ==> (X:num->A->real) j x = X j y) + ==> abs(f x - f y) <= c i)`;; + +(* Positive probability of rv_sigma atoms under mutual independence + and positive level-set probabilities *) +let POSITIVE_PROB_RV_SIGMA_ATOM = prove + (`!p:A prob_space (X:num->A->real) m n x. + mutually_indep_rv p X (n - 1) /\ + (!k z:A. k < n /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + x IN prob_carrier p /\ 1 <= m /\ m <= n /\ 1 <= n + ==> ~(prob p (sigma_atom (rv_sigma p X m) x) = &0)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sigma_atom (rv_sigma (p:A prob_space) X m) x = + rv_sigma_atom p X m x` SUBST_ALL_TAC THENL + [MATCH_MP_TAC RV_SIGMA_ATOM_EQ THEN ASM_REWRITE_TAC[SIGMA_ALGEBRA_RV_SIGMA]; + ALL_TAC] THEN + SUBGOAL_THEN `rv_sigma_atom (p:A prob_space) X m x = + INTERS (IMAGE (\k. {y | y IN prob_carrier p /\ + (X:num->A->real) k y = X k x}) {k | k < m})` + SUBST_ALL_TAC THENL + [REWRITE_TAC[rv_sigma_atom; EXTENSION; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN X_GEN_TAC `s:A->bool` THEN + REWRITE_TAC[IN_IMAGE; IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `{y:A | y IN prob_carrier p /\ + (X:num->A->real) 0 y = X 0 x}`) THEN + REWRITE_TAC[IN_IMAGE; IN_ELIM_THM] THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN ASM_ARITH_TAC; + SIMP_TAC[IN_ELIM_THM]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `{y:A | y IN prob_carrier p /\ + (X:num->A->real) k y = X k x}`) THEN + REWRITE_TAC[IN_IMAGE; IN_ELIM_THM] THEN + ANTS_TAC THENL + [EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[]; + SIMP_TAC[IN_ELIM_THM]]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) (INTERS (IMAGE (\k. {y | y IN prob_carrier p /\ + (X:num->A->real) k y = X k x}) {k | k < m})) = + product {k | k < m} (\k. prob p {y | y IN prob_carrier p /\ X k y = X k x})` + SUBST_ALL_TAC THENL + [UNDISCH_TAC `mutually_indep_rv (p:A prob_space) X (n - 1)` THEN + REWRITE_TAC[mutually_indep_rv] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + REWRITE_TAC[FINITE_NUMSEG_LT] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ASM_ARITH_TAC; + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `0` THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < product {k | k < m} + (\k. prob (p:A prob_space) {y | y IN prob_carrier p /\ + (X:num->A->real) k y = X k x})` + MP_TAC THENL + [MATCH_MP_TAC PRODUCT_POS_LT THEN + REWRITE_TAC[FINITE_NUMSEG_LT; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]);; + +(* cond_exp at level n equals f under positive-prob atoms *) +let COND_EXP_RV_SIGMA_N = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) n x. + mutually_indep_rv p X (n - 1) /\ + (!k z:A. k < n /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + measurable_wrt p (rv_sigma p X n) f /\ + integrable p f /\ + (!k. k < n ==> simple_rv p (X k)) /\ + 1 <= n /\ x IN prob_carrier p + ==> cond_exp p (rv_sigma p X n) f x = f x`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC COND_EXP_SELF THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[LE_REFL]]);; + +(* sigma_atom of rv_sigma 0 is the whole carrier *) +let SIGMA_ATOM_RV_SIGMA_0 = prove + (`!p:A prob_space X x. x IN prob_carrier p ==> + sigma_atom (rv_sigma p X 0) x = prob_carrier p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[RV_SIGMA_TRIVIAL] THEN + REWRITE_TAC[sigma_atom; EXTENSION; IN_INTERS; IN_ELIM_THM; + IN_INSERT; NOT_IN_EMPTY] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [DISCH_THEN(MP_TAC o SPEC `prob_carrier (p:A prob_space)`) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [DISJ2_TAC THEN REWRITE_TAC[]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[]]; + DISCH_TAC THEN X_GEN_TAC `t:A->bool` THEN STRIP_TAC THENL + [UNDISCH_TAC `(x:A) IN t` THEN ASM_MESON_TAC[]; + ASM_MESON_TAC[]]]);; + +(* Algebraic helper for extracting bound from product *) +let BOUND_FROM_PRODUCT = prove + (`!gx ci e p. (gx - ci) * p <= e /\ e <= (gx + ci) * p /\ &0 < p + ==> --ci <= gx - e / p /\ gx - e / p <= ci`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `gx - ci <= e / p /\ e / p <= gx + ci` MP_TAC THENL + [CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN ASM_REAL_ARITH_TAC]; + REAL_ARITH_TAC]);; + +(* Tower property for cond_exp: E[f|G] = E[E[f|H]|G] when G SUBSET H *) +let COND_EXP_ITERATED = prove + (`!p:A prob_space G H (f:A->real). + sub_sigma_algebra p G /\ FINITE G /\ + sub_sigma_algebra p H /\ FINITE H /\ + G SUBSET H /\ integrable p f + ==> !x. x IN prob_carrier p ==> + cond_exp p G (cond_exp p H f) x = cond_exp p G f x`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[cond_exp] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + SUBGOAL_THEN `(\y:A. (if prob p (sigma_atom H y) = &0 then &0 + else expectation p (\y'. (f:A->real) y' * indicator_fn (sigma_atom H y) y') / + prob p (sigma_atom H y)) * + indicator_fn (sigma_atom G x) y) = + (\y. cond_exp p H f y * indicator_fn (sigma_atom G x) y)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; cond_exp]; + ALL_TAC] THEN + MATCH_MP_TAC COND_EXP_CONDITIONING THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `sigma_atom G (x:A) IN (G:(A->bool)->bool)` MP_TAC THENL + [MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + ASM_MESON_TAC[sub_sigma_algebra]; + ASM_MESON_TAC[SUBSET]]);; + +(* Monotonicity of mutually_indep_rv: larger n is stronger *) +let MUTUALLY_INDEP_RV_MONO = prove + (`!p:A prob_space X m n. m <= n /\ mutually_indep_rv p X n + ==> mutually_indep_rv p X m`, + REPEAT GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + REWRITE_TAC[mutually_indep_rv] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `0..m` THEN + ASM_REWRITE_TAC[SUBSET_NUMSEG] THEN ASM_ARITH_TAC]);; + +(* Integrability of finite sums *) +let INTEGRABLE_SUM_FINITE = prove + (`!p:A prob_space (s:B->bool) (f:B->A->real). + FINITE s /\ (!x. x IN s ==> integrable p (f x)) + ==> integrable p (\w. sum s (\x. f x w))`, + GEN_TAC THEN + SUBGOAL_THEN `!s:B->bool. FINITE s ==> !f:B->A->real. + (!x. x IN s ==> integrable p (f x)) + ==> integrable p (\w. sum s (\x. f x w))` + (fun th -> MESON_TAC[th]) THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN + SIMP_TAC[SUM_CLAUSES; NOT_IN_EMPTY; INTEGRABLE_CONST] THEN + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\w:A. (f:B->A->real) x w) = f x` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_INSERT]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[IN_INSERT]]);; + +(* Linearity of expectation for finite sums *) +let EXPECTATION_SUM_FINITE = prove + (`!p:A prob_space (s:B->bool) (f:B->A->real). + FINITE s /\ (!x. x IN s ==> integrable p (f x)) + ==> expectation p (\w. sum s (\x. f x w)) = + sum s (\x. expectation p (f x))`, + GEN_TAC THEN + SUBGOAL_THEN `!s:B->bool. FINITE s ==> !f:B->A->real. + (!x. x IN s ==> integrable p (f x)) + ==> expectation p (\w. sum s (\x. f x w)) = + sum s (\x. expectation p (f x))` + (fun th -> MESON_TAC[th]) THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN + CONJ_TAC THENL + [SIMP_TAC[SUM_CLAUSES; NOT_IN_EMPTY; EXPECTATION_CONST]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SUM_CLAUSES] THEN + SUBGOAL_THEN + `expectation p (\w:A. (f:B->A->real) x w + sum s (\x. f x w)) = + expectation p (\w. f x w) + expectation p (\w. sum s (\x. f x w))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\w:A. (f:B->A->real) x w) = f x` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:B`) THEN + REWRITE_TAC[IN_INSERT]; + MATCH_MP_TAC INTEGRABLE_SUM_FINITE THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[IN_INSERT]]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\w:A. (f:B->A->real) x w) = expectation p (f x)` + SUBST1_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + AP_TERM_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[IN_INSERT]);; + +(* Witness existence: there exists a point matching given coordinate values *) +let WITNESS_EXISTS_RV = prove + (`!p:A prob_space (X:num->A->real) m (z:A) (v:real). + mutually_indep_rv p X m /\ + (!k. k < SUC m ==> simple_rv p (X k)) /\ + (!k w:A. k < SUC m /\ w IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k w}) /\ + 1 <= m /\ + z IN prob_carrier p /\ + v IN IMAGE (\w. X m w) (prob_carrier p) + ==> ?w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k z) /\ X m w = v`, + REPEAT STRIP_TAC THEN + UNDISCH_TAC `v IN IMAGE (\w:A. (X:num->A->real) m w) (prob_carrier p)` THEN + REWRITE_TAC[IN_IMAGE] THEN STRIP_TAC THEN + ABBREV_TAC `ff = \k:num. if k < m then (X:num->A->real) k z else X m x` THEN + ABBREV_TAC `S0 = INTERS (IMAGE (\k:num. {w:A | w IN prob_carrier p /\ + (X:num->A->real) k w = ff k}) (0..m))` THEN + SUBGOAL_THEN `&0 < prob p (S0:A->bool)` ASSUME_TAC THENL + [EXPAND_TAC "S0" THEN SUBGOAL_THEN - `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) - real_integrable_on real_interval[&0,&1]` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MATCH_MP_TAC REAL_LT_IMP_NZ THEN - MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; + `prob p (INTERS (IMAGE (\k:num. {w:A | w IN prob_carrier p /\ + (X:num->A->real) k w = ff k}) (0..m))) = + product (0..m) (\k. prob p {w | w IN prob_carrier p /\ X k w = ff k})` + SUBST1_TAC THENL + [UNDISCH_TAC `mutually_indep_rv p (X:num->A->real) m` THEN + REWRITE_TAC[mutually_indep_rv] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + REWRITE_TAC[FINITE_NUMSEG; SUBSET_REFL; NUMSEG_EMPTY] THEN ASM_ARITH_TAC; + MATCH_MP_TAC PRODUCT_POS_LT THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN + X_GEN_TAC `k:num` THEN STRIP_TAC THEN EXPAND_TAC "ff" THEN + COND_CASES_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `z:A`]) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + SUBGOAL_THEN `k = m:num` SUBST_ALL_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]]]; + ALL_TAC] THEN + SUBGOAL_THEN `?w:A. w IN S0` MP_TAC THENL + [REWRITE_TAC[MEMBER_NOT_EMPTY] THEN + DISCH_THEN(fun th -> MP_TAC(AP_TERM `prob (p:A prob_space)` th)) THEN + REWRITE_TAC[PROB_EMPTY] THEN + UNDISCH_TAC `&0 < prob p (S0:A->bool)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + STRIP_TAC THEN + SUBGOAL_THEN `!k:num. k <= m ==> (w:A) IN prob_carrier p /\ + (X:num->A->real) k w = ff k` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + UNDISCH_TAC `(w:A) IN S0` THEN EXPAND_TAC "S0" THEN + REWRITE_TAC[IN_INTERS; FORALL_IN_IMAGE; IN_NUMSEG; IN_ELIM_THM] THEN + DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + ASM_REWRITE_TAC[LE_0]; + ALL_TAC] THEN + EXISTS_TAC `w:A` THEN REPEAT CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN + UNDISCH_TAC `(X:num->A->real) k w = ff (k:num)` THEN + EXPAND_TAC "ff" THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN + UNDISCH_TAC `(X:num->A->real) m w = ff (m:num)` THEN + EXPAND_TAC "ff" THEN REWRITE_TAC[LT_REFL]]);; + +(* Fiber bounded differences: witnesses at different atoms differ by at most c i *) +let FIBER_BOUNDED_DIFF = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) m i x y v. + bounded_differences p X f c (SUC m) /\ + mutually_indep_rv p X m /\ + (!k. k < SUC m ==> simple_rv p (X k)) /\ + (!k z:A. k < SUC m /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + i < m /\ 1 <= m /\ + x IN prob_carrier p /\ y IN prob_carrier p /\ + (!j. j < m /\ ~(j = i) ==> X j x = X j y) /\ + v IN IMAGE (\w. X m w) (prob_carrier p) + ==> abs(f(@w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k x) /\ X m w = v) - + f(@w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k y) /\ X m w = v)) <= c i`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `wx = @w:A. w IN prob_carrier p /\ (!k. k < m ==> + (X:num->A->real) k w = X k x) /\ X m w = v` THEN + ABBREV_TAC `wy = @w:A. w IN prob_carrier p /\ (!k. k < m ==> + (X:num->A->real) k w = X k y) /\ X m w = v` THEN + SUBGOAL_THEN `(wx:A) IN prob_carrier p /\ (!k. k < m ==> + (X:num->A->real) k wx = X k x) /\ X m wx = v` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "wx" THEN CONV_TAC SELECT_CONV THEN + MATCH_MP_TAC WITNESS_EXISTS_RV THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(wy:A) IN prob_carrier p /\ (!k. k < m ==> + (X:num->A->real) k wy = X k y) /\ X m wy = v` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "wy" THEN CONV_TAC SELECT_CONV THEN + MATCH_MP_TAC WITNESS_EXISTS_RV THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `bounded_differences p (X:num->A->real) (f:A->real) c (SUC m)` THEN + REWRITE_TAC[bounded_differences] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`i:num`; `wx:A`; `wy:A`]) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `j:num` THEN STRIP_TAC THEN + ASM_CASES_TAC `j < m:num` THENL + [SUBGOAL_THEN `(X:num->A->real) j wx = X j x` ASSUME_TAC THENL + [FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(X:num->A->real) j wy = X j y` ASSUME_TAC THENL + [FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `j = m:num` SUBST_ALL_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[]]; + SIMP_TAC[]]);; + +(* Sum representation of cond_exp for rv_sigma *) +let COND_EXP_SUM_REPR = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) m (z:A). + mutually_indep_rv p X m /\ + measurable_wrt p (rv_sigma p X (SUC m)) f /\ + integrable p f /\ + (!k. k < SUC m ==> simple_rv p (X k)) /\ + (!k w:A. k < SUC m /\ w IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k w}) /\ + 1 <= m /\ + z IN prob_carrier p + ==> expectation p (\w. f w * indicator_fn (sigma_atom (rv_sigma p X m) z) w) / + prob p (sigma_atom (rv_sigma p X m) z) = + sum (IMAGE (\w. X m w) (prob_carrier p)) + (\v. f(@w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k z) /\ + X m w = v) * + prob p {w | w IN prob_carrier p /\ X m w = v})`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `A = sigma_atom (rv_sigma p (X:num->A->real) m) z` THEN + ABBREV_TAC `V = IMAGE (\w:A. (X:num->A->real) m w) (prob_carrier p)` THEN + ABBREV_TAC `fz = \v:real. (f:A->real)(@w. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z) /\ X m w = v)` THEN + ABBREV_TAC `pv = \v:real. prob p {w:A | w IN prob_carrier p /\ + (X:num->A->real) m w = v}` THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) m) /\ + (!k:num. k < m ==> simple_rv p (X k))` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [UNDISCH_TAC `!k:num. k < SUC m ==> simple_rv p ((X:num->A->real) k)` THEN + DISCH_THEN(MP_TAC o SPEC `m:num`) THEN + REWRITE_TAC[LT] THEN SIMP_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + UNDISCH_TAC `!k:num. k < SUC m ==> simple_rv p ((X:num->A->real) k)` THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `FINITE (V:real->bool)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_rv p ((X:num->A->real) m)` THEN + DISCH_THEN(fun th -> ASSUME_TAC th THEN + MP_TAC(REWRITE_RULE[simple_rv] th)) THEN + EXPAND_TAC "V" THEN SIMP_TAC[SIMPLE_IMAGE]; ALL_TAC] THEN + SUBGOAL_THEN `~(prob p (A:A->bool) = &0)` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `SUC m` THEN + ASM_REWRITE_TAC[SUC_SUB1; ARITH_RULE `1 <= SUC m`] THEN + ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `&0 <= real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` + SUBGOAL_THEN `sub_sigma_algebra p (rv_sigma p (X:num->A->real) m)` + ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [SUBGOAL_THEN `A IN rv_sigma p (X:num->A->real) m` MP_TAC THENL + [EXPAND_TAC "A" THEN MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + REPEAT CONJ_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; + MATCH_MP_TAC FINITE_RV_SIGMA THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[sub_sigma_algebra]]; + UNDISCH_TAC `sub_sigma_algebra p (rv_sigma p (X:num->A->real) m)` THEN + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `A = {w:A | w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)}` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real)`; `m:num`; `z:A`] + RV_SIGMA_ATOM_EQ) THEN + ANTS_TAC THENL + [UNDISCH_TAC `sub_sigma_algebra p (rv_sigma p (X:num->A->real) m)` THEN + REWRITE_TAC[sub_sigma_algebra] THEN STRIP_TAC THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[rv_sigma_atom]]; + ALL_TAC] THEN + SUBGOAL_THEN `!v:real. {w:A | w IN prob_carrier p /\ + (X:num->A->real) m w = v} IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `{w:A | w IN prob_carrier p /\ (X:num->A->real) m w = v} IN + rv_sigma p X (SUC m)` MP_TAC THENL + [REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN CONJ_TAC THENL + [SET_TAC[]; + REPEAT STRIP_TAC THEN EQ_TAC THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN ASM_SIMP_TAC[LT]]; + SUBGOAL_THEN `sub_sigma_algebra p (rv_sigma p (X:num->A->real) (SUC m))` + MP_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + SUBGOAL_THEN `!v:real. v IN V ==> + prob p (A INTER {w:A | w IN prob_carrier p /\ (X:num->A->real) m w = v}) = + prob p A * pv v` ASSUME_TAC THENL + [X_GEN_TAC `v:real` THEN DISCH_TAC THEN + ABBREV_TAC `ff:num->real = \k. if k < m then (X:num->A->real) k z else v` THEN + SUBGOAL_THEN `A INTER {w:A | w IN prob_carrier p /\ + (X:num->A->real) m w = v} = + INTERS(IMAGE (\k. {w | w IN prob_carrier p /\ X k w = ff k}) (0..m))` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTER; IN_INTERS; IN_ELIM_THM; + FORALL_IN_IMAGE; IN_NUMSEG] THEN + X_GEN_TAC `w:A` THEN EQ_TAC THENL + [DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o REWRITE_RULE[IN_ELIM_THM])) THEN + STRIP_TAC THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN + UNDISCH_TAC `(w:A) IN A` THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "ff" THEN + ASM_CASES_TAC `k:num < m` THENL + [ASM_SIMP_TAC[]; + SUBGOAL_THEN `k:num = m` SUBST1_TAC THENL + [UNDISCH_TAC `k <= m:num` THEN + UNDISCH_TAC `~(k < m:num)` THEN ARITH_TAC; + ASM_REWRITE_TAC[LT_REFL]]]; + DISCH_TAC THEN + SUBGOAL_THEN `(w:A) IN prob_carrier p` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + ANTS_TAC THENL [UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ASM_REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL + [X_GEN_TAC `j:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `j < m:num` THEN ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM]] THEN + STRIP_TAC THEN + UNDISCH_TAC + `(\k:num. if k < m then (X:num->A->real) k z else v) = ff` THEN + DISCH_THEN(SUBST_ALL_TAC o SYM) THEN ASM_SIMP_TAC[]; + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + ANTS_TAC THENL [ARITH_TAC; REWRITE_TAC[IN_ELIM_THM]] THEN + STRIP_TAC THEN + UNDISCH_TAC + `(\k:num. if k < m then (X:num->A->real) k z else v) = ff` THEN + DISCH_THEN(SUBST_ALL_TAC o SYM) THEN ASM_SIMP_TAC[LT_REFL]]]; + ALL_TAC] THEN + UNDISCH_TAC `mutually_indep_rv p (X:num->A->real) m` THEN + REWRITE_TAC[mutually_indep_rv] THEN STRIP_TAC THEN + SUBGOAL_THEN + `prob p (INTERS (IMAGE (\k. {w:A | w IN prob_carrier p /\ + (X:num->A->real) k w = ff k}) (0..m))) = + product (0..m) (\k. prob p {w | w IN prob_carrier p /\ X k w = ff k})` + SUBST1_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN + REWRITE_TAC[FINITE_NUMSEG; SUBSET_REFL] THEN + REWRITE_TAC[NUMSEG_EMPTY] THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `0..m = m INSERT (0..m-1)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INSERT; IN_NUMSEG] THEN + GEN_TAC THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(m IN 0..m-1)` ASSUME_TAC THENL + [REWRITE_TAC[IN_NUMSEG] THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + ALL_TAC] THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES; FINITE_NUMSEG] THEN + SUBGOAL_THEN `(ff:num->real) m = v` SUBST1_TAC THENL + [EXPAND_TAC "ff" THEN REWRITE_TAC[LT_REFL]; ALL_TAC] THEN + SUBGOAL_THEN + `product (0..m-1) (\k. prob p {w:A | w IN prob_carrier p /\ + (X:num->A->real) k w = (ff:num->real) k}) = + product (0..m-1) (\k. prob p {w | w IN prob_carrier p /\ + X k w = X k z})` + SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `k:num` THEN + REWRITE_TAC[IN_NUMSEG] THEN STRIP_TAC THEN BETA_TAC THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + EXPAND_TAC "ff" THEN + SUBGOAL_THEN `k:num < m` (fun th -> SIMP_TAC[th]) THEN + UNDISCH_TAC `k <= m - 1` THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `product (0..m-1) (\k. prob p {w:A | w IN prob_carrier p /\ + (X:num->A->real) k w = X k z}) = + prob p {w | w IN prob_carrier p /\ (!k. k < m ==> X k w = X k z)}` + SUBST1_TAC THENL + [SUBGOAL_THEN + `{w:A | w IN prob_carrier p /\ (!k. k < m ==> (X:num->A->real) k w = X k z)} = + INTERS(IMAGE (\k. {w | w IN prob_carrier p /\ X k w = X k z}) (0..m-1))` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTERS; IN_ELIM_THM; FORALL_IN_IMAGE; + IN_NUMSEG] THEN + X_GEN_TAC `w:A` THEN EQ_TAC THENL + [STRIP_TAC THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + UNDISCH_TAC `k:num <= m - 1` THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + ANTS_TAC THENL [UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN SIMP_TAC[]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `k:num < m` THEN + UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN SIMP_TAC[]]]]; + ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + REWRITE_TAC[FINITE_NUMSEG] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_NUMSEG] THEN GEN_TAC THEN + UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + REWRITE_TAC[NUMSEG_EMPTY] THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `prob p {w:A | w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)} = prob p A` + SUBST1_TAC THENL [AP_TERM_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "pv" THEN REWRITE_TAC[REAL_MUL_SYM]; + ALL_TAC] THEN + SUBGOAL_THEN + `!w:A. w IN prob_carrier p ==> + (f:A->real) w * indicator_fn A w = + sum V (\v:real. fz v * indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v}) w)` ASSUME_TAC THENL + [X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN + ASM_CASES_TAC `(w:A) IN A` THENL + [UNDISCH_TAC `A = {w:A | w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)}` THEN + ASM_REWRITE_TAC[REAL_MUL_RID] THEN DISCH_TAC THEN + SUBGOAL_THEN `(w:A) IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)` STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `(w:A) IN A` THEN ASM_REWRITE_TAC[IN_ELIM_THM]; ALL_TAC] THEN + SUBGOAL_THEN `(X:num->A->real) m w IN V` ASSUME_TAC THENL + [EXPAND_TAC "V" THEN REWRITE_TAC[IN_IMAGE] THEN + EXISTS_TAC `w:A` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(\v:real. fz v * + (if w IN A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v} then &1 else &0)) = + (\v. if v = X m w then (fz:real->real) v else &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `v:real` THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + ASM_CASES_TAC `v = (X:num->A->real) m w` THENL + [ASM_REWRITE_TAC[REAL_MUL_RID]; ASM_REWRITE_TAC[REAL_MUL_RZERO]]; + ALL_TAC] THEN + ASM_SIMP_TAC[SUM_DELTA] THEN + ABBREV_TAC `wt:A = @w'. w' IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w' = X k z) /\ X m w' = X m w` THEN + SUBGOAL_THEN `(wt:A) IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k wt = X k z) /\ X m wt = X m w` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "wt" THEN CONV_TAC SELECT_CONV THEN + EXISTS_TAC `w:A` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(f:A->real) w = fz ((X:num->A->real) m w)` SUBST1_TAC THENL + [EXPAND_TAC "fz" THEN REWRITE_TAC[] THEN + ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN + SUBGOAL_THEN `(wt:A) IN sigma_atom (rv_sigma p (X:num->A->real) + (SUC m)) w` ASSUME_TAC THENL + [SUBGOAL_THEN `sigma_atom (rv_sigma p (X:num->A->real) (SUC m)) w = + rv_sigma_atom p X (SUC m) w` SUBST1_TAC THENL + [MATCH_MP_TAC RV_SIGMA_ATOM_EQ THEN CONJ_TAC THENL + [SUBGOAL_THEN `sub_sigma_algebra p (rv_sigma p (X:num->A->real) + (SUC m))` MP_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[sub_sigma_algebra] THEN SIMP_TAC[]]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + ASM_CASES_TAC `k:num < m` THENL + [ASM_SIMP_TAC[]; + SUBGOAL_THEN `k:num = m` SUBST1_TAC THENL + [UNDISCH_TAC `k < SUC m` THEN + UNDISCH_TAC `~(k < m:num)` THEN ARITH_TAC; + ASM_REWRITE_TAC[]]]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONSTANT_ON_ATOM THEN + MAP_EVERY EXISTS_TAC + [`p:A prob_space`; `rv_sigma p (X:num->A->real) (SUC m)`] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + UNDISCH_TAC `A = {w:A | w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)}` THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN DISCH_TAC THEN + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC SUM_EQ_0 THEN X_GEN_TAC `v:real` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~((w:A) IN A INTER {w' | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v})` (fun th -> + REWRITE_TAC[th; REAL_MUL_RZERO]) THEN + REWRITE_TAC[IN_INTER] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\w:A. (f:A->real) w * indicator_fn A w) = + expectation p (\w. sum V (\v:real. fz v * indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v}) w))` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN GEN_TAC THEN BETA_TAC THEN + UNDISCH_TAC `!w:A. w IN prob_carrier p ==> + (f:A->real) w * indicator_fn A w = + sum V (\v:real. fz v * indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v}) w)` THEN + MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\w:A. sum V (\v:real. fz v * indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v}) w)) = + sum V (\v. fz v * prob p + (A INTER {w:A | w IN prob_carrier p /\ X m w = v}))` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `V:real->bool`; + `\v:real. \w:A. (fz:real->real) v * indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = v}) w`] EXPECTATION_SUM_FINITE) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL + [UNDISCH_TAC `A = {w:A | w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k z)}` THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + X_GEN_TAC `x:real` THEN DISCH_TAC THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + SUBGOAL_THEN `(\w:A. indicator_fn + (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = x}) w) = + indicator_fn (A INTER {w' | w' IN prob_carrier p /\ X m w' = x})` + SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN + MATCH_MP_TAC SIGMA_ALGEBRA_INTER THEN + ASM_REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(fz:real->real) u`; + `indicator_fn (A INTER {w':A | w' IN prob_carrier p /\ + (X:num->A->real) m w' = u})`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN + MATCH_MP_TAC SIGMA_ALGEBRA_INTER THEN + ASM_REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN + MATCH_MP_TAC SIGMA_ALGEBRA_INTER THEN + ASM_REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA]; + ALL_TAC] THEN + SUBGOAL_THEN + `sum V (\v:real. (fz:real->real) v * prob p + (A INTER {w:A | w IN prob_carrier p /\ (X:num->A->real) m w = v})) = + prob p A * sum V (\v. fz v * pv v)` SUBST1_TAC THENL + [SUBGOAL_THEN + `sum V (\v:real. (fz:real->real) v * prob p + (A INTER {w:A | w IN prob_carrier p /\ + (X:num->A->real) m w = v})) = + sum V (\v. fz v * (prob p A * pv v))` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN AP_TERM_TAC THEN + UNDISCH_TAC `!v:real. v IN V ==> + prob p (A INTER {w:A | w IN prob_carrier p /\ + (X:num->A->real) m w = v}) = prob p A * pv v` THEN + DISCH_THEN(MP_TAC o SPEC `u:real`) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `sum V (\v:real. (fz:real->real) v * (prob p (A:A->bool) * pv v)) = + sum V (\v. prob p A * (fz v * pv v))` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL]; + ALL_TAC] THEN + SUBGOAL_THEN `(prob p (A:A->bool) * sum V (\v:real. (fz:real->real) v * pv v)) / + prob p A = sum V (\v. fz v * pv v)` SUBST1_TAC THENL + [UNDISCH_TAC `~(prob p (A:A->bool) = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN + EXPAND_TAC "fz" THEN EXPAND_TAC "pv" THEN REWRITE_TAC[]);; + +(* cond_exp preserves bounded_differences when averaging one coordinate *) +let COND_EXP_PRESERVES_BD = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) (m:num). + mutually_indep_rv p X m /\ + bounded_differences p X f c (SUC m) /\ + measurable_wrt p (rv_sigma p X (SUC m)) f /\ + integrable p f /\ + (!k. k < SUC m ==> simple_rv p (X k)) /\ + (!k z:A. k < SUC m /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + 1 <= m + ==> bounded_differences p X (cond_exp p (rv_sigma p X m) f) c m`, + REWRITE_TAC[bounded_differences] THEN REPEAT STRIP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ABBREV_TAC `V = IMAGE (\w:A. (X:num->A->real) m w) (prob_carrier p)` THEN + ABBREV_TAC `pv = \v:real. prob p + {w:A | w IN prob_carrier p /\ (X:num->A->real) m w = v}` THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) m)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `FINITE (V:real->bool)` ASSUME_TAC THENL + [EXPAND_TAC "V" THEN + UNDISCH_TAC `simple_rv p ((X:num->A->real) m)` THEN + REWRITE_TAC[simple_rv] THEN STRIP_TAC THEN + SUBGOAL_THEN `{(X:num->A->real) m x' | x' IN prob_carrier p} = + IMAGE (\w. X m w) (prob_carrier p)` SUBST_ALL_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM] THEN MESON_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `~(prob p (sigma_atom (rv_sigma p (X:num->A->real) m) x) = &0)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_POS THEN ASM_REWRITE_TAC[] THEN - X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; - MATCH_MP_TAC REAL_LE_INV THEN - MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; + [MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `SUC m` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC m - 1 = m` SUBST1_TAC THENL [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `~(prob p (sigma_atom (rv_sigma p (X:num->A->real) m) y) = &0)` + ASSUME_TAC THENL + [MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `SUC m` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC m - 1 = m` SUBST1_TAC THENL [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[cond_exp] THEN ASM_REWRITE_TAC[] THEN SUBGOAL_THEN - `abs(real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))) = - real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` + `expectation p (\w:A. (f:A->real) w * + indicator_fn (sigma_atom (rv_sigma p (X:num->A->real) m) x) w) / + prob p (sigma_atom (rv_sigma p X m) x) = + sum V (\v. f(@w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k x) /\ + X m w = v) * pv v)` SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN - `real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) <= - exp(--(B pow 2)) * (&1 - &0)` MP_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_UBOUND THEN - REPEAT CONJ_TAC THENL - [REAL_ARITH_TAC; - ASM_REWRITE_TAC[]; - X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - STRIP_TAC THEN MATCH_MP_TAC INTEGRAND_BOUND THEN - ASM_REWRITE_TAC[]]; - REWRITE_TAC[REAL_ARITH `a * (&1 - &0) = a`]]; - ACCEPT_TAC REALLIM_EXP_NEG_SQ]);; - -(* GAUSS_SUBSTITUTION: integral[0,c] exp(-t^2) dt = integral[0,1] c*exp(-c^2*u^2) du *) -let GAUSS_SUBSTITUTION = prove - (`!x. &0 < x ==> - ((\u. x * exp(--(x pow 2 * u pow 2))) - has_real_integral - real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2)))) - (real_interval[&0,&1])`, - X_GEN_TAC `c:real` THEN DISCH_TAC THEN - MP_TAC(ISPECL - [`\t:real. exp(--(t pow 2))`; - `\u:real. c * u`; - `\u:real. c:real`; - `&0`; `&1`; `&0`; `c:real`; `{}:real->bool`] - HAS_REAL_INTEGRAL_SUBSTITUTION) THEN - REWRITE_TAC[COUNTABLE_EMPTY; DIFF_EMPTY] THEN - BETA_TAC THEN - REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID] THEN - ANTS_TAC THENL - [REPEAT CONJ_TAC THENL - [MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_REAL_INTERVAL] THEN - GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC; - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REAL_ARITH_TAC]; - REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN REAL_ARITH_TAC; - REAL_ARITH_TAC; - ASM_REAL_ARITH_TAC]; + [EXPAND_TAC "V" THEN EXPAND_TAC "pv" THEN + MATCH_MP_TAC COND_EXP_SUM_REPR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN SUBGOAL_THEN - `(\u. exp(--((c * u) pow 2)) * c) = (\u. c * exp(--(c pow 2 * u pow 2)))` + `expectation p (\w:A. (f:A->real) w * + indicator_fn (sigma_atom (rv_sigma p (X:num->A->real) m) y) w) / + prob p (sigma_atom (rv_sigma p X m) y) = + sum V (\v. f(@w. w IN prob_carrier p /\ (!k. k < m ==> X k w = X k y) /\ + X m w = v) * pv v)` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `u:real` THEN - REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC; - SIMP_TAC[]]]);; + [EXPAND_TAC "V" THEN EXPAND_TAC "pv" THEN + MATCH_MP_TAC COND_EXP_SUM_REPR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ABBREV_TAC `fx = \v:real. (f:A->real)(@w:A. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k x) /\ X m w = v)` THEN + ABBREV_TAC `fy = \v:real. (f:A->real)(@w:A. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k y) /\ X m w = v)` THEN + SUBGOAL_THEN `!v:real. (f:A->real)(@w:A. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k x) /\ X m w = v) = fx v` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN + UNDISCH_TAC `(\v. (f:A->real) (@w. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k x) /\ X m w = v)) = + (fx:real->real)` THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]); + ALL_TAC] THEN + SUBGOAL_THEN `!v:real. (f:A->real)(@w:A. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k y) /\ X m w = v) = fy v` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN + UNDISCH_TAC `(\v. (f:A->real) (@w. w IN prob_carrier p /\ + (!k. k < m ==> (X:num->A->real) k w = X k y) /\ X m w = v)) = + (fy:real->real)` THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]); + ALL_TAC] THEN + SUBGOAL_THEN `sum V (\v:real. fx v * pv v) - sum V (\v. fy v * pv v) = + sum V (\v. (fx v - fy v) * pv v)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_SUB_RDISTRIB] THEN + MATCH_MP_TAC(GSYM SUM_SUB) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!v:real. v IN V ==> &0 <= pv v` ASSUME_TAC THENL + [X_GEN_TAC `v:real` THEN DISCH_TAC THEN + UNDISCH_TAC `v:real IN V` THEN EXPAND_TAC "V" THEN + REWRITE_TAC[IN_IMAGE] THEN STRIP_TAC THEN + EXPAND_TAC "pv" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m:num`; `x':A`]) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum V (\v:real. abs((fx v - fy v) * pv v))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN ASM_REWRITE_TAC[REAL_LE_REFL]; + ALL_TAC] THEN + SUBGOAL_THEN `!v:real. v IN V ==> + abs((fx v - fy v) * pv v) <= (c:num->real) i * pv v` ASSUME_TAC THENL + [X_GEN_TAC `v:real` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(pv (v:real)) = pv v` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN + CONJ_TAC THENL + [EXPAND_TAC "fx" THEN EXPAND_TAC "fy" THEN + MATCH_MP_TAC FIBER_BOUNDED_DIFF THEN + ASM_REWRITE_TAC[bounded_differences]; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum (V:real->bool) (\v:real. (c:num->real) i * pv v)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL] THEN + SUBGOAL_THEN `sum (V:real->bool) (pv:real->real) = &1` SUBST1_TAC THENL + [EXPAND_TAC "V" THEN EXPAND_TAC "pv" THEN + SUBGOAL_THEN `(\w:A. (X:num->A->real) m w) = X m` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_PROB_SUM_ONE THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]]);; -(* INNER_X_INTEGRAL: integral[0,B] 2*x*exp(-(1+u^2)*x^2) dx *) -let INNER_X_INTEGRAL = prove - (`!u B. &0 <= u /\ &0 < B ==> - ((\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) - has_real_integral - inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) - (real_interval[&0,B])`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `&0 < &1 + u pow 2` ASSUME_TAC THENL - [MP_TAC(SPEC `u:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; ALL_TAC] THEN - MP_TAC(ISPECL [`&1 + u pow 2`; `&0`; `B:real`] EXP_QUAD_ANTIDERIV) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(fun th -> MP_TAC(SPEC `&2` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN - SUBGOAL_THEN - `(\x. &2 * (x * exp(--((&1 + u pow 2) * x pow 2)))) = - (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN +(* Key bounded variation lemma for cond_exp increments *) +let COND_EXP_BOUNDED_VARIATION = prove + (`!d. !p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) (i:num) + (x:A) (y:A). + mutually_indep_rv p X (SUC i + d - 1) /\ + bounded_differences p X f c (SUC i + d) /\ + measurable_wrt p (rv_sigma p X (SUC i + d)) f /\ + integrable p f /\ + (!k. k < SUC i + d ==> simple_rv p (X k)) /\ + (!k z:A. k < SUC i + d /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + x IN prob_carrier p /\ + y IN prob_carrier p /\ + (!k. k < i ==> X k y = X k x) + ==> abs(cond_exp p (rv_sigma p X (SUC i)) f y - + cond_exp p (rv_sigma p X (SUC i)) f x) <= c i`, + INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES; ADD_0] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f y = + (f:A->real) y` SUBST1_TAC THENL + [MATCH_MP_TAC COND_EXP_SELF THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `SUC i` THEN ASM_REWRITE_TAC[LE_REFL] THEN + CONJ_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_MONO THEN + EXISTS_TAC `SUC (i + 0 - 1)` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + ARITH_TAC]]; + ALL_TAC] THEN + SUBGOAL_THEN `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f x = + (f:A->real) x` SUBST1_TAC THENL + [MATCH_MP_TAC COND_EXP_SELF THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_RV_SIGMA THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC POSITIVE_PROB_RV_SIGMA_ATOM THEN + EXISTS_TAC `SUC i` THEN ASM_REWRITE_TAC[LE_REFL] THEN + CONJ_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_MONO THEN + EXISTS_TAC `SUC (i + 0 - 1)` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + ARITH_TAC]]; + ALL_TAC] THEN + UNDISCH_TAC `bounded_differences p X (f:A->real) c (SUC i)` THEN + REWRITE_TAC[bounded_differences] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`i:num`; `y:A`; `x:A`]) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[LT] THEN REPEAT STRIP_TAC THEN + SUBGOAL_THEN `j < i:num` (fun th -> ASM_MESON_TAC[th]) THEN ASM_ARITH_TAC; + DISCH_TAC THEN ASM_REWRITE_TAC[]]; + REPEAT STRIP_TAC THEN + ABBREV_TAC `m = SUC i + d` THEN + SUBGOAL_THEN `SUC i + SUC d = SUC m` ASSUME_TAC THENL + [EXPAND_TAC "m" THEN ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `g = cond_exp p (rv_sigma p (X:num->A->real) m) f` THEN + SUBGOAL_THEN + `!z:A. z IN prob_carrier p ==> + cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f z = + cond_exp p (rv_sigma p X (SUC i)) g z` + (fun th -> ASM_SIMP_TAC[th]) THENL + [EXPAND_TAC "g" THEN + MATCH_MP_TAC(GSYM COND_EXP_ITERATED) THEN + ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC RV_SIGMA_MONO THEN EXPAND_TAC "m" THEN ARITH_TAC]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`p:A prob_space`; `X:num->A->real`; `g:A->real`; + `c:num->real`; `i:num`; `x:A`; `y:A`]) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_MONO THEN + EXISTS_TAC `SUC i + SUC d - 1` THEN + ASM_REWRITE_TAC[] THEN EXPAND_TAC "m" THEN ARITH_TAC; + EXPAND_TAC "g" THEN + MATCH_MP_TAC COND_EXP_PRESERVES_BD THEN + UNDISCH_TAC `SUC i + SUC d = SUC m` THEN + DISCH_THEN(fun th -> ASSUME_TAC(SYM th)) THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_MONO THEN + EXISTS_TAC `SUC i + SUC d - 1:num` THEN + ASM_REWRITE_TAC[] THEN EXPAND_TAC "m" THEN ARITH_TAC; + EXPAND_TAC "m" THEN ARITH_TAC]; + EXPAND_TAC "g" THEN + MATCH_MP_TAC COND_EXP_MEASURABLE_WRT THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + EXPAND_TAC "g" THEN + MATCH_MP_TAC COND_EXP_INTEGRABLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]; + DISCH_TAC THEN ASM_REWRITE_TAC[]]]);; + +(* Key lemma: bounded differences implies bounded Doob simple_martingale increments. + Under mutual independence and bounded differences, the cond_exp + increments along the rv_sigma filtration are bounded by [-c_i, c_i]. + This is the core technical result connecting bounded differences to + the Azuma-Hoeffding framework. *) +let BOUNDED_DIFFERENCES_DOOB_INCREMENT = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) (n:num). + mutually_indep_rv p X (n - 1) /\ + bounded_differences p X f c n /\ + measurable_wrt p (rv_sigma p X n) f /\ + integrable p f /\ + (!k. k < n ==> simple_rv p (X k)) /\ + (!k z:A. k < n /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + 1 <= n + ==> !i. i < n ==> + !x. x IN prob_carrier p ==> + --(c i) <= cond_exp p (rv_sigma p X (SUC i)) f x - + cond_exp p (rv_sigma p X i) f x /\ + cond_exp p (rv_sigma p X (SUC i)) f x - + cond_exp p (rv_sigma p X i) f x <= c i`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `abs(cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f x - + cond_exp p (rv_sigma p X i) f x) <= (c:num->real) i` + (fun th -> ACCEPT_TAC(REWRITE_RULE[REAL_ABS_BOUNDS] th)) THEN + SUBGOAL_THEN `!k. k <= n ==> + sub_sigma_algebra p (rv_sigma (p:A prob_space) (X:num->A->real) k) /\ + FINITE (rv_sigma p X k)` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_RV_SIGMA; + MATCH_MP_TAC FINITE_RV_SIGMA] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `rv_sigma (p:A prob_space) (X:num->A->real) i SUBSET + rv_sigma p X (SUC i)` ASSUME_TAC THENL + [MATCH_MP_TAC RV_SIGMA_MONO THEN ARITH_TAC; ALL_TAC] THEN + ABBREV_TAC `g = cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f` THEN + ABBREV_TAC `A = sigma_atom (rv_sigma p (X:num->A->real) i) x` THEN + SUBGOAL_THEN `~(prob p (A:A->bool) = &0)` ASSUME_TAC THENL + [ASM_CASES_TAC `i = 0` THENL + [SUBGOAL_THEN `(A:A->bool) = prob_carrier p` SUBST1_TAC THENL + [UNDISCH_TAC `sigma_atom (rv_sigma p (X:num->A->real) i) x = A` THEN + UNDISCH_TAC `i = 0` THEN DISCH_THEN SUBST1_TAC THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC SIGMA_ATOM_RV_SIGMA_0 THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[PROB_SPACE] THEN CONV_TAC REAL_RAT_REDUCE_CONV]; + MP_TAC(SPECL [`p:A prob_space`; `X:num->A->real`; `i:num`; `n:num`; `x:A`] + POSITIVE_PROB_RV_SIGMA_ATOM) THEN ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL + [UNDISCH_TAC `i < n:num` THEN UNDISCH_TAC `~(i = 0)` THEN ARITH_TAC; + SIMP_TAC[]]]; + ALL_TAC] THEN SUBGOAL_THEN - `&2 * (inv(&2 * (&1 + u pow 2)) * - (exp(--((&1 + u pow 2) * &0 pow 2)) - - exp(--((&1 + u pow 2) * B pow 2)))) = - inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))` + `cond_exp p (rv_sigma p (X:num->A->real) i) f x = + cond_exp p (rv_sigma p X i) g x` SUBST1_TAC THENL - [REWRITE_TAC[REAL_POW_2; REAL_MUL_RZERO; REAL_MUL_LZERO; - REAL_NEG_0; REAL_EXP_0] THEN - UNDISCH_TAC `&0 < &1 + u pow 2` THEN CONV_TAC REAL_FIELD; - SIMP_TAC[]]);; - -(* === Helper lemmas for J_EQUALS_OUTER === *) - -let LIFT_ZERO = prove - (`lift(&0) :real^1 = vec 0`, - REWRITE_TAC[GSYM DROP_EQ; DROP_VEC] THEN - MESON_TAC[LIFT_DROP; LIFT_EQ]);; - -let REAL_INTEGRAL_REFL = prove - (`!(f:real->real) a. real_integral (real_interval[a,a]) f = &0`, - REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - REWRITE_TAC[has_real_integral; IMAGE_LIFT_REAL_INTERVAL; LIFT_ZERO] THEN - REWRITE_TAC[HAS_INTEGRAL_REFL]);; - -let EXP_NEG_ADD = prove - (`!a b. exp(--a) * exp(--b) = exp(--(a + b))`, - REPEAT GEN_TAC THEN REWRITE_TAC[GSYM REAL_EXP_ADD] THEN - AP_TERM_TAC THEN REAL_ARITH_TAC);; + [UNDISCH_TAC `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f = g` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; + `rv_sigma p (X:num->A->real) i`; + `rv_sigma p (X:num->A->real) (SUC i)`; + `f:A->real`] COND_EXP_ITERATED) THEN + ANTS_TAC THENL + [UNDISCH_TAC `!k:num. k <= n ==> sub_sigma_algebra p (rv_sigma p (X:num->A->real) k) /\ FINITE (rv_sigma p X k)` THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; SIMP_TAC[]]; + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; SIMP_TAC[]]; + FIRST_ASSUM(MP_TAC o SPEC `SUC i`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; SIMP_TAC[]]; + FIRST_ASSUM(MP_TAC o SPEC `SUC i`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; SIMP_TAC[]]]; + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ONCE_REWRITE_TAC[cond_exp] THEN ASM_REWRITE_TAC[] THEN + ABBREV_TAC + `e = expectation p (\y:A. (g:A->real) y * indicator_fn (A:A->bool) y)` THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_CASES_TAC `i = 0` THENL + [SUBGOAL_THEN `(A:A->bool) = prob_carrier p` SUBST1_TAC THENL + [UNDISCH_TAC `sigma_atom (rv_sigma p (X:num->A->real) i) x = A` THEN + UNDISCH_TAC `i = 0` THEN DISCH_THEN SUBST1_TAC THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC SIGMA_ATOM_RV_SIGMA_0 THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; + SUBGOAL_THEN `A IN rv_sigma p (X:num->A->real) i` MP_TAC THENL + [UNDISCH_TAC `sigma_atom (rv_sigma p (X:num->A->real) i) x = A` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + UNDISCH_TAC `!k:num. k <= n ==> sub_sigma_algebra p (rv_sigma p (X:num->A->real) k) /\ FINITE (rv_sigma p X k)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN ASM_MESON_TAC[sub_sigma_algebra]; + UNDISCH_TAC `!k:num. k <= n ==> sub_sigma_algebra p (rv_sigma p (X:num->A->real) k) /\ FINITE (rv_sigma p X k)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN + UNDISCH_TAC `sub_sigma_algebra p (rv_sigma p (X:num->A->real) i)` THEN + REWRITE_TAC[sub_sigma_algebra; SUBSET] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < prob p (A:A->bool)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `A:A->bool`] PROB_POSITIVE) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~(prob p (A:A->bool) = &0)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (g:A->real)` ASSUME_TAC THENL + [UNDISCH_TAC `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f = g` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN MATCH_MP_TAC COND_EXP_INTEGRABLE THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!k:num. k <= n ==> sub_sigma_algebra p (rv_sigma p (X:num->A->real) k) /\ FINITE (rv_sigma p X k)` THEN + DISCH_THEN(MP_TAC o SPEC `SUC i`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `!y:A. y IN A ==> + abs((g:A->real) y - g x) <= (c:num->real) i` ASSUME_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(y:A) IN prob_carrier p /\ + (!k. k < i ==> (X:num->A->real) k y = X k x)` STRIP_ASSUME_TAC THENL + [ASM_CASES_TAC `i = 0` THENL + [UNDISCH_TAC `(y:A) IN A` THEN + SUBGOAL_THEN `(A:A->bool) = prob_carrier p` SUBST1_TAC THENL + [UNDISCH_TAC `sigma_atom (rv_sigma p (X:num->A->real) i) x = A` THEN + UNDISCH_TAC `i = 0` THEN DISCH_THEN SUBST1_TAC THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC SIGMA_ATOM_RV_SIGMA_0 THEN ASM_REWRITE_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN ASM_REWRITE_TAC[LT]]; + UNDISCH_TAC `(y:A) IN A` THEN + UNDISCH_TAC `sigma_atom (rv_sigma p (X:num->A->real) i) x = A` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `i:num`; `x:A`] + RV_SIGMA_ATOM_EQ) THEN + ANTS_TAC THENL + [UNDISCH_TAC `!k:num. k <= n ==> sub_sigma_algebra p (rv_sigma p (X:num->A->real) k) /\ FINITE (rv_sigma p X k)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [UNDISCH_TAC `i < n:num` THEN ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN ASM_MESON_TAC[sub_sigma_algebra]; + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[rv_sigma_atom; IN_ELIM_THM]]]; + ALL_TAC] THEN + ASM_CASES_TAC `SUC i = n:num` THENL + [SUBGOAL_THEN `!w:A. w IN prob_carrier p ==> (g:A->real) w = (f:A->real) w` + ASSUME_TAC THENL + [X_GEN_TAC `w:A` THEN DISCH_TAC THEN + UNDISCH_TAC `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f = g` THEN + UNDISCH_TAC `SUC i = n:num` THEN DISCH_THEN SUBST1_TAC THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `f:A->real`; + `n:num`; `w:A`] COND_EXP_RV_SIGMA_N) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[] THEN ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN + UNDISCH_TAC `bounded_differences p (X:num->A->real) (f:A->real) c n` THEN + REWRITE_TAC[bounded_differences] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`i:num`; `x:A`; `y:A`]) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN GEN_TAC THEN STRIP_TAC THEN + CONV_TAC SYM_CONV THEN + UNDISCH_TAC `!k:num. k < i ==> (X:num->A->real) k y = X k x` THEN + DISCH_THEN MATCH_MP_TAC THEN + UNDISCH_TAC `SUC i = n:num` THEN UNDISCH_TAC `j < n:num` THEN + UNDISCH_TAC `~(j = i:num)` THEN ARITH_TAC; + REWRITE_TAC[GSYM REAL_ABS_SUB]]; + UNDISCH_TAC `cond_exp p (rv_sigma p (X:num->A->real) (SUC i)) f = g` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + SUBGOAL_THEN `?d. SUC i + d = n:num /\ 1 <= d` STRIP_ASSUME_TAC THENL + [EXISTS_TAC `n - SUC i` THEN + UNDISCH_TAC `i < n:num` THEN UNDISCH_TAC `~(SUC i = n:num)` THEN ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`d:num`; `p:A prob_space`; `X:num->A->real`; + `f:A->real`; `c:num->real`; `i:num`; `x:A`; `y:A`] + COND_EXP_BOUNDED_VARIATION) THEN + SUBGOAL_THEN `SUC i + d - 1 = n - 1:num` (fun th -> REWRITE_TAC[th]) THENL + [UNDISCH_TAC `SUC i + d = n:num` THEN UNDISCH_TAC `1 <= d:num` THEN ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN STRIP_TAC THEN CONV_TAC SYM_CONV THEN + UNDISCH_TAC `!k:num. k < i ==> (X:num->A->real) k y = X k x` THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_BOUNDS] THEN + MATCH_MP_TAC BOUND_FROM_PRODUCT THEN + UNDISCH_TAC + `expectation p (\y:A. (g:A->real) y * indicator_fn (A:A->bool) y) = e` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + REPEAT CONJ_TAC THENL + [SUBGOAL_THEN + `((g:A->real) x - (c:num->real) i) * prob p (A:A->bool) = + expectation p (\y:A. ((g:A->real) x - (c:num->real) i) * + indicator_fn (A:A->bool) y)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `expectation p (\y:A. ((g:A->real) x - (c:num->real) i) * + indicator_fn (A:A->bool) y) = + ((g:A->real) x - (c:num->real) i) * + expectation p (indicator_fn (A:A->bool))` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CMUL THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `!y:A. y IN A ==> abs((g:A->real) y - g x) <= (c:num->real) i` THEN + DISCH_THEN(MP_TAC o SPEC `w:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + SUBGOAL_THEN + `((g:A->real) x + (c:num->real) i) * prob p (A:A->bool) = + expectation p (\y:A. ((g:A->real) x + (c:num->real) i) * + indicator_fn (A:A->bool) y)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `expectation p (\y:A. ((g:A->real) x + (c:num->real) i) * + indicator_fn (A:A->bool) y) = + ((g:A->real) x + (c:num->real) i) * + expectation p (indicator_fn (A:A->bool))` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CMUL THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `!y:A. y IN A ==> abs((g:A->real) y - g x) <= (c:num->real) i` THEN + DISCH_THEN(MP_TAC o SPEC `w:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + ASM_REWRITE_TAC[]]);; -let IMAGE_LIFT_REAL_INTERVAL = prove - (`!a b. IMAGE lift (real_interval[a,b]) = interval[lift a, lift b]`, - REPEAT GEN_TAC THEN REWRITE_TAC[REAL_INTERVAL_INTERVAL; GSYM IMAGE_o] THEN - SUBGOAL_THEN `lift o (drop:real^1->real) = I` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM; LIFT_DROP]; ALL_TAC] THEN - REWRITE_TAC[IMAGE_I]);; +(* McDiarmid's inequality (one-sided concentration). + Uses capped filtration FF k = rv_sigma(MIN k n) to apply + DOOB_CONCENTRATION, with cond_exp(n) = f (by COND_EXP_SELF + since all atoms have positive probability) and cond_exp(0) = E[f]. *) +let MCDIARMID_INEQUALITY = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) (n:num) (t:real). + mutually_indep_rv p X (n - 1) /\ + bounded_differences p X f c n /\ + measurable_wrt p (rv_sigma p X n) f /\ + integrable p f /\ + (!k. k < n ==> simple_rv p (X k)) /\ + (!k z:A. k < n /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + 1 <= n /\ + (!i. i < n ==> &0 < c i) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + f x - expectation p f >= t} <= + exp(--(&2 * t pow 2 / + sum(0..n-1) (\i. (&2 * c i) pow 2)))`, + REPEAT STRIP_TAC THEN + (* Step 1: cond_exp at level n = f, cond_exp at level 0 = E[f] *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + cond_exp p (rv_sigma p (X:num->A->real) n) f x = f x` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC COND_EXP_RV_SIGMA_N THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + cond_exp p (rv_sigma p (X:num->A->real) 0) f x = expectation p f` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC COND_EXP_RV_SIGMA_TRIVIAL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 2: Replace event with cond_exp form *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ f x - expectation p f >= t} = + {x | x IN prob_carrier p /\ + cond_exp p (rv_sigma p (X:num->A->real) n) f x - + cond_exp p (rv_sigma p X 0) f x >= t}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN + ASM_CASES_TAC `(y:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 3: Rewrite using MIN for capped filtration *) + SUBGOAL_THEN `rv_sigma (p:A prob_space) (X:num->A->real) n = + rv_sigma p X (MIN n n) /\ + rv_sigma p X 0 = rv_sigma p X (MIN 0 n)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[MIN; LE_REFL; LE_0]; ALL_TAC] THEN + (* Step 4: Apply DOOB_CONCENTRATION with capped filtration *) + MP_TAC(ISPECL [`p:A prob_space`; + `(\k:num. rv_sigma p (X:num->A->real) (MIN k n))`; + `f:A->real`; + `(\i:num. --((c:num->real) i))`; + `c:num->real`; + `t:real`; + `n - 1`] DOOB_CONCENTRATION) THEN + BETA_TAC THEN + SUBGOAL_THEN `SUC (n - 1) = n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!i:num. (c:num->real) i - --c i = &2 * c i` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[MIN; LE_REFL; LE_0] THEN + DISCH_THEN MATCH_MP_TAC THEN + (* Step 5: Verify hypotheses of DOOB_CONCENTRATION *) + CONJ_TAC THENL + [(* filtration *) + SUBGOAL_THEN + `(\k. rv_sigma (p:A prob_space) (X:num->A->real) + (if k <= n then k else n)) = + (\k. rv_sigma p X (MIN k (SUC (n - 1))))` SUBST1_TAC THENL + [ASM_REWRITE_TAC[FUN_EQ_THM; MIN]; ALL_TAC] THEN + MATCH_MP_TAC FILTRATION_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + CONJ_TAC THENL + [(* FINITE *) + GEN_TAC THEN COND_CASES_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* bounded increments via BOUNDED_DIFFERENCES_DOOB_INCREMENT *) + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(if SUC i <= n then SUC i else n) = SUC i` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(if (i:num) <= n then i else n) = i` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `f:A->real`; + `c:num->real`; `n:num`] + BOUNDED_DIFFERENCES_DOOB_INCREMENT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `y:A`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* --c i < c i *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < (c:num->real) i` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REAL_ARITH_TAC]; + (* sum > 0 *) + MATCH_MP_TAC SUM_POS_LT_ALL THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_NUMSEG] THEN + EXISTS_TAC `0` THEN ASM_ARITH_TAC; + REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_POW_2] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC REAL_LT_MUL THEN + (CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]]);; + +(* McDiarmid's inequality (two-sided concentration) *) +let MCDIARMID_INEQUALITY_TWO_SIDED = prove + (`!p:A prob_space (X:num->A->real) (f:A->real) (c:num->real) (n:num) (t:real). + mutually_indep_rv p X (n - 1) /\ + bounded_differences p X f c n /\ + measurable_wrt p (rv_sigma p X n) f /\ + integrable p f /\ + (!k. k < n ==> simple_rv p (X k)) /\ + (!k z:A. k < n /\ z IN prob_carrier p ==> + &0 < prob p {y | y IN prob_carrier p /\ X k y = X k z}) /\ + 1 <= n /\ + (!i. i < n ==> &0 < c i) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + abs(f x - expectation p f) >= t} <= + &2 * exp(--(&2 * t pow 2 / + sum(0..n-1) (\i. (&2 * c i) pow 2)))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + cond_exp p (rv_sigma p (X:num->A->real) n) f x = f x` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC COND_EXP_RV_SIGMA_N THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + cond_exp p (rv_sigma p (X:num->A->real) 0) f x = expectation p f` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC COND_EXP_RV_SIGMA_TRIVIAL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ abs(f x - expectation p f) >= t} = + {x | x IN prob_carrier p /\ + abs(cond_exp p (rv_sigma p (X:num->A->real) n) f x - + cond_exp p (rv_sigma p X 0) f x) >= t}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN + ASM_CASES_TAC `(y:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `rv_sigma (p:A prob_space) (X:num->A->real) n = + rv_sigma p X (MIN n n) /\ + rv_sigma p X 0 = rv_sigma p X (MIN 0 n)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[MIN; LE_REFL; LE_0]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(\k:num. rv_sigma p (X:num->A->real) (MIN k n))`; + `f:A->real`; + `(\i:num. --((c:num->real) i))`; + `c:num->real`; + `t:real`; + `n - 1`] DOOB_CONCENTRATION_TWO_SIDED) THEN + BETA_TAC THEN + SUBGOAL_THEN `SUC (n - 1) = n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!i:num. (c:num->real) i - --c i = &2 * c i` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[MIN; LE_REFL; LE_0] THEN + DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `(\k. rv_sigma (p:A prob_space) (X:num->A->real) + (if k <= n then k else n)) = + (\k. rv_sigma p X (MIN k (SUC (n - 1))))` SUBST1_TAC THENL + [ASM_REWRITE_TAC[FUN_EQ_THM; MIN]; ALL_TAC] THEN + MATCH_MP_TAC FILTRATION_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN COND_CASES_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC FINITE_RV_SIGMA THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(if SUC i <= n then SUC i else n) = SUC i` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(if (i:num) <= n then i else n) = i` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `f:A->real`; + `c:num->real`; `n:num`] + BOUNDED_DIFFERENCES_DOOB_INCREMENT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `y:A`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < (c:num->real) i` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REAL_ARITH_TAC]; + MATCH_MP_TAC SUM_POS_LT_ALL THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_NUMSEG] THEN + EXISTS_TAC `0` THEN ASM_ARITH_TAC; + REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_POW_2] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC REAL_LT_MUL THEN + (CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]]);; + +(* Main theorem: Doob-Meyer decomposition for supermartingales *) +let DOOB_DECOMPOSITION_SUPER = prove + (`!p:A prob_space FF X. + supermartingale p FF X /\ + (!n. FINITE (FF n)) /\ + (!n. simple_rv p (X n)) + ==> ?M A. martingale p FF M /\ + predictable p FF A /\ + (!x. x IN prob_carrier p ==> A 0 x = &0) /\ + (!n x. x IN prob_carrier p /\ + ~(prob p (sigma_atom (FF n) x) = &0) + ==> A (SUC n) x <= A n x) /\ + (!n x. x IN prob_carrier p ==> X n x = M n x + A n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) FF (\n x. --((X:num->A->real) n x)) /\ + (!n. FINITE ((FF:num->(A->bool)->bool) n)) /\ + (!n. simple_rv (p:A prob_space) ((\n x. --((X:num->A->real) n x)) n))` + (MP_TAC o MATCH_MP DOOB_DECOMPOSITION) THENL + [CONV_TAC(DEPTH_CONV BETA_CONV) THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SUPERMARTINGALE_NEG_SUBMARTINGALE THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_NEG THEN ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + REWRITE_TAC[] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(X_CHOOSE_THEN `M':num->A->real` + (X_CHOOSE_THEN `A':num->A->real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `\n (x:A). --((M':num->A->real) n x)` THEN + EXISTS_TAC `\n (x:A). --((A':num->A->real) n x)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC MARTINGALE_NEG THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + MATCH_MP_TAC PREDICTABLE_NEG THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(A':num->A->real) n x <= A' (SUC n) x` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; REAL_ARITH_TAC]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n x:A. x IN prob_carrier (p:A prob_space) ==> --((X:num->A->real) n x) = (M':num->A->real) n x + (A':num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]);; -let LIFT_DROP_FSTCART = prove - (`(\z:real^(1,1)finite_sum. lift(drop(fstcart z))) = fstcart`, - REWRITE_TAC[FUN_EQ_THM; LIFT_DROP]);; +(* ========================================================================= *) +(* CLT COMPLETION: CONVERGENCE IN DISTRIBUTION TO STANDARD NORMAL *) +(* ========================================================================= *) -let LIFT_DROP_SNDCART = prove - (`(\z:real^(1,1)finite_sum. lift(drop(sndcart z))) = sndcart`, - REWRITE_TAC[FUN_EQ_THM; LIFT_DROP]);; -let LIFT_EXP_DROP_CONTINUOUS = prove - (`!s:real^1->bool. (lift o exp o drop) continuous_on s`, - GEN_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN - EXISTS_TAC `(:real^1)` THEN REWRITE_TAC[SUBSET_UNIV] THEN - REWRITE_TAC[GSYM IMAGE_LIFT_UNIV] THEN - REWRITE_TAC[GSYM REAL_CONTINUOUS_ON; REAL_CONTINUOUS_ON_EXP]);; +(* --- Phase 1: Parameterized Gaussian Integral and Fourier Transform --- *) -let EXP_NEG_SQ_REAL_CONTINUOUS = prove - (`!B. (\t. exp(--(t pow 2))) real_continuous_on real_interval[&0,B]`, - GEN_TAC THEN MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; +(* Helper: stretching an integral over all of R by a positive factor *) +let HAS_REAL_INTEGRAL_STRETCH_UNIV = prove + (`!(f:real->real) i m. + (f has_real_integral i) (:real) /\ &0 < m + ==> ((\x. f(m * x)) has_real_integral inv(m) * i) (:real)`, + REPEAT GEN_TAC THEN + REWRITE_TAC[has_real_integral; o_DEF; IMAGE_LIFT_UNIV] THEN + STRIP_TAC THEN + MP_TAC(ISPECL + [`\v:real^1. lift((f:real->real)(drop v))`; + `lift(i:real)`; + `(:real^1)`; + `m:real`; + `vec 0:real^1`] HAS_INTEGRAL_AFFINITY) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [FIRST_ASSUM ACCEPT_TAC; ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + REWRITE_TAC[VECTOR_ADD_RID; VECTOR_MUL_RZERO; VECTOR_NEG_0; + DIMINDEX_1; REAL_POW_1; DROP_CMUL; LIFT_CMUL] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 < m ==> abs m = m`] THEN + SUBGOAL_THEN `IMAGE (\v:real^1. inv m % v) (:real^1) = (:real^1)` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN EXISTS_TAC `m % (x:real^1)` THEN + REWRITE_TAC[VECTOR_MUL_ASSOC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_LT_IMP_NZ; VECTOR_MUL_LID]; + ASM_REWRITE_TAC[]]);; -let INNER_INTEGRAND_INTEGRABLE = prove - (`!x:real. (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) - real_integrable_on real_interval[&0,&1]`, - GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MP_TAC(SPEC `x':real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; +(* ========================================================================= *) +(* GAUSSIAN INTEGRAL PROOF *) +(* Proved via the H(a)+J(a)=pi/4 approach (no gamma.ml needed) *) +(* ========================================================================= *) -let OUTER_INTEGRAND_INTEGRABLE = prove - (`!B:real u. (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) - real_integrable_on real_interval[&0,B]`, - REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; -let GAUSS_INTEGRAL_DERIV = prove - (`!B x. x IN real_interval[&0,B] ==> - ((\u. real_integral(real_interval[&0,u]) (\t. exp(--(t pow 2)))) - has_real_derivative exp(--(x pow 2))) - (atreal x within real_interval[&0,B])`, +(* FTC for squaring an integral *) +let FTC_SQUARE_DERIV = prove + (`!f a b. + f real_continuous_on real_interval[a,b] + ==> !x. x IN real_interval[a,b] + ==> ((\u. real_integral (real_interval[a,u]) f pow 2) + has_real_derivative + (&2 * real_integral (real_interval[a,x]) f * f x)) + (atreal x within real_interval[a,b])`, REPEAT STRIP_TAC THEN - MP_TAC(ISPECL [`\t:real. exp(--(t pow 2))`; `&0`; `B:real`] + MP_TAC(ISPECL [`f:real->real`; `a:real`; `b:real`] REAL_INTEGRAL_HAS_REAL_DERIVATIVE) THEN - REWRITE_TAC[EXP_NEG_SQ_REAL_CONTINUOUS] THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `x:real`) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN REWRITE_TAC[]);; + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> + MP_TAC(ISPEC `2` (MATCH_MP HAS_REAL_DERIVATIVE_POW_WITHIN th))) THEN + CONV_TAC NUM_REDUCE_CONV THEN REWRITE_TAC[REAL_POW_1]);; -let GAUSS_SQ_FTC = prove - (`!B. &0 <= B ==> - ((\x. &2 * real_integral(real_interval[&0,x]) - (\t. exp(--(t pow 2))) * exp(--(x pow 2))) - has_real_integral - (real_integral(real_interval[&0,B]) (\t. exp(--(t pow 2))) pow 2)) - (real_interval[&0,B])`, +let FTC_SQUARE = prove + (`!f a b. f real_continuous_on real_interval[a,b] /\ a <= b + ==> real_integral (real_interval[a,b]) f pow 2 = + real_integral (real_interval[a,b]) + (\x. &2 * real_integral (real_interval[a,x]) f * f x)`, REPEAT STRIP_TAC THEN + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + SUBGOAL_THEN + `real_integral (real_interval[a,b]) (f:real->real) pow 2 = + real_integral (real_interval[a,b]) f pow 2 - + real_integral (real_interval[a,a]) f pow 2` + SUBST1_TAC THENL + [SUBGOAL_THEN `real_integral (real_interval[a,a]) (f:real->real) = &0` + SUBST1_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_NULL THEN REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN MP_TAC(ISPECL - [`\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) pow 2`; - `\x:real. &2 * real_integral(real_interval[&0,x]) - (\t. exp(--(t pow 2))) * exp(--(x pow 2))`; - `&0`; `B:real`] - REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN + [`\u:real. real_integral (real_interval[a,u]) (f:real->real) pow 2`; + `\x:real. &2 * real_integral (real_interval[a,x]) (f:real->real) * f x`; + `a:real`; `b:real`] + REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN BETA_TAC THEN - REWRITE_TAC[REAL_INTEGRAL_REFL; REAL_POW_ZERO; ARITH; REAL_SUB_RZERO] THEN - DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN - X_GEN_TAC `x:real` THEN DISCH_TAC THEN - SUBGOAL_THEN - `(\x. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) pow 2) = - (\x. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * - real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))))` - SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; REAL_POW_2]; ALL_TAC] THEN - SUBGOAL_THEN - `&2 * real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * - exp(--(x pow 2)) = - real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * - exp(--(x pow 2)) + - exp(--(x pow 2)) * - real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2)))` - SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MP_TAC(ISPECL - [`\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; - `exp(--(x pow 2))`; - `\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; - `exp(--(x pow 2))`; `x:real`; `real_interval[&0,B]`] - HAS_REAL_DERIVATIVE_MUL_WITHIN) THEN BETA_TAC THEN - DISCH_THEN MATCH_MP_TAC THEN - CONJ_TAC THEN MATCH_MP_TAC GAUSS_INTEGRAL_DERIV THEN ASM_REWRITE_TAC[]);; + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`f:real->real`; `a:real`; `b:real`] FTC_SQUARE_DERIV) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN + ASM_REWRITE_TAC[]; + SIMP_TAC[]]);; -let GAUSS_INNER_REWRITE = prove - (`!x. &0 < x ==> - ((\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) - has_real_integral - (&2 * real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * - exp(--(x pow 2)))) - (real_interval[&0,&1])`, +(* Arctan integral *) +let ARCTAN_INTEGRAL = prove + (`((\t. inv(&1 + t pow 2)) has_real_integral (pi / &4)) + (real_interval [&0, &1])`, + SUBGOAL_THEN `pi / &4 = atn(&1) - atn(&0)` SUBST1_TAC THENL + [REWRITE_TAC[ATN_1; ATN_0] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN REPEAT STRIP_TAC THEN - MP_TAC(SPEC `x:real` GAUSS_SUBSTITUTION) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(fun th -> MP_TAC(SPEC `&2 * exp(--(x pow 2))` - (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN BETA_TAC THEN DISCH_TAC THEN - MP_TAC(ISPECL - [`\u:real. (&2 * exp(--(x pow 2))) * (x * exp(--(x pow 2 * u pow 2)))`; - `\u:real. &2 * x * exp(--((&1 + u pow 2) * x pow 2))`; - `(&2 * exp(--(x pow 2))) * - real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; - `real_interval[&0,&1]`] HAS_REAL_INTEGRAL_EQ) THEN - BETA_TAC THEN ANTS_TAC THENL - [CONJ_TAC THENL - [X_GEN_TAC `u:real` THEN DISCH_TAC THEN - SUBGOAL_THEN - `(&2 * exp(--(x pow 2))) * (x * exp(--(x pow 2 * u pow 2))) = - &2 * x * (exp(--(x pow 2)) * exp(--(x pow 2 * u pow 2)))` - SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[EXP_NEG_ADD] THEN - AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; - ASM_REWRITE_TAC[]]; ALL_TAC] THEN - SUBGOAL_THEN - `(&2 * exp(--(x pow 2))) * - real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) = - &2 * real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * - exp(--(x pow 2))` - SUBST1_TAC THENL [REAL_ARITH_TAC; SIMP_TAC[]]);; - -let INNER_VEC_CONV = prove - (`!x:real. - integral (interval[lift(&0),lift(&1)]) - (\u:real^1. lift(&2 * x * exp(--((&1 + drop u pow 2) * x pow 2)))) = - lift(real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))`, - GEN_TAC THEN CONV_TAC SYM_CONV THEN - MP_TAC(MATCH_MP REAL_INTEGRAL (SPEC `x:real` INNER_INTEGRAND_INTEGRABLE)) THEN - DISCH_THEN(fun th -> REWRITE_TAC[th; LIFT_DROP; IMAGE_LIFT_REAL_INTERVAL]) THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]);; - -let OUTER_VEC_CONV = prove - (`!B u:real. - integral (interval[lift(&0),lift B]) - (\x:real^1. lift(&2 * drop x * exp(--((&1 + u pow 2) * drop x pow 2)))) = - lift(real_integral (real_interval[&0,B]) - (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))`, - REPEAT GEN_TAC THEN CONV_TAC SYM_CONV THEN - MP_TAC(MATCH_MP REAL_INTEGRAL - (SPECL [`B:real`; `u:real`] OUTER_INTEGRAND_INTEGRABLE)) THEN - DISCH_THEN(fun th -> REWRITE_TAC[th; LIFT_DROP; IMAGE_LIFT_REAL_INTERVAL]) THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]);; + MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN THEN + REWRITE_TAC[HAS_REAL_DERIVATIVE_ATN]);; -let GAUSS_2D_CONTINUOUS = prove - (`!B. (\z. lift(&2 * drop(fstcart z) * - exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) - continuous_on - (interval[pastecart (lift(&0)) (lift(&0)):real^(1,1)finite_sum, - pastecart (lift B) (lift(&1))])`, - GEN_TAC THEN +(* Antiderivative of x*exp(-cx^2) *) +let EXP_QUAD_ANTIDERIV = prove + (`!c a b. &0 < c /\ a <= b + ==> ((\x. x * exp(--(c * x pow 2))) + has_real_integral + (inv(&2 * c) * (exp(--(c * a pow 2)) - exp(--(c * b pow 2))))) + (real_interval[a,b])`, + REPEAT STRIP_TAC THEN SUBGOAL_THEN - `(\z. lift(&2 * drop(fstcart z) * - exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) = - (\z:real^(1,1)finite_sum. (&2 * drop(fstcart z)) % - lift(exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2))))` + `inv(&2 * c) * (exp(--(c * a pow 2)) - exp(--(c * b pow 2))) = + (--inv(&2 * c) * exp(--(c * b pow 2))) - + (--inv(&2 * c) * exp(--(c * a pow 2)))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; GSYM LIFT_CMUL] THEN - GEN_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_MUL THEN CONJ_TAC THENL - [SUBGOAL_THEN - `(lift o (\z:real^(1,1)finite_sum. &2 * drop(fstcart z))) = - (\z. &2 % (fstcart z:real^1))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_CMUL; LIFT_DROP]; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_CMUL THEN - MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_FSTCART]; - ALL_TAC] THEN + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS THEN + ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN THEN + SUBGOAL_THEN `~(&2 * c = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN SUBGOAL_THEN - `(\z:real^(1,1)finite_sum. - lift(exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) = - ((lift o exp o drop) :real^1->real^1) o - (\z. lift(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))` + `x * exp(--(c * x pow 2)) = + --inv(&2 * c) * (--(c * &2 * x) * exp(--(c * x pow 2)))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL - [SUBGOAL_THEN - `(\z:real^(1,1)finite_sum. - lift(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2))) = - (\z. --(lift((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))` - SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; LIFT_NEG]; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_NEG THEN - SUBGOAL_THEN - `(\z:real^(1,1)finite_sum. - lift((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)) = - (\z. (&1 + drop(sndcart z) pow 2) % lift(drop(fstcart z) pow 2))` - SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; LIFT_CMUL]; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_MUL THEN CONJ_TAC THENL - [SUBGOAL_THEN - `(lift o (\z:real^(1,1)finite_sum. &1 + drop(sndcart z) pow 2)) = - (\z. lift(&1) + lift(drop(sndcart z) pow 2))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_ADD]; ALL_TAC] THEN - MATCH_MP_TAC CONTINUOUS_ON_ADD THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN - MATCH_MP_TAC CONTINUOUS_ON_LIFT_POW THEN REWRITE_TAC[LIFT_DROP_SNDCART] THEN - MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_SNDCART]; - MATCH_MP_TAC CONTINUOUS_ON_LIFT_POW THEN REWRITE_TAC[LIFT_DROP_FSTCART] THEN - MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_FSTCART]]; - REWRITE_TAC[LIFT_EXP_DROP_CONTINUOUS]]);; - - -(* Integrability of H and J outer integrands - moved before J_EQUALS_OUTER *) -let INTEGRAND_SUM_EQ_INV = prove - (`!B t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) + - inv(&1 + t pow 2) * (&1 - exp(--((&1 + t pow 2) * B pow 2))) = - inv(&1 + t pow 2)`, - REPEAT GEN_TAC THEN - SUBGOAL_THEN `B pow 2 * (&1 + t pow 2) = (&1 + t pow 2) * B pow 2` - SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC(REAL_ARITH - `x * a + a * (&1 - x) = a ==> x * a + a * (&1 - x) = a`) THEN - CONV_TAC REAL_RING);; + [UNDISCH_TAC `~(&2 * c = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_LMUL_ATREAL THEN + REAL_DIFF_TAC THEN + CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[REAL_POW_1; REAL_MUL_RID] THEN + REAL_ARITH_TAC);; -let H_INTEGRAND_INTEGRABLE = prove - (`!B. (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) - real_integrable_on real_interval[&0,&1]`, - GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN +(* exp(-x^2) continuity and integrability *) +let EXP_NEG_X2_INTEGRABLE = prove + (`!a b. (\x. exp(--(x pow 2))) real_integrable_on real_interval[a,b]`, + REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; -let J_OUTER_INTEGRAND_INTEGRABLE = prove - (`!B. (\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) - real_integrable_on real_interval[&0,&1]`, - GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN +let EXP_NEG_X2_CONTINUOUS = prove + (`(\x. exp(--(x pow 2))) real_continuous_on real_interval[a,b]`, MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; -(* J_EQUALS_OUTER: J(B) = integral[0,1] inv(1+u^2)*(1-exp(-(1+u^2)*B^2)) du *) -(* Proved via Fubini (INTEGRAL_SWAP_CONTINUOUS), GAUSS_SUBSTITUTION, INNER_X_INTEGRAL *) -let J_EQUALS_OUTER = prove - (`!B. &0 < B ==> - real_integral (real_interval[&0,B]) - (\x. exp(--(x pow 2))) pow 2 = - real_integral (real_interval[&0,&1]) - (\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2))))`, - GEN_TAC THEN DISCH_TAC THEN - SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - (* Step 1: GAUSS_SQ_FTC *) - MP_TAC(SPEC `B:real` GAUSS_SQ_FTC) THEN ASM_REWRITE_TAC[] THEN - DISCH_TAC THEN - (* Step 2: Integrand equality *) - SUBGOAL_THEN - `!x:real. x IN real_interval[&0,B] ==> - &2 * real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * - exp(--(x pow 2)) = - real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))` - ASSUME_TAC THENL - [X_GEN_TAC `x:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN STRIP_TAC THEN - ASM_CASES_TAC `&0 < x` THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - MATCH_MP_TAC GAUSS_INNER_REWRITE THEN ASM_REWRITE_TAC[]; - SUBGOAL_THEN `x = &0` SUBST_ALL_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_INTEGRAL_REFL; - REAL_INTEGRAL_0]]; +(* Limit building blocks *) +let REALLIM_EXP_NEG = prove + (`((\x. exp(--x)) ---> &0) at_posinfinity`, + REWRITE_TAC[REALLIM_AT_POSINFINITY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + EXISTS_TAC `inv(e) + &1` THEN + X_GEN_TAC `x:real` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO; REAL_EXP_NEG] THEN + SUBGOAL_THEN `abs(inv(exp x)) = inv(exp x)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; ALL_TAC] THEN - (* Step 3: h has_real_integral G(B)^2 *) - SUBGOAL_THEN - `((\x. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) - has_real_integral - (real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2)) - (real_interval[&0,B])` - ASSUME_TAC THENL - [MP_TAC(ISPECL - [`\x:real. &2 * real_integral (real_interval[&0,x]) - (\t. exp(--(t pow 2))) * exp(--(x pow 2))`; - `\x:real. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))`; - `real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2`; - `real_interval[&0,B]`] - HAS_REAL_INTEGRAL_EQ) THEN - BETA_TAC THEN ANTS_TAC THENL - [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; - SIMP_TAC[]]; - ALL_TAC] THEN - (* Step 4: h real_integrable *) - SUBGOAL_THEN - `(\x. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) - real_integrable_on real_interval[&0,B]` - ASSUME_TAC THENL - [REWRITE_TAC[real_integrable_on] THEN ASM_MESON_TAC[]; ALL_TAC] THEN - (* Step 5: G(B)^2 = real_integral[0,B] h *) - SUBGOAL_THEN - `real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2 = - real_integral (real_interval[&0,B]) - (\x. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))` - SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Step 6: Convert to vector form *) - MP_TAC(MATCH_MP REAL_INTEGRAL (ASSUME - `(\x. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) - real_integrable_on real_interval[&0,B]`)) THEN - REWRITE_TAC[IMAGE_LIFT_REAL_INTERVAL] THEN - DISCH_TAC THEN - (* Step 7: lift o h o drop = vec inner form *) - SUBGOAL_THEN - `(lift o (\x. real_integral (real_interval[&0,&1]) - (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) o drop) = - (\x:real^1. integral (interval[lift(&0),lift(&1)]) - (\u:real^1. lift(&2 * drop x * exp(--((&1 + drop u pow 2) * - drop x pow 2)))))` - ASSUME_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN X_GEN_TAC `x:real^1` THEN - REWRITE_TAC[GSYM INNER_VEC_CONV; LIFT_DROP]; - ALL_TAC] THEN - (* Step 8: Vector Fubini *) - SUBGOAL_THEN - `integral (interval[lift(&0),lift B]) - (\x:real^1. integral (interval[lift(&0),lift(&1)]) - (\u:real^1. lift(&2 * drop x * - exp(--((&1 + drop u pow 2) * drop x pow 2))))) = - integral (interval[lift(&0),lift(&1)]) - (\u:real^1. integral (interval[lift(&0),lift B]) - (\x:real^1. lift(&2 * drop x * - exp(--((&1 + drop u pow 2) * drop x pow 2)))))` - ASSUME_TAC THENL - [MP_TAC(ISPECL - [`\x u:real^1. lift(&2 * drop x * - exp(--((&1 + drop u pow 2) * drop x pow 2)))`; - `lift(&0):real^1`; `lift(B:real):real^1`; - `lift(&0):real^1`; `lift(&1):real^1`] - INTEGRAL_SWAP_CONTINUOUS) THEN - REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART] THEN - DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[GAUSS_2D_CONTINUOUS]; - ALL_TAC] THEN - (* Step 9: Chain everything *) - ASM_REWRITE_TAC[] THEN - (* Step 10: Use OUTER_VEC_CONV *) - REWRITE_TAC[OUTER_VEC_CONV] THEN - (* Step 11: inner x-integral = k(u) for u in [0,1] *) - SUBGOAL_THEN - `!u:real^1. u IN interval[lift(&0), lift(&1)] ==> - real_integral (real_interval[&0,B]) - (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2))) = - inv(&1 + drop u pow 2) * (&1 - exp(--((&1 + drop u pow 2) * B pow 2)))` - ASSUME_TAC THENL - [X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP] THEN - STRIP_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - MATCH_MP_TAC INNER_X_INTEGRAL THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Step 12: k integrable on [0,1] *) - MP_TAC(SPEC `B:real` J_OUTER_INTEGRAND_INTEGRABLE) THEN - DISCH_TAC THEN - SUBGOAL_THEN - `(\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) - real_integrable_on real_interval[&0,&1]` - ASSUME_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 13: Get (lift o k o drop) integrable *) - SUBGOAL_THEN - `(lift o (\u. inv(&1 + u pow 2) * - (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) - integrable_on interval[lift(&0),lift(&1)]` - ASSUME_TAC THENL - [MP_TAC(SPEC `B:real` J_OUTER_INTEGRAND_INTEGRABLE) THEN - REWRITE_TAC[real_integrable_on; has_real_integral; - IMAGE_LIFT_REAL_INTERVAL; integrable_on] THEN - MESON_TAC[]; - ALL_TAC] THEN - (* Get has_integral for (lift o k o drop) *) - MP_TAC(MATCH_MP INTEGRABLE_INTEGRAL (ASSUME - `(lift o (\u. inv(&1 + u pow 2) * - (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) - integrable_on interval[lift(&0),lift(&1)]`)) THEN - DISCH_TAC THEN - (* Pointwise equality on [0,1] *) - SUBGOAL_THEN - `!u:real^1. u IN interval[lift(&0),lift(&1)] ==> - (lift o (\u. inv(&1 + u pow 2) * - (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) u = - lift(real_integral (real_interval[&0,B]) - (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2))))` - ASSUME_TAC THENL - [X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP] THEN - STRIP_TAC THEN REWRITE_TAC[o_THM; LIFT_DROP] THEN - AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - MATCH_MP_TAC INNER_X_INTEGRAL THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Use HAS_INTEGRAL_EQ to transfer *) - MP_TAC(ISPECL - [`(lift o (\u. inv(&1 + u pow 2) * - (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop)`; - `(\u:real^1. lift(real_integral (real_interval[&0,B]) - (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2)))))`; - `integral (interval[lift(&0),lift(&1)]) - (lift o (\u. inv(&1 + u pow 2) * - (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop)`; - `interval[lift(&0),lift(&1)]`] - HAS_INTEGRAL_EQ) THEN - ANTS_TAC THENL - [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; ALL_TAC] THEN - DISCH_THEN(fun th -> REWRITE_TAC[MATCH_MP INTEGRAL_UNIQUE th]) THEN - (* Step 14: Convert back to real_integral *) - MP_TAC(MATCH_MP REAL_INTEGRAL (ASSUME - `(\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) - real_integrable_on real_interval[&0,&1]`)) THEN - REWRITE_TAC[IMAGE_LIFT_REAL_INTERVAL] THEN - DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]));; - -(* H_PLUS_J: core identity proved from J_EQUALS_OUTER + ARCTAN_INTEGRAL *) -let H_PLUS_J = prove - (`!B. &0 < B - ==> real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) + - real_integral (real_interval[&0,B]) - (\x. exp(--(x pow 2))) pow 2 = pi / &4`, - REPEAT STRIP_TAC THEN - FIRST_ASSUM(SUBST1_TAC o MATCH_MP J_EQUALS_OUTER) THEN - MP_TAC(ISPECL - [`\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)`; - `\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))`; - `real_interval[&0,&1]`] - REAL_INTEGRAL_ADD) THEN - REWRITE_TAC[H_INTEGRAND_INTEGRABLE; J_OUTER_INTEGRAND_INTEGRABLE] THEN - DISCH_THEN(SUBST1_TAC o GSYM) THEN - SUBGOAL_THEN - `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) + - inv(&1 + t pow 2) * (&1 - exp(--((&1 + t pow 2) * B pow 2)))) = - (\t. inv(&1 + t pow 2))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; INTEGRAND_SUM_EQ_INV]; ALL_TAC] THEN - MP_TAC ARCTAN_INTEGRAL THEN - DISCH_THEN(fun th -> REWRITE_TAC[MATCH_MP REAL_INTEGRAL_UNIQUE th]));; - -(* Helper lemmas for convergence *) -let IB_NONNEG = prove - (`!B. &0 <= B ==> - &0 <= real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2)))`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_INTEGRAL_POS THEN - REWRITE_TAC[EXP_NEG_X2_INTEGRABLE] THEN - X_GEN_TAC `x:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN - REWRITE_TAC[REAL_EXP_POS_LT]);; - -let IB_SQ_EQ = prove - (`!B. &0 < B ==> - real_integral (real_interval[&0,B]) - (\x. exp(--(x pow 2))) pow 2 = - pi / &4 - - real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))`, - REPEAT STRIP_TAC THEN - MP_TAC(SPEC `B:real` H_PLUS_J) THEN - ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC);; - -let HB_NONNEG = prove - (`!B. &0 <= - real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))`, - GEN_TAC THEN - SUBGOAL_THEN - `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) - real_integrable_on real_interval[&0,&1]` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN - MATCH_MP_TAC REAL_LT_IMP_NZ THEN - MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; - ALL_TAC] THEN - MATCH_MP_TAC REAL_INTEGRAL_POS THEN ASM_REWRITE_TAC[] THEN - X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; - MATCH_MP_TAC REAL_LE_INV THEN - MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]);; - -let SQRT_PI_HALF_SQ = prove - (`(sqrt(pi) / &2) pow 2 = pi / &4`, - SUBGOAL_THEN `sqrt(pi) pow 2 = pi` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POW_2 THEN - MP_TAC PI_POS THEN REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[REAL_POW_DIV] THEN - ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN - REAL_ARITH_TAC);; + SUBGOAL_THEN `&0 < inv(e)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(e) + &1` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(inv(e) + &1)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `inv(&1 + x)` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`&1 + x`; `exp x`] REAL_LE_INV2) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MP_TAC(SPEC `x:real` REAL_EXP_LE_X) THEN REAL_ARITH_TAC]; + SIMP_TAC[]]; + MP_TAC(ISPECL [`inv(e) + &1`; `&1 + x`] REAL_LE_INV2) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; SIMP_TAC[]]]; + SUBGOAL_THEN `inv(inv e + &1) * (inv e + &1) = &1` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_MUL_LINV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `e * inv e = &1` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_MUL_RINV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `inv(inv e + &1) * (inv e + &1) < e * (inv e + &1)` MP_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LT_RMUL_EQ]]]);; -(* Main convergence: I(B) --> sqrt(pi)/2 *) -let HALF_GAUSSIAN_CONVERGES = prove - (`((\B. real_integral (real_interval[&0,B]) - (\x. exp(--(x pow 2)))) ---> sqrt(pi) / &2) at_posinfinity`, +let REALLIM_EXP_NEG_SQ = prove + (`((\x. exp(--(x pow 2))) ---> &0) at_posinfinity`, REWRITE_TAC[REALLIM_AT_POSINFINITY] THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&0 < sqrt(pi) / &2` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL - [MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC; - REAL_ARITH_TAC]; ALL_TAC] THEN - MP_TAC(SPEC `e * sqrt(pi) / &2` - (REWRITE_RULE[REALLIM_AT_POSINFINITY] H_LIMIT_ZERO)) THEN - ANTS_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(SPEC `e:real` + (REWRITE_RULE[REALLIM_AT_POSINFINITY] REALLIM_EXP_NEG)) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_THEN `N:real` ASSUME_TAC) THEN EXISTS_TAC `max (&1) N` THEN - X_GEN_TAC `B:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&0 < B` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `B >= N` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ABBREV_TAC - `I_B = real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2)))` THEN - ABBREV_TAC - `H_B = real_integral (real_interval[&0,&1]) - (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` THEN - SUBGOAL_THEN `&0 <= I_B` ASSUME_TAC THENL - [EXPAND_TAC "I_B" THEN MATCH_MP_TAC IB_NONNEG THEN ASM_REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `I_B pow 2 = pi / &4 - H_B` ASSUME_TAC THENL - [EXPAND_TAC "I_B" THEN EXPAND_TAC "H_B" THEN - MATCH_MP_TAC IB_SQ_EQ THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `&0 <= H_B` ASSUME_TAC THENL - [EXPAND_TAC "H_B" THEN REWRITE_TAC[HB_NONNEG]; ALL_TAC] THEN - SUBGOAL_THEN `abs(H_B - &0) < e * sqrt(pi) / &2` ASSUME_TAC THENL - [EXPAND_TAC "H_B" THEN - FIRST_X_ASSUM(MP_TAC o SPEC `B:real`) THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `H_B < e * sqrt(pi) / &2` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `(sqrt(pi) / &2) pow 2 = pi / &4` ASSUME_TAC THENL - [REWRITE_TAC[SQRT_PI_HALF_SQ]; ALL_TAC] THEN - SUBGOAL_THEN - `(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = --H_B` - ASSUME_TAC THENL - [SUBGOAL_THEN - `(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = - I_B pow 2 - (sqrt(pi) / &2) pow 2` + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `y pow 2 >= N` ASSUME_TAC THENL + [REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `y:real` THEN + CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_POW_2] THEN + MP_TAC(ISPECL [`y:real`; `&1`; `y:real`] REAL_LE_LMUL) THEN + REWRITE_TAC[REAL_MUL_RID] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC]; + ASM_MESON_TAC[]]);; + +(* Integrand bound *) +let INTEGRAND_BOUND = prove + (`!B t. &0 <= t /\ t <= &1 + ==> exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) <= + exp(--(B pow 2))`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp(--(B pow 2)) * inv(&1 + t pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_EXP_MONO_LE; REAL_LE_NEG2] THEN + MP_TAC(SPEC `&1 + (t:real) pow 2` (SPEC `&1` + (SPEC `(B:real) pow 2` REAL_LE_LMUL))) THEN + REWRITE_TAC[REAL_MUL_RID] THEN + DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_INV THEN + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; + MP_TAC(SPEC `&1` (SPEC `inv(&1 + (t:real) pow 2)` + (SPEC `exp(--((B:real) pow 2))` REAL_LE_LMUL))) THEN + REWRITE_TAC[REAL_MUL_RID] THEN + DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; + MATCH_MP_TAC REAL_INV_LE_1 THEN + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]]);; + +(* H(B) -> 0 *) +let H_LIMIT_ZERO = prove + (`((\B. real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))) + ---> &0) at_posinfinity`, + MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN + EXISTS_TAC `\B:real. exp(--(B pow 2))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_AT_POSINFINITY] THEN + EXISTS_TAC `&0` THEN X_GEN_TAC `B:real` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) + real_integrable_on real_interval[&0,&1]` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_NZ THEN + MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_POS THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; + MATCH_MP_TAC REAL_LE_INV THEN + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `abs(real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))) = + real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` SUBST1_TAC THENL - [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `sqrt(pi) / &2 <= I_B + sqrt(pi) / &2` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `&0 < I_B + sqrt(pi) / &2` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `I_B - sqrt(pi) / &2 <= &0` ASSUME_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `~(&0 < x) ==> x <= &0`) THEN - DISCH_TAC THEN + [REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN SUBGOAL_THEN - `&0 < (I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2)` MP_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN - SUBGOAL_THEN `abs(I_B - sqrt(pi) / &2) = sqrt(pi) / &2 - I_B` - ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `abs(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = H_B` - ASSUME_TAC THENL - [ASM_REWRITE_TAC[] THEN + `real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) <= + exp(--(B pow 2)) * (&1 - &0)` MP_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_UBOUND THEN + REPEAT CONJ_TAC THENL + [REAL_ARITH_TAC; + ASM_REWRITE_TAC[]; + X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + STRIP_TAC THEN MATCH_MP_TAC INTEGRAND_BOUND THEN + ASM_REWRITE_TAC[]]; + REWRITE_TAC[REAL_ARITH `a * (&1 - &0) = a`]]; + ACCEPT_TAC REALLIM_EXP_NEG_SQ]);; + +(* GAUSS_SUBSTITUTION: integral[0,c] exp(-t^2) dt = integral[0,1] c*exp(-c^2*u^2) du *) +let GAUSS_SUBSTITUTION = prove + (`!x. &0 < x ==> + ((\u. x * exp(--(x pow 2 * u pow 2))) + has_real_integral + real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2)))) + (real_interval[&0,&1])`, + X_GEN_TAC `c:real` THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`\t:real. exp(--(t pow 2))`; + `\u:real. c * u`; + `\u:real. c:real`; + `&0`; `&1`; `&0`; `c:real`; `{}:real->bool`] + HAS_REAL_INTEGRAL_SUBSTITUTION) THEN + REWRITE_TAC[COUNTABLE_EMPTY; DIFF_EMPTY] THEN + BETA_TAC THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID] THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_REAL_INTERVAL] THEN + GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC; + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REAL_ARITH_TAC]; + REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN REAL_ARITH_TAC; + REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]; SUBGOAL_THEN - `(sqrt(pi) / &2 - I_B) * (I_B + sqrt(pi) / &2) = - (sqrt(pi) / &2) pow 2 - I_B pow 2` + `(\u. exp(--((c * u) pow 2)) * c) = (\u. c * exp(--(c pow 2 * u pow 2)))` SUBST1_TAC THENL - [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN - `abs(I_B - sqrt(pi) / &2) * (sqrt(pi) / &2) <= - abs(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN - REWRITE_TAC[REAL_ABS_POS] THEN ASM_REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN - `abs(I_B - sqrt(pi) / &2) * (sqrt(pi) / &2) < e * sqrt(pi) / &2` - ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LT_RCANCEL_IMP THEN - EXISTS_TAC `sqrt(pi) / &2` THEN ASM_REWRITE_TAC[]);; + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `u:real` THEN + REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC; + SIMP_TAC[]]]);; -(* Final assembly: GAUSSIAN_INTEGRAL *) -let GAUSSIAN_INTEGRAL = prove - (`((\x. exp(--(x pow 2))) has_real_integral sqrt pi) (:real)`, - REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV] THEN - CONV_TAC(ONCE_DEPTH_CONV COND_ELIM_CONV) THEN REWRITE_TAC[] THEN - CONJ_TAC THENL - [REPEAT GEN_TAC THEN REWRITE_TAC[ETA_AX; EXP_NEG_X2_INTEGRABLE]; - ALL_TAC] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - MP_TAC(SPEC `e / &2` - (REWRITE_RULE[REALLIM_AT_POSINFINITY] HALF_GAUSSIAN_CONVERGES)) THEN +(* INNER_X_INTEGRAL: integral[0,B] 2*x*exp(-(1+u^2)*x^2) dx *) +let INNER_X_INTEGRAL = prove + (`!u B. &0 <= u /\ &0 < B ==> + ((\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) + has_real_integral + inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) + (real_interval[&0,B])`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < &1 + u pow 2` ASSUME_TAC THENL + [MP_TAC(SPEC `u:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`&1 + u pow 2`; `&0`; `B:real`] EXP_QUAD_ANTIDERIV) THEN ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `N:real` ASSUME_TAC) THEN - EXISTS_TAC `max (&1) N` THEN - CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN DISCH_TAC THEN - SUBGOAL_THEN `a <= --(max (&1) N) /\ max (&1) N <= b` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC) THEN - REWRITE_TAC[SUBSET_REAL_INTERVAL] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `&0 < b` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `a < &0` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `a <= b:real` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[IN_UNIV] THEN + DISCH_THEN(fun th -> MP_TAC(SPEC `&2` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN SUBGOAL_THEN - `real_integral (real_interval[a,b]) (\x. exp(--(x pow 2))) = - real_integral (real_interval[a,&0]) (\x. exp(--(x pow 2))) + - real_integral (real_interval[&0,b]) (\x. exp(--(x pow 2)))` + `(\x. &2 * (x * exp(--((&1 + u pow 2) * x pow 2)))) = + (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))` SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN - MATCH_MP_TAC REAL_INTEGRAL_COMBINE THEN - ASM_REWRITE_TAC[EXP_NEG_X2_INTEGRABLE] THEN ASM_REAL_ARITH_TAC; - ALL_TAC] THEN + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN SUBGOAL_THEN - `real_integral (real_interval[a,&0]) (\x. exp(--(x pow 2))) = - real_integral (real_interval[&0,--a]) (\x. exp(--(x pow 2)))` + `&2 * (inv(&2 * (&1 + u pow 2)) * + (exp(--((&1 + u pow 2) * &0 pow 2)) - + exp(--((&1 + u pow 2) * B pow 2)))) = + inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))` SUBST1_TAC THENL - [MP_TAC(ISPECL [`\x:real. exp(--(x pow 2))`; - `real_interval[&0,--a]`] - REAL_INTEGRAL_REFLECT_GEN) THEN - SIMP_TAC[] THEN - SUBGOAL_THEN `(!x:real. exp(--((--x) pow 2)) = exp(--(x pow 2)))` - (fun th -> REWRITE_TAC[th]) THENL - [GEN_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN - REWRITE_TAC[REAL_POW_NEG; ARITH] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `IMAGE (--) (real_interval[&0,--a]) = real_interval[a,&0]` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_REAL_INTERVAL] THEN - X_GEN_TAC `y:real` THEN EQ_TAC THENL - [STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; - STRIP_TAC THEN EXISTS_TAC `--y:real` THEN ASM_REAL_ARITH_TAC]; - SIMP_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN `--a >= N` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `b >= N` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `abs(real_integral (real_interval[&0,--a]) - (\x. exp(--(x pow 2))) - sqrt(pi) / &2) < e / &2` - ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `--a:real`) THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN - `abs(real_integral (real_interval[&0,b]) - (\x. exp(--(x pow 2))) - sqrt(pi) / &2) < e / &2` - ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `b:real`) THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `sqrt pi = sqrt(pi) / &2 + sqrt(pi) / &2` - SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REAL_ARITH_TAC);; + [REWRITE_TAC[REAL_POW_2; REAL_MUL_RZERO; REAL_MUL_LZERO; + REAL_NEG_0; REAL_EXP_0] THEN + UNDISCH_TAC `&0 < &1 + u pow 2` THEN CONV_TAC REAL_FIELD; + SIMP_TAC[]]);; -(* Scaled Gaussian integral: integrate exp(-at^2/2) over all of R *) -let GAUSSIAN_INTEGRAL_SCALED = prove - (`!a. &0 < a - ==> ((\t. exp(--(a * t pow 2 / &2))) has_real_integral - sqrt(&2 * pi / a)) (:real)`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `&0 < sqrt(a / &2)` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LT THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - (* Replace the result with the equivalent form *) - SUBGOAL_THEN `sqrt(&2 * pi / a) = inv(sqrt(a / &2)) * sqrt pi` - SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN - ONCE_REWRITE_TAC[GSYM SQRT_INV] THEN - REWRITE_TAC[GSYM SQRT_MUL] THEN AP_TERM_TAC THEN - UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD; - ALL_TAC] THEN - (* Show integrands are equal up to substitution *) - MATCH_MP_TAC HAS_REAL_INTEGRAL_EQ THEN - EXISTS_TAC `\x:real. exp(--((sqrt(a / &2) * x) pow 2))` THEN - CONJ_TAC THENL - [X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_UNIV] THEN - AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[REAL_POW_MUL] THEN - ASM_SIMP_TAC[SQRT_POW_2; REAL_LE_DIV; REAL_LT_IMP_LE; - REAL_ARITH `&0 < &2`] THEN - REAL_ARITH_TAC; - (* Apply the stretching lemma to the Gaussian integral *) - MATCH_MP_TAC HAS_REAL_INTEGRAL_STRETCH_UNIV THEN - ASM_REWRITE_TAC[GAUSSIAN_INTEGRAL]]);; +(* === Helper lemmas for J_EQUALS_OUTER === *) -(* Gaussian * cosine is integrable *) -let GAUSSIAN_COS_INTEGRABLE = prove - (`!a b. &0 < a - ==> (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) - real_integrable_on (:real)`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2))` THEN REPEAT CONJ_TAC THENL - [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - REWRITE_TAC[real_integrable_on] THEN - EXISTS_TAC `sqrt(&2 * pi / a)` THEN - ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; - GEN_TAC THEN REWRITE_TAC[IN_UNIV; REAL_ABS_MUL] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `exp(--(a * x pow 2 / &2)) * &1` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_MUL2 THEN - REWRITE_TAC[REAL_ABS_POS; COS_BOUND] THEN - REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`; REAL_EXP_POS_LE]; - REWRITE_TAC[REAL_MUL_RID; REAL_LE_REFL]]]);; +let LIFT_ZERO = prove + (`lift(&0) :real^1 = vec 0`, + REWRITE_TAC[GSYM DROP_EQ; DROP_VEC] THEN + MESON_TAC[LIFT_DROP; LIFT_EQ]);; -(* y * exp(-y) <= 1 for y >= 0 *) -let REAL_EXP_DECAY_BOUND = prove - (`!y. &0 <= y ==> y * exp(--y) <= &1`, - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `exp y * exp(--y)` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN - MP_TAC(SPEC `y:real` REAL_EXP_LE_X) THEN REAL_ARITH_TAC; - REWRITE_TAC[GSYM REAL_EXP_ADD] THEN - SUBGOAL_THEN `y + --y = &0` SUBST1_TAC THENL - [REAL_ARITH_TAC; REWRITE_TAC[REAL_EXP_0; REAL_LE_REFL]]]);; +let REAL_INTEGRAL_REFL = prove + (`!(f:real->real) a. real_integral (real_interval[a,a]) f = &0`, + REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + REWRITE_TAC[has_real_integral; IMAGE_LIFT_REAL_INTERVAL; LIFT_ZERO] THEN + REWRITE_TAC[HAS_INTEGRAL_REFL]);; -(* Pointwise bound: x^2 * exp(-ax^2/2) <= (4/a) * exp(-(a/2)*x^2/2) *) -(* Proof: split exp(-ax^2/2) = exp(-ax^2/4)^2, cancel one factor, *) -(* then x^2*exp(-ax^2/4) = (4/a)*((ax^2/4)*exp(-ax^2/4)) <= 4/a *) -(* by REAL_EXP_DECAY_BOUND. *) -(* NOTE: / has higher precedence than * in HOL Light, so *) -(* a * x pow 2 / &4 parses as a * (x^2/4), NOT (a*x^2)/4. *) -let GAUSSIAN_T2_POINTWISE_BOUND = prove - (`!a x. &0 < a - ==> x pow 2 * exp(--(a * x pow 2 / &2)) <= - (&4 / a) * exp(--((a / &2) * x pow 2 / &2))`, - REPEAT STRIP_TAC THEN - (* Simplify RHS exponent: (a/2)*x^2/2 = a*x^2/4 *) - SUBGOAL_THEN `(a / &2) * x pow 2 / &2 = a * x pow 2 / &4` - (fun th -> REWRITE_TAC[th]) THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - (* Split exp(-ax^2/2) = exp(-ax^2/4) * exp(-ax^2/4) *) - SUBGOAL_THEN `exp(--(a * x pow 2 / &2)) = - exp(--(a * x pow 2 / &4)) * exp(--(a * x pow 2 / &4))` - SUBST1_TAC THENL - [REWRITE_TAC[GSYM REAL_EXP_ADD] THEN AP_TERM_TAC THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* Reassociate: x^2 * (e * e) = (x^2 * e) * e *) - ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN - (* Cancel exp(-ax^2/4) from both sides *) - MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [ALL_TAC; REWRITE_TAC[REAL_EXP_POS_LE]] THEN - (* Goal: x^2 * exp(-ax^2/4) <= 4/a *) - (* Key step: x^2*e = (4/a) * ((a*(x^2/4)) * e), then use DECAY_BOUND *) - (* Note: a * x pow 2 / &4 parses as a * (x^2/4) in HOL Light *) - SUBGOAL_THEN `x pow 2 * exp(--(a * x pow 2 / &4)) = - (&4 / a) * - ((a * x pow 2 / &4) * exp(--(a * x pow 2 / &4)))` - SUBST1_TAC THENL - [SUBGOAL_THEN `~(a = &0)` MP_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - CONV_TAC REAL_FIELD; ALL_TAC] THEN - (* Goal: (4/a) * ((a*(x^2/4)) * exp(-ax^2/4)) <= 4/a *) - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_IMP_LE THEN - MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; - (* Goal: (a*(x^2/4))*exp(--(a*(x^2/4))) <= 1 *) - MATCH_MP_TAC REAL_EXP_DECAY_BOUND THEN - (* Goal: 0 <= a * (x^2/4) *) - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_DIV THEN - REWRITE_TAC[REAL_LE_POW_2] THEN REAL_ARITH_TAC]]);; +let EXP_NEG_ADD = prove + (`!a b. exp(--a) * exp(--b) = exp(--(a + b))`, + REPEAT GEN_TAC THEN REWRITE_TAC[GSYM REAL_EXP_ADD] THEN + AP_TERM_TAC THEN REAL_ARITH_TAC);; -(* t^2 * Gaussian is integrable *) -let GAUSSIAN_T2_INTEGRABLE = prove - (`!a. &0 < a - ==> (\t. t pow 2 * exp(--(a * t pow 2 / &2))) - real_integrable_on (:real)`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\t:real. (&4 / a) * exp(--((a / &2) * t pow 2 / &2))` THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - REWRITE_TAC[real_integrable_on] THEN - EXISTS_TAC `sqrt(&2 * pi / (a / &2))` THEN - MATCH_MP_TAC GAUSSIAN_INTEGRAL_SCALED THEN ASM_REAL_ARITH_TAC; - GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN - SUBGOAL_THEN `abs(x pow 2 * exp(--(a * x pow 2 / &2))) = - x pow 2 * exp(--(a * x pow 2 / &2))` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL] THEN - MATCH_MP_TAC REAL_LE_MUL THEN - REWRITE_TAC[REAL_LE_POW_2; REAL_EXP_POS_LE]; ALL_TAC] THEN - ASM_SIMP_TAC[GAUSSIAN_T2_POINTWISE_BOUND]]);; +let IMAGE_LIFT_REAL_INTERVAL = prove + (`!a b. IMAGE lift (real_interval[a,b]) = interval[lift a, lift b]`, + REPEAT GEN_TAC THEN REWRITE_TAC[REAL_INTERVAL_INTERVAL; GSYM IMAGE_o] THEN + SUBGOAL_THEN `lift o (drop:real^1->real) = I` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; o_THM; I_THM; LIFT_DROP]; ALL_TAC] THEN + REWRITE_TAC[IMAGE_I]);; -(* Helper: |x| <= 1 + x^2 *) -let ABS_LE_1_PLUS_POW2 = prove - (`!x:real. abs x <= &1 + x pow 2`, - GEN_TAC THEN - DISJ_CASES_TAC (SPEC `abs(x:real)` (REAL_ARITH `!u. u <= &1 \/ &1 <= u`)) THENL - [MP_TAC (SPEC `x:real` REAL_LE_POW_2) THEN ASM_REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs x * abs x` THEN - CONJ_TAC THENL - [GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN - REWRITE_TAC[REAL_ABS_POS] THEN ASM_REAL_ARITH_TAC; - REWRITE_TAC[GSYM REAL_POW_2; REAL_POW2_ABS] THEN - MP_TAC (SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]]);; +let LIFT_DROP_FSTCART = prove + (`(\z:real^(1,1)finite_sum. lift(drop(fstcart z))) = fstcart`, + REWRITE_TAC[FUN_EQ_THM; LIFT_DROP]);; -(* t * Gaussian * sin is integrable *) -(* Dominator: exp(-at^2/2) + t^2*exp(-at^2/2) since |t|*exp <= (1+t^2)*exp *) -let GAUSSIAN_T_SIN_INTEGRABLE = prove - (`!a b. &0 < a - ==> (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) - real_integrable_on (:real)`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2)) + - t pow 2 * exp(--(a * t pow 2 / &2))` THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[real_integrable_on] THEN - EXISTS_TAC `sqrt(&2 * pi / a)` THEN - ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; - ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE]]; - GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs x * exp(--(a * x pow 2 / &2))` THEN CONJ_TAC THENL - [(* |t*exp*sin| <= |t|*exp: simplify abs, factor, use |sin| <= 1 *) - REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs(exp(--(a * x pow 2 / &2))) = exp(--(a * x pow 2 / &2))` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL; REAL_EXP_POS_LE]; ALL_TAC] THEN - REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN - REWRITE_TAC[REAL_EXP_POS_LE; SIN_BOUND]; - (* |t|*exp <= (1+t^2)*exp = exp + t^2*exp *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `(&1 + x pow 2) * exp(--(a * x pow 2 / &2))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [REWRITE_TAC[ABS_LE_1_PLUS_POW2]; REWRITE_TAC[REAL_EXP_POS_LE]]; - REWRITE_TAC[REAL_ADD_RDISTRIB; REAL_MUL_LID; REAL_LE_REFL]]]]);; +let LIFT_DROP_SNDCART = prove + (`(\z:real^(1,1)finite_sum. lift(drop(sndcart z))) = sndcart`, + REWRITE_TAC[FUN_EQ_THM; LIFT_DROP]);; -(* Taylor bound for cosine: |cos(x+h) - cos(x) + h*sin(x)| <= h^2 *) -let COS_TAYLOR2_BOUND = prove - (`!x h. abs(cos(x + h) - cos x + h * sin x) <= h pow 2`, - REPEAT GEN_TAC THEN - MP_TAC (ISPECL - [`\(i:num) (t:real). - if i = 0 then cos t - else if i = 1 then --(sin t) - else --(cos t)`; - `1`; `(:real)`; `&1`] REAL_TAYLOR) THEN - REWRITE_TAC[IS_REALINTERVAL_UNIV; IN_UNIV] THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [(* Derivative conditions for i <= 1 *) - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `i = 0 \/ i = 1` DISJ_CASES_TAC THENL - [ASM_ARITH_TAC; ALL_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[ARITH_RULE `0 + 1 = 1`; ARITH_RULE `1 + 1 = 2`; - ARITH_RULE `0 = 0 <=> T`; ARITH_RULE `1 = 0 <=> F`; - ARITH_RULE `1 = 1 <=> T`; ARITH_RULE `~(2 = 0)`; - ARITH_RULE `~(2 = 1)`] THEN - REWRITE_TAC[WITHINREAL_UNIV] THENL - [(* i=0: cos has_real_derivative --sin *) - REWRITE_TAC[ETA_AX; HAS_REAL_DERIVATIVE_COS]; - (* i=1: (\t. --sin t) has_real_derivative --cos *) - MATCH_MP_TAC HAS_REAL_DERIVATIVE_NEG THEN - REWRITE_TAC[ETA_AX; HAS_REAL_DERIVATIVE_SIN]]; - (* Bound: |--cos(u)| <= 1 *) - X_GEN_TAC `u:real` THEN - REWRITE_TAC[ARITH_RULE `1 + 1 = 2`; ARITH_RULE `~(2 = 0)`; - ARITH_RULE `~(2 = 1)`] THEN - REWRITE_TAC[REAL_ABS_NEG; COS_BOUND]]; - ALL_TAC] THEN - (* Apply with w=x, z=x+h *) - DISCH_THEN (MP_TAC o SPECL [`x:real`; `x + h:real`]) THEN - REWRITE_TAC[REAL_ARITH `(x + h) - x = h:real`] THEN - (* Simplify sum(0..1) *) - SIMP_TAC[SUM_CLAUSES_LEFT; LE_0] THEN - CONV_TAC NUM_REDUCE_CONV THEN - REWRITE_TAC[SUM_SING_NUMSEG] THEN - CONV_TAC NUM_REDUCE_CONV THEN - REWRITE_TAC[FACT] THEN CONV_TAC NUM_REDUCE_CONV THEN - REWRITE_TAC[CONJUNCT1 real_pow; REAL_POW_1; REAL_MUL_LID; REAL_MUL_RID; - REAL_DIV_1; REAL_ADD_RID] THEN - (* Hypothesis: abs(cos(x+h) - (cos x + --sin x * h)) <= abs h pow 2 / &2 - Goal: abs(cos(x+h) - cos x + h * sin x) <= h pow 2 *) - DISCH_TAC THEN - SUBGOAL_THEN `cos(x + h) - cos x + h * sin x = - cos(x + h) - (cos x + --(sin x) * h)` SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs h pow 2 / &2` THEN - CONJ_TAC THENL - [ASM_REWRITE_TAC[]; - SUBGOAL_THEN `abs h pow 2 = h pow 2` SUBST1_TAC THENL - [ONCE_REWRITE_TAC[GSYM REAL_ABS_POW] THEN - REWRITE_TAC[REAL_ABS_REFL; REAL_LE_POW_2]; ALL_TAC] THEN - MP_TAC (SPEC `h:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]);; +let LIFT_EXP_DROP_CONTINUOUS = prove + (`!s:real^1->bool. (lift o exp o drop) continuous_on s`, + GEN_TAC THEN MATCH_MP_TAC CONTINUOUS_ON_SUBSET THEN + EXISTS_TAC `(:real^1)` THEN REWRITE_TAC[SUBSET_UNIV] THEN + REWRITE_TAC[GSYM IMAGE_LIFT_UNIV] THEN + REWRITE_TAC[GSYM REAL_CONTINUOUS_ON; REAL_CONTINUOUS_ON_EXP]);; -(* General bound on the antiderivative *) -let GAUSSIAN_ANTIDERIV_BOUND = prove - (`!a b t. &0 < a - ==> abs(--inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)) - <= inv(a) * exp(--(a * t pow 2 / &2))`, - REPEAT STRIP_TAC THEN - REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NEG] THEN - SUBGOAL_THEN `abs(inv a) = inv a` SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN - ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `abs(exp(--(a * t pow 2 / &2))) = exp(--(a * t pow 2 / &2))` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL; REAL_EXP_POS_LE]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC; - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN - REWRITE_TAC[REAL_EXP_POS_LE; SIN_BOUND]]);; +let EXP_NEG_SQ_REAL_CONTINUOUS = prove + (`!B. (\t. exp(--(t pow 2))) real_continuous_on real_interval[&0,B]`, + GEN_TAC THEN MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; -(* Helper: derivative of the antiderivative F(t) = --inv(a)*exp(-at^2/2)*sin(bt) *) -let GAUSSIAN_FT_ANTIDERIV_DERIV = prove - (`!a b t. &0 < a ==> - ((\t. --inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)) - has_real_derivative - (t * exp(--(a * t pow 2 / &2)) * sin(b * t) - - b / a * exp(--(a * t pow 2 / &2)) * cos(b * t))) - (atreal t)`, - REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN - UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD);; +let INNER_INTEGRAND_INTEGRABLE = prove + (`!x:real. (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) + real_integrable_on real_interval[&0,&1]`, + GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MP_TAC(SPEC `x':real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; -(* For x > 0, exp(-x) < inv(x). Used for the IBP antiderivative decay. *) -let REAL_EXP_NEG_LT_INV = prove - (`!x. &0 < x ==> exp(--x) < inv x`, - GEN_TAC THEN DISCH_TAC THEN - SUBGOAL_THEN `x < exp(x)` MP_TAC THENL - [MP_TAC(SPEC `x:real` REAL_EXP_LE_X) THEN ASM_REAL_ARITH_TAC; - DISCH_TAC THEN REWRITE_TAC[REAL_EXP_NEG] THEN - MATCH_MP_TAC REAL_LT_INV2 THEN ASM_REWRITE_TAC[]]);; +let OUTER_INTEGRAND_INTEGRABLE = prove + (`!B:real u. (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) + real_integrable_on real_interval[&0,B]`, + REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; -(* For large |t|, inv(a)*exp(-a*t^2/2) is arbitrarily small *) -let GAUSSIAN_EXP_DECAY = prove - (`!a e. &0 < a /\ &0 < e - ==> ?B. &0 < B /\ - !t. B <= abs(t) ==> inv(a) * exp(--(a * t pow 2 / &2)) < e`, +let GAUSS_INTEGRAL_DERIV = prove + (`!B x. x IN real_interval[&0,B] ==> + ((\u. real_integral(real_interval[&0,u]) (\t. exp(--(t pow 2)))) + has_real_derivative exp(--(x pow 2))) + (atreal x within real_interval[&0,B])`, REPEAT STRIP_TAC THEN - EXISTS_TAC `(&1 + &2 / ((a:real) pow 2 * (e:real))):real` THEN - ABBREV_TAC `B = (&1 + &2 / ((a:real) pow 2 * (e:real))):real` THEN - SUBGOAL_THEN `&0 < (a:real) pow 2 * (e:real)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN ASM_SIMP_TAC[REAL_POW_LT]; ALL_TAC] THEN - SUBGOAL_THEN `&1 <= B` ASSUME_TAC THENL - [EXPAND_TAC "B" THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &1 <= &1 + x`) THEN - MATCH_MP_TAC REAL_LE_DIV THEN - ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `&0 < B` ASSUME_TAC THENL - [UNDISCH_TAC `&1 <= B` THEN REAL_ARITH_TAC; ALL_TAC] THEN - CONJ_TAC THENL - [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; ALL_TAC] THEN - X_GEN_TAC `t:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `B pow 2 <= t pow 2` ASSUME_TAC THENL - [ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN - MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_ABS_POS]; - UNDISCH_TAC `&0 < B` THEN UNDISCH_TAC `B <= abs(t)` THEN - REAL_ARITH_TAC]; ALL_TAC] THEN - SUBGOAL_THEN `B <= B pow 2` ASSUME_TAC THENL - [REWRITE_TAC[REAL_POW_2] THEN - GEN_REWRITE_TAC (LAND_CONV) [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; - UNDISCH_TAC `&1 <= B` THEN REAL_ARITH_TAC]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < (a:real) * (B:real) / &2` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < a` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; - REAL_ARITH_TAC]]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < (a:real) * (e:real)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN - UNDISCH_TAC `&0 < a` THEN UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* Step 1: Establish B <= t^2 *) - SUBGOAL_THEN `(B:real) <= t pow 2` ASSUME_TAC THENL - [ASM_MESON_TAC[REAL_LE_TRANS]; ALL_TAC] THEN - (* Step 2: Part 1 - inv(a)*exp(-at^2/2) <= inv(a)*exp(-aB/2) *) - SUBGOAL_THEN - `inv((a:real)) * exp(--(a * t pow 2 / &2)) <= - inv(a) * exp(--(a * (B:real) / &2))` - ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_INV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; - REWRITE_TAC[REAL_EXP_MONO_LE; REAL_LE_NEG2] THEN - ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`; - REAL_LE_LMUL_EQ]]; - ALL_TAC] THEN - (* Step 3: Part 2 - inv(a)*exp(-aB/2) < e *) - SUBGOAL_THEN `~((a:real) = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `~((e:real) = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `inv((a:real) * e) <= a * B / &2` ASSUME_TAC THENL - [EXPAND_TAC "B" THEN - SUBGOAL_THEN - `(a:real) * (&1 + &2 / (a pow 2 * e)) / &2 = a / &2 + inv(a * e)` - SUBST1_TAC THENL - [UNDISCH_TAC `~((a:real) = &0)` THEN - UNDISCH_TAC `~((e:real) = &0)` THEN - CONV_TAC REAL_FIELD; - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> y <= x + y`) THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN - MATCH_MP_TAC REAL_LT_DIV THEN - CONJ_TAC THENL [ASM_REWRITE_TAC[]; REAL_ARITH_TAC]]; - ALL_TAC] THEN - SUBGOAL_THEN `exp(--((a:real) * B / &2)) < a * e` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LTE_TRANS THEN - EXISTS_TAC `inv((a:real) * B / &2)` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_EXP_NEG_LT_INV THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `inv(inv((a:real) * e))` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[]]; - REWRITE_TAC[REAL_INV_INV; REAL_LE_REFL]]]; - ALL_TAC] THEN - (* Step 4: Combine via REAL_LET_TRANS *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `(inv((a:real)) * exp(--((a:real) * (B:real) / &2))):real` THEN - CONJ_TAC THENL - [ASM_REWRITE_TAC[]; - SUBGOAL_THEN `(e:real) = inv(a) * (a * e)` SUBST1_TAC THENL - [REWRITE_TAC[REAL_MUL_ASSOC] THEN - ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID]; - MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[]]]]);; + MP_TAC(ISPECL [`\t:real. exp(--(t pow 2))`; `&0`; `B:real`] + REAL_INTEGRAL_HAS_REAL_DERIVATIVE) THEN + REWRITE_TAC[EXP_NEG_SQ_REAL_CONTINUOUS] THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN REWRITE_TAC[]);; -(* IBP identity: integral of t * exp(-at^2/2) * sin(bt) = (b/a) * I(b) *) -(* Proof: F(t) = --inv(a)*exp(-at^2/2)*sin(bt) has derivative = integrand, *) -(* F -> 0 at infinity, so by FTC + HAS_REAL_INTEGRAL_ALT, integral F' = 0 *) -let GAUSSIAN_FT_IBP = prove - (`!a b. &0 < a - ==> real_integral (:real) (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = - (b / a) * real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))`, +let GAUSS_SQ_FTC = prove + (`!B. &0 <= B ==> + ((\x. &2 * real_integral(real_interval[&0,x]) + (\t. exp(--(t pow 2))) * exp(--(x pow 2))) + has_real_integral + (real_integral(real_interval[&0,B]) (\t. exp(--(t pow 2))) pow 2)) + (real_interval[&0,B])`, REPEAT STRIP_TAC THEN - ABBREV_TAC `f = \t:real. t * exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN - ABBREV_TAC `g = \t:real. exp(--(a * t pow 2 / &2)) * cos(b * t)` THEN - ABBREV_TAC `Fa = \t:real. --inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN - (* Step 1: Both integrands are integrable *) - SUBGOAL_THEN `(f:real->real) real_integrable_on (:real)` ASSUME_TAC THENL - [EXPAND_TAC "f" THEN ASM_SIMP_TAC[GAUSSIAN_T_SIN_INTEGRABLE]; ALL_TAC] THEN - SUBGOAL_THEN `(g:real->real) real_integrable_on (:real)` ASSUME_TAC THENL - [EXPAND_TAC "g" THEN ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE]; ALL_TAC] THEN - (* Step 2: Fa'(t) = f(t) - (b/a)*g(t) everywhere *) + MP_TAC(ISPECL + [`\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) pow 2`; + `\x:real. &2 * real_integral(real_interval[&0,x]) + (\t. exp(--(t pow 2))) * exp(--(x pow 2))`; + `&0`; `B:real`] + REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS) THEN + BETA_TAC THEN + REWRITE_TAC[REAL_INTEGRAL_REFL; REAL_POW_ZERO; ARITH; REAL_SUB_RZERO] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:real` THEN DISCH_TAC THEN SUBGOAL_THEN - `!t. ((Fa:real->real) has_real_derivative - ((f:real->real) t - b / a * (g:real->real) t)) (atreal t)` - ASSUME_TAC THENL - [X_GEN_TAC `t:real` THEN EXPAND_TAC "f" THEN EXPAND_TAC "g" THEN - EXPAND_TAC "Fa" THEN ASM_SIMP_TAC[GAUSSIAN_FT_ANTIDERIV_DERIV]; - ALL_TAC] THEN - (* Step 3: |Fa(t)| <= inv(a) * exp(-at^2/2) *) + `(\x. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) pow 2) = + (\x. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * + real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))))` + SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; REAL_POW_2]; ALL_TAC] THEN SUBGOAL_THEN - `!t. abs((Fa:real->real) t) <= inv(a) * exp(--(a * t pow 2 / &2))` - ASSUME_TAC THENL - [X_GEN_TAC `t:real` THEN EXPAND_TAC "Fa" THEN - ASM_SIMP_TAC[GAUSSIAN_ANTIDERIV_BOUND]; + `&2 * real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * + exp(--(x pow 2)) = + real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * + exp(--(x pow 2)) + + exp(--(x pow 2)) * + real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2)))` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL + [`\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; + `exp(--(x pow 2))`; + `\x:real. real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; + `exp(--(x pow 2))`; `x:real`; `real_interval[&0,B]`] + HAS_REAL_DERIVATIVE_MUL_WITHIN) THEN BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THEN MATCH_MP_TAC GAUSS_INTEGRAL_DERIV THEN ASM_REWRITE_TAC[]);; + +let GAUSS_INNER_REWRITE = prove + (`!x. &0 < x ==> + ((\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))) + has_real_integral + (&2 * real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * + exp(--(x pow 2)))) + (real_interval[&0,&1])`, + REPEAT STRIP_TAC THEN + MP_TAC(SPEC `x:real` GAUSS_SUBSTITUTION) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> MP_TAC(SPEC `&2 * exp(--(x pow 2))` + (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN BETA_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`\u:real. (&2 * exp(--(x pow 2))) * (x * exp(--(x pow 2 * u pow 2)))`; + `\u:real. &2 * x * exp(--((&1 + u pow 2) * x pow 2))`; + `(&2 * exp(--(x pow 2))) * + real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2)))`; + `real_interval[&0,&1]`] HAS_REAL_INTEGRAL_EQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THENL + [X_GEN_TAC `u:real` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(&2 * exp(--(x pow 2))) * (x * exp(--(x pow 2 * u pow 2))) = + &2 * x * (exp(--(x pow 2)) * exp(--(x pow 2 * u pow 2)))` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[EXP_NEG_ADD] THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN + `(&2 * exp(--(x pow 2))) * + real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) = + &2 * real_integral(real_interval[&0,x]) (\t. exp(--(t pow 2))) * + exp(--(x pow 2))` + SUBST1_TAC THENL [REAL_ARITH_TAC; SIMP_TAC[]]);; + +let INNER_VEC_CONV = prove + (`!x:real. + integral (interval[lift(&0),lift(&1)]) + (\u:real^1. lift(&2 * x * exp(--((&1 + drop u pow 2) * x pow 2)))) = + lift(real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))`, + GEN_TAC THEN CONV_TAC SYM_CONV THEN + MP_TAC(MATCH_MP REAL_INTEGRAL (SPEC `x:real` INNER_INTEGRAND_INTEGRABLE)) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th; LIFT_DROP; IMAGE_LIFT_REAL_INTERVAL]) THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]);; + +let OUTER_VEC_CONV = prove + (`!B u:real. + integral (interval[lift(&0),lift B]) + (\x:real^1. lift(&2 * drop x * exp(--((&1 + u pow 2) * drop x pow 2)))) = + lift(real_integral (real_interval[&0,B]) + (\x. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))`, + REPEAT GEN_TAC THEN CONV_TAC SYM_CONV THEN + MP_TAC(MATCH_MP REAL_INTEGRAL + (SPECL [`B:real`; `u:real`] OUTER_INTEGRAND_INTEGRABLE)) THEN + DISCH_THEN(fun th -> REWRITE_TAC[th; LIFT_DROP; IMAGE_LIFT_REAL_INTERVAL]) THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]);; + +let GAUSS_2D_CONTINUOUS = prove + (`!B. (\z. lift(&2 * drop(fstcart z) * + exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) + continuous_on + (interval[pastecart (lift(&0)) (lift(&0)):real^(1,1)finite_sum, + pastecart (lift B) (lift(&1))])`, + GEN_TAC THEN + SUBGOAL_THEN + `(\z. lift(&2 * drop(fstcart z) * + exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) = + (\z:real^(1,1)finite_sum. (&2 * drop(fstcart z)) % + lift(exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2))))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; GSYM LIFT_CMUL] THEN + GEN_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_MUL THEN CONJ_TAC THENL + [SUBGOAL_THEN + `(lift o (\z:real^(1,1)finite_sum. &2 * drop(fstcart z))) = + (\z. &2 % (fstcart z:real^1))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_CMUL; LIFT_DROP]; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_CMUL THEN + MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_FSTCART]; ALL_TAC] THEN - (* Step 4: Fa' is integrable on every finite interval *) SUBGOAL_THEN - `!c d. (\t. (f:real->real) t - b / a * (g:real->real) t) - real_integrable_on real_interval[c,d]` + `(\z:real^(1,1)finite_sum. + lift(exp(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))) = + ((lift o exp o drop) :real^1->real^1) o + (\z. lift(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_DROP]; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_COMPOSE THEN CONJ_TAC THENL + [SUBGOAL_THEN + `(\z:real^(1,1)finite_sum. + lift(--((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2))) = + (\z. --(lift((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)))` + SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; LIFT_NEG]; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_NEG THEN + SUBGOAL_THEN + `(\z:real^(1,1)finite_sum. + lift((&1 + drop(sndcart z) pow 2) * drop(fstcart z) pow 2)) = + (\z. (&1 + drop(sndcart z) pow 2) % lift(drop(fstcart z) pow 2))` + SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM; LIFT_CMUL]; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_MUL THEN CONJ_TAC THENL + [SUBGOAL_THEN + `(lift o (\z:real^(1,1)finite_sum. &1 + drop(sndcart z) pow 2)) = + (\z. lift(&1) + lift(drop(sndcart z) pow 2))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; o_THM; LIFT_ADD]; ALL_TAC] THEN + MATCH_MP_TAC CONTINUOUS_ON_ADD THEN REWRITE_TAC[CONTINUOUS_ON_CONST] THEN + MATCH_MP_TAC CONTINUOUS_ON_LIFT_POW THEN REWRITE_TAC[LIFT_DROP_SNDCART] THEN + MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_SNDCART]; + MATCH_MP_TAC CONTINUOUS_ON_LIFT_POW THEN REWRITE_TAC[LIFT_DROP_FSTCART] THEN + MATCH_MP_TAC LINEAR_CONTINUOUS_ON THEN REWRITE_TAC[LINEAR_FSTCART]]; + REWRITE_TAC[LIFT_EXP_DROP_CONTINUOUS]]);; + + +(* Integrability of H and J outer integrands - moved before J_EQUALS_OUTER *) +let INTEGRAND_SUM_EQ_INV = prove + (`!B t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) + + inv(&1 + t pow 2) * (&1 - exp(--((&1 + t pow 2) * B pow 2))) = + inv(&1 + t pow 2)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `B pow 2 * (&1 + t pow 2) = (&1 + t pow 2) * B pow 2` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH + `x * a + a * (&1 - x) = a ==> x * a + a * (&1 - x) = a`) THEN + CONV_TAC REAL_RING);; + +let H_INTEGRAND_INTEGRABLE = prove + (`!B. (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) + real_integrable_on real_interval[&0,&1]`, + GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; + +let J_OUTER_INTEGRAND_INTEGRABLE = prove + (`!B. (\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) + real_integrable_on real_interval[&0,&1]`, + GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC);; + +(* J_EQUALS_OUTER: J(B) = integral[0,1] inv(1+u^2)*(1-exp(-(1+u^2)*B^2)) du *) +(* Proved via Fubini (INTEGRAL_SWAP_CONTINUOUS), GAUSS_SUBSTITUTION, INNER_X_INTEGRAL *) +let J_EQUALS_OUTER = prove + (`!B. &0 < B ==> + real_integral (real_interval[&0,B]) + (\x. exp(--(x pow 2))) pow 2 = + real_integral (real_interval[&0,&1]) + (\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2))))`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Step 1: GAUSS_SQ_FTC *) + MP_TAC(SPEC `B:real` GAUSS_SQ_FTC) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + (* Step 2: Integrand equality *) + SUBGOAL_THEN + `!x:real. x IN real_interval[&0,B] ==> + &2 * real_integral (real_interval[&0,x]) (\t. exp(--(t pow 2))) * + exp(--(x pow 2)) = + real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))` ASSUME_TAC THENL - [REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN - EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[SUBSET_UNIV]; - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN - EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[SUBSET_UNIV]]; + [X_GEN_TAC `x:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN STRIP_TAC THEN + ASM_CASES_TAC `&0 < x` THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + MATCH_MP_TAC GAUSS_INNER_REWRITE THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `x = &0` SUBST_ALL_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_INTEGRAL_REFL; + REAL_INTEGRAL_0]]; ALL_TAC] THEN - (* Step 5: FTC on [c,d] gives integral = Fa(d) - Fa(c) *) + (* Step 3: h has_real_integral G(B)^2 *) SUBGOAL_THEN - `!c d. c <= d ==> - ((\t. (f:real->real) t - b / a * (g:real->real) t) - has_real_integral ((Fa:real->real) d - Fa c)) (real_interval[c,d])` + `((\x. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) + has_real_integral + (real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2)) + (real_interval[&0,B])` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR THEN - ASM_REWRITE_TAC[] THEN - EXPAND_TAC "Fa" THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + [MP_TAC(ISPECL + [`\x:real. &2 * real_integral (real_interval[&0,x]) + (\t. exp(--(t pow 2))) * exp(--(x pow 2))`; + `\x:real. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))`; + `real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2`; + `real_interval[&0,B]`] + HAS_REAL_INTEGRAL_EQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; + SIMP_TAC[]]; ALL_TAC] THEN - (* Step 6: integral value on [c,d] when c <= d *) + (* Step 4: h real_integrable *) SUBGOAL_THEN - `!c d. c <= d ==> - real_integral (real_interval[c,d]) - (\t. (f:real->real) t - b / a * (g:real->real) t) = - (Fa:real->real) d - Fa c` + `(\x. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) + real_integrable_on real_interval[&0,B]` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - ASM_SIMP_TAC[]; + [REWRITE_TAC[real_integrable_on] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + (* Step 5: G(B)^2 = real_integral[0,B] h *) + SUBGOAL_THEN + `real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2))) pow 2 = + real_integral (real_interval[&0,B]) + (\x. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2))))` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 7: (h has_real_integral 0) on (:real) *) - (* Use: Fa(t) -> 0 as |t| -> infinity, so integral -> 0 *) + (* Step 6: Convert to vector form *) + MP_TAC(MATCH_MP REAL_INTEGRAL (ASSUME + `(\x. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) + real_integrable_on real_interval[&0,B]`)) THEN + REWRITE_TAC[IMAGE_LIFT_REAL_INTERVAL] THEN + DISCH_TAC THEN + (* Step 7: lift o h o drop = vec inner form *) SUBGOAL_THEN - `((\t. (f:real->real) t - b / a * (g:real->real) t) - has_real_integral (&0)) (:real)` + `(lift o (\x. real_integral (real_interval[&0,&1]) + (\u. &2 * x * exp(--((&1 + u pow 2) * x pow 2)))) o drop) = + (\x:real^1. integral (interval[lift(&0),lift(&1)]) + (\u:real^1. lift(&2 * drop x * exp(--((&1 + drop u pow 2) * + drop x pow 2)))))` ASSUME_TAC THENL - [REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV; REAL_SUB_RZERO] THEN - CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - (* Use decay lemma: Fa -> 0 at infinity *) - MP_TAC(SPECL [`a:real`; `e / &2`] GAUSSIAN_EXP_DECAY) THEN - ASM_REWRITE_TAC[REAL_HALF] THEN - DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN - MAP_EVERY X_GEN_TAC [`c:real`; `d:real`] THEN DISCH_TAC THEN - SUBGOAL_THEN `c <= --B /\ B <= d` STRIP_ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_REAL_INTERVAL]) THEN - ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `c <= d:real` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ASM_SIMP_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH - `abs d < e / &2 /\ abs c < e / &2 ==> abs(d - c) < e`) THEN - CONJ_TAC THEN MATCH_MP_TAC REAL_LET_TRANS THENL - [EXISTS_TAC `inv(a) * exp(--(a * d pow 2 / &2))`; - EXISTS_TAC `inv(a) * exp(--(a * c pow 2 / &2))`] THEN - (CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC]) THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; + [REWRITE_TAC[FUN_EQ_THM; o_THM] THEN X_GEN_TAC `x:real^1` THEN + REWRITE_TAC[GSYM INNER_VEC_CONV; LIFT_DROP]; ALL_TAC] THEN - (* Conclude: real_integral f = b/a * real_integral g *) - ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_UNIQUE THEN - EXISTS_TAC `\t. (f:real->real) t - b / a * (g:real->real) t` THEN - EXISTS_TAC `(:real)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_SUB THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]]; - ASM_REWRITE_TAC[]]);; - -(* Differentiation under the integral for the Gaussian cosine integral. *) -(* Key step: Taylor bound |cos(x+h)-cos(x)+h*sin(x)| <= h^2 gives *) -(* |I(y)-I(b)-l*(y-b)| <= (y-b)^2 * C where C = integral t^2*exp(-at^2/2) *) -let GAUSSIAN_COS_INTEGRAL_HAS_DERIV = prove - (`!a b. &0 < a ==> - ((\b. real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))) - has_real_derivative - (--(real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))))) - (atreal b)`, - REPEAT STRIP_TAC THEN - ABBREV_TAC - `C = real_integral (:real) - (\t. t pow 2 * exp(--(a * t pow 2 / &2)))` THEN - (* C >= 0 *) - SUBGOAL_THEN `&0 <= C` ASSUME_TAC THENL - [EXPAND_TAC "C" THEN MATCH_MP_TAC REAL_INTEGRAL_POS THEN - ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE; IN_UNIV] THEN GEN_TAC THEN - MATCH_MP_TAC REAL_LE_MUL THEN - REWRITE_TAC[REAL_LE_POW_2; REAL_EXP_POS_LE]; + (* Step 8: Vector Fubini *) + SUBGOAL_THEN + `integral (interval[lift(&0),lift B]) + (\x:real^1. integral (interval[lift(&0),lift(&1)]) + (\u:real^1. lift(&2 * drop x * + exp(--((&1 + drop u pow 2) * drop x pow 2))))) = + integral (interval[lift(&0),lift(&1)]) + (\u:real^1. integral (interval[lift(&0),lift B]) + (\x:real^1. lift(&2 * drop x * + exp(--((&1 + drop u pow 2) * drop x pow 2)))))` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`\x u:real^1. lift(&2 * drop x * + exp(--((&1 + drop u pow 2) * drop x pow 2)))`; + `lift(&0):real^1`; `lift(B:real):real^1`; + `lift(&0):real^1`; `lift(&1):real^1`] + INTEGRAL_SWAP_CONTINUOUS) THEN + REWRITE_TAC[FSTCART_PASTECART; SNDCART_PASTECART] THEN + DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[GAUSS_2D_CONTINUOUS]; ALL_TAC] THEN - (* Key error bound: |I(y)-I(b)+(y-b)*integral(t*exp*sin)| <= (y-b)^2*C *) + (* Step 9: Chain everything *) + ASM_REWRITE_TAC[] THEN + (* Step 10: Use OUTER_VEC_CONV *) + REWRITE_TAC[OUTER_VEC_CONV] THEN + (* Step 11: inner x-integral = k(u) for u in [0,1] *) SUBGOAL_THEN - `!y. abs(real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - - real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + - (y - b) * real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))) - <= (y - b) pow 2 * C` + `!u:real^1. u IN interval[lift(&0), lift(&1)] ==> + real_integral (real_interval[&0,B]) + (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2))) = + inv(&1 + drop u pow 2) * (&1 - exp(--((&1 + drop u pow 2) * B pow 2)))` ASSUME_TAC THENL - [X_GEN_TAC `y:real` THEN - (* Establish integrability assumptions *) - SUBGOAL_THEN - `(\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - real_integrable_on (:real) /\ - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) - real_integrable_on (:real) /\ - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) - real_integrable_on (:real)` - STRIP_ASSUME_TAC THENL - [ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE; GAUSSIAN_T_SIN_INTEGRABLE]; - ALL_TAC] THEN - (* Express error as single integral *) - SUBGOAL_THEN - `real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - - real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + - (y - b) * real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = - real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * - (cos(y * t) - cos(b * t) + (y - b) * t * sin(b * t)))` - SUBST1_TAC THENL - [ASM_SIMP_TAC[GSYM REAL_INTEGRAL_SUB] THEN - SUBGOAL_THEN - `(y - b) * real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = - real_integral (:real) - (\t. (y - b) * (t * exp(--(a * t pow 2 / &2)) * sin(b * t)))` - SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_LMUL THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[GSYM REAL_INTEGRAL_ADD; REAL_INTEGRABLE_SUB; - REAL_INTEGRABLE_LMUL] THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN - GEN_TAC THEN CONV_TAC REAL_RING; - ALL_TAC] THEN - (* Bound via REAL_INTEGRAL_ABS_BOUND_INTEGRAL *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `real_integral (:real) - (\t. (y - b) pow 2 * - (t pow 2 * exp(--(a * t pow 2 / &2))))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_ABS_BOUND_INTEGRAL THEN - CONJ_TAC THENL - [(* Integrability of error integrand *) - SUBGOAL_THEN - `(\t. exp(--(a * t pow 2 / &2)) * - (cos(y * t) - cos(b * t) + (y - b) * t * sin(b * t))) = - (\t. (exp(--(a * t pow 2 / &2)) * cos(y * t) - - exp(--(a * t pow 2 / &2)) * cos(b * t)) + - (y - b) * (t * exp(--(a * t pow 2 / &2)) * sin(b * t)))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN CONV_TAC REAL_RING; - ALL_TAC] THEN - MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - CONJ_TAC THENL - [(* Integrability of bound function *) - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE]; - ALL_TAC] THEN - (* Pointwise bound *) - X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_UNIV] THEN - REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_EXP] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC - `exp(--(a * t pow 2 / &2)) * - ((y - b:real) pow 2 * t pow 2)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN - MP_TAC(SPECL [`b * t:real`; `(y - b) * t:real`] - COS_TAYLOR2_BOUND) THEN - REWRITE_TAC[GSYM REAL_ADD_RDISTRIB] THEN - REWRITE_TAC[REAL_ARITH `b + y - b:real = y`] THEN - REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC; - REAL_ARITH_TAC]; - (* Simplify bound integral to (y-b)^2 * C *) - EXPAND_TAC "C" THEN - ASM_SIMP_TAC[REAL_INTEGRAL_LMUL; GAUSSIAN_T2_INTEGRABLE] THEN - REAL_ARITH_TAC]; + [X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP] THEN + STRIP_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + MATCH_MP_TAC INNER_X_INTEGRAL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Convert to limit form *) - REWRITE_TAC[HAS_REAL_DERIVATIVE_ATREAL; REALLIM_ATREAL] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - EXISTS_TAC `e / (C + &1)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - X_GEN_TAC `y:real` THEN STRIP_TAC THEN - SUBGOAL_THEN `~(y - b = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - (* Rewrite: quotient - l = error / (y - b) *) + (* Step 12: k integrable on [0,1] *) + MP_TAC(SPEC `B:real` J_OUTER_INTEGRAND_INTEGRABLE) THEN + DISCH_TAC THEN SUBGOAL_THEN - `(real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - - real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))) / - (y - b) - - (--(real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)))) - = (real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - - real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + - (y - b) * real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))) / - (y - b)` - SUBST1_TAC THENL - [UNDISCH_TAC `~(y - b = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN - (* Apply bound: abs(error/(y-b)) <= abs(y-b)*C < e *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `abs(y - b) * C` THEN CONJ_TAC THENL - [(* abs(error/(y-b)) <= abs(y-b)*C *) - REWRITE_TAC[REAL_ABS_DIV] THEN - ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `(y - b:real) pow 2 * C` THEN CONJ_TAC THENL - [FIRST_X_ASSUM(MATCH_ACCEPT_TAC o SPEC `y:real`); - REWRITE_TAC[REAL_POW_2] THEN ASM_REAL_ARITH_TAC]; - (* abs(y-b)*C < e *) - MATCH_MP_TAC REAL_LTE_TRANS THEN - EXISTS_TAC `abs(y - b) * (C + &1)` THEN CONJ_TAC THENL - [ASM_SIMP_TAC[REAL_LT_LMUL; REAL_ARITH `C < C + &1`]; ALL_TAC] THEN - SUBGOAL_THEN `~(C + &1 = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `abs(y - b) * (C + &1) <= e / (C + &1) * (C + &1)` MP_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN - ASM_SIMP_TAC[REAL_LT_IMP_LE; - REAL_ARITH `&0 <= x ==> &0 <= x + &1`]; - ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LE_REFL]]] - );; - -(* GAUSSIAN_COS_INTEGRAL_HAS_DERIV_REAL: alternative proof sketch, not needed. - The proved GAUSSIAN_COS_INTEGRAL_HAS_DERIV (above) suffices. - Keeping a brief note instead of the full commented-out proof attempt. *) - -(* If x * e = c and e != 0, then x = c * inv(e) *) -let REAL_EQ_RDIV_CANCEL = prove - (`!(x:real) c e. ~(e = &0) /\ x * e = c ==> x = c * inv e`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN - ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_RINV; REAL_MUL_RID]);; - -(* Zero derivative on all reals means constant *) -let HAS_REAL_DERIVATIVE_ZERO_CONSTANT = prove - (`!f c (a:real). - f a = c /\ - (!x. (f has_real_derivative (&0)) (atreal x)) - ==> !x. f x = c`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - MP_TAC(SPECL [`f:real->real`; `(:real)`; `c:real`; `a:real`] - HAS_REAL_DERIVATIVE_ZERO_UNIQUE) THEN - REWRITE_TAC[IS_REALINTERVAL_UNIV; IN_UNIV] THEN - DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN - X_GEN_TAC `y:real` THEN - REWRITE_TAC[WITHINREAL_UNIV] THEN - ASM_REWRITE_TAC[]);; - -(* Gaussian Fourier Transform (cosine part) *) -(* Proof strategy: ODE approach. Show F(b) = I(b)*exp(b^2/(2a)) is constant *) -(* by proving I'(b) = -(b/a)*I(b) using Taylor error + IBP identity, *) -(* then MVT shows F is constant, and F(0) = sqrt(2pi/a). *) -let GAUSSIAN_FT = prove - (`!a b. &0 < a - ==> ((\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) has_real_integral - sqrt(&2 * pi / a) * exp(--(b pow 2 / (&2 * a)))) (:real)`, - REPEAT STRIP_TAC THEN - (* The function is integrable *) + `(\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) + real_integrable_on real_interval[&0,&1]` + ASSUME_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 13: Get (lift o k o drop) integrable *) SUBGOAL_THEN - `(\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) real_integrable_on (:real)` + `(lift o (\u. inv(&1 + u pow 2) * + (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) + integrable_on interval[lift(&0),lift(&1)]` ASSUME_TAC THENL - [ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE]; ALL_TAC] THEN - (* Suffices to show the integral value equals the RHS *) - SUBGOAL_THEN - `real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) = - sqrt(&2 * pi / a) * exp(--(b pow 2 / (&2 * a)))` - (fun th -> ASM_MESON_TAC[th; REAL_INTEGRABLE_INTEGRAL; - HAS_REAL_INTEGRAL_UNIQUE; HAS_REAL_INTEGRAL_INTEGRABLE_INTEGRAL]) THEN - (* Abbreviate I(b) *) - ABBREV_TAC `Ib = \u:real. real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(u * t))` THEN - SUBGOAL_THEN `real_integral (:real) - (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) = (Ib:real->real) b` - SUBST1_TAC THENL - [EXPAND_TAC "Ib" THEN REWRITE_TAC[]; ALL_TAC] THEN - (* Abbreviate F(b) *) - ABBREV_TAC `Fb = \u:real. (Ib:real->real) u * exp(u pow 2 / (&2 * a))` THEN - (* Step 1: Ib(0) = sqrt(2pi/a) *) - SUBGOAL_THEN `(Ib:real->real) (&0) = sqrt(&2 * pi / a)` ASSUME_TAC THENL - [EXPAND_TAC "Ib" THEN - REWRITE_TAC[REAL_MUL_LZERO; COS_0; REAL_MUL_RID] THEN - ASM_MESON_TAC[REAL_INTEGRAL_UNIQUE; GAUSSIAN_INTEGRAL_SCALED]; ALL_TAC] THEN - (* Step 2: Fb(0) = sqrt(2pi/a) *) - SUBGOAL_THEN `(Fb:real->real) (&0) = sqrt(&2 * pi / a)` ASSUME_TAC THENL - [EXPAND_TAC "Fb" THEN - REWRITE_TAC[REAL_POW_ZERO; ARITH; REAL_MUL_LZERO; real_div; - REAL_MUL_LZERO; REAL_EXP_0; REAL_MUL_RID] THEN - REWRITE_TAC[GSYM real_div] THEN - ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 3: Fb has derivative 0 everywhere *) + [MP_TAC(SPEC `B:real` J_OUTER_INTEGRAND_INTEGRABLE) THEN + REWRITE_TAC[real_integrable_on; has_real_integral; + IMAGE_LIFT_REAL_INTERVAL; integrable_on] THEN + MESON_TAC[]; + ALL_TAC] THEN + (* Get has_integral for (lift o k o drop) *) + MP_TAC(MATCH_MP INTEGRABLE_INTEGRAL (ASSUME + `(lift o (\u. inv(&1 + u pow 2) * + (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) + integrable_on interval[lift(&0),lift(&1)]`)) THEN + DISCH_TAC THEN + (* Pointwise equality on [0,1] *) SUBGOAL_THEN - `!x:real. ((Fb:real->real) has_real_derivative (&0)) (atreal x)` + `!u:real^1. u IN interval[lift(&0),lift(&1)] ==> + (lift o (\u. inv(&1 + u pow 2) * + (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop) u = + lift(real_integral (real_interval[&0,B]) + (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2))))` ASSUME_TAC THENL - [X_GEN_TAC `u:real` THEN EXPAND_TAC "Fb" THEN - (* Step 3a-0: IBP identity *) - SUBGOAL_THEN - `real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(u * t)) = - u / a * (Ib:real->real) u` ASSUME_TAC THENL - [ASM_SIMP_TAC[GAUSSIAN_FT_IBP] THEN - EXPAND_TAC "Ib" THEN REWRITE_TAC[]; - ALL_TAC] THEN - (* Step 3a-i: derivative of Ib via differentiation under integral *) - SUBGOAL_THEN - `((Ib:real->real) has_real_derivative - (--real_integral (:real) - (\t. t * exp(--(a * t pow 2 / &2)) * sin(u * t)))) - (atreal u)` ASSUME_TAC THENL - [EXPAND_TAC "Ib" THEN ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRAL_HAS_DERIV]; - ALL_TAC] THEN - (* Step 3a-i': combine: Ib' = -(u/a * Ib u) *) - SUBGOAL_THEN - `((Ib:real->real) has_real_derivative - (--(u / a * (Ib:real->real) u))) (atreal u)` ASSUME_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - (* Step 3a-ii: derivative of exp(u^2/(2a)) at u *) - SUBGOAL_THEN - `((\u:real. exp(u pow 2 / (&2 * a))) has_real_derivative - (u / a * exp(u pow 2 / (&2 * a)))) (atreal u)` ASSUME_TAC THENL - [REAL_DIFF_TAC THEN - UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD; - ALL_TAC] THEN - (* Step 3a-iii: product rule + cancellation *) - SUBGOAL_THEN - `&0 = (Ib:real->real) u * (u / a * exp(u pow 2 / (&2 * a))) + - (--(u / a * (Ib:real->real) u)) * exp(u pow 2 / (&2 * a))` - SUBST1_TAC THENL - [CONV_TAC REAL_RING; ALL_TAC] THEN - MATCH_MP_TAC HAS_REAL_DERIVATIVE_MUL_ATREAL THEN - ASM_REWRITE_TAC[]; + [X_GEN_TAC `u:real^1` THEN REWRITE_TAC[IN_INTERVAL_1; LIFT_DROP] THEN + STRIP_TAC THEN REWRITE_TAC[o_THM; LIFT_DROP] THEN + AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + MATCH_MP_TAC INNER_X_INTEGRAL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 3b: Fb is constant *) - SUBGOAL_THEN `!x:real. (Fb:real->real) x = Fb (&0)` ASSUME_TAC THENL - [ASM_MESON_TAC[HAS_REAL_DERIVATIVE_ZERO_CONSTANT]; ALL_TAC] THEN - (* Step 4: derive Ib(b) = sqrt(2pi/a) * exp(-b^2/(2a)) *) - (* Rewrite exp(--x) = inv(exp x) so MATCH_MP_TAC can find e *) - REWRITE_TAC[REAL_EXP_NEG] THEN - MATCH_MP_TAC REAL_EQ_RDIV_CANCEL THEN - CONJ_TAC THENL - [REWRITE_TAC[REAL_EXP_NZ]; ALL_TAC] THEN - (* Goal: Ib b * exp(b^2/(2a)) = sqrt(2pi/a) *) - (* This is Fb(b) which equals Fb(0) = sqrt(2pi/a) *) - SUBGOAL_THEN `(Ib:real->real) b * exp(b pow 2 / (&2 * a)) = (Fb:real->real) b` - SUBST1_TAC THENL - [EXPAND_TAC "Fb" THEN REWRITE_TAC[]; ALL_TAC] THEN - ASM_MESON_TAC[]);; - -(* Gaussian Fourier Transform (sine part = 0 by odd symmetry) *) + (* Use HAS_INTEGRAL_EQ to transfer *) + MP_TAC(ISPECL + [`(lift o (\u. inv(&1 + u pow 2) * + (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop)`; + `(\u:real^1. lift(real_integral (real_interval[&0,B]) + (\x. &2 * x * exp(--((&1 + drop u pow 2) * x pow 2)))))`; + `integral (interval[lift(&0),lift(&1)]) + (lift o (\u. inv(&1 + u pow 2) * + (&1 - exp(--((&1 + u pow 2) * B pow 2)))) o drop)`; + `interval[lift(&0),lift(&1)]`] + HAS_INTEGRAL_EQ) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[MATCH_MP INTEGRAL_UNIQUE th]) THEN + (* Step 14: Convert back to real_integral *) + MP_TAC(MATCH_MP REAL_INTEGRAL (ASSUME + `(\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))) + real_integrable_on real_interval[&0,&1]`)) THEN + REWRITE_TAC[IMAGE_LIFT_REAL_INTERVAL] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]));; -let GAUSSIAN_FT_SIN = prove - (`!a b. &0 < a - ==> ((\t. exp(--(a * t pow 2 / &2)) * sin(b * t)) has_real_integral - &0) (:real)`, +(* H_PLUS_J: core identity proved from J_EQUALS_OUTER + ARCTAN_INTEGRAL *) +let H_PLUS_J = prove + (`!B. &0 < B + ==> real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) + + real_integral (real_interval[&0,B]) + (\x. exp(--(x pow 2))) pow 2 = pi / &4`, REPEAT STRIP_TAC THEN - ABBREV_TAC `f = \t:real. exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN - (* f is integrable: measurable + bounded by integrable Gaussian *) - SUBGOAL_THEN `f real_integrable_on (:real)` ASSUME_TAC THENL - [EXPAND_TAC "f" THEN - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2))` THEN REPEAT CONJ_TAC THENL - [(* measurable: differentiable => continuous => measurable *) - MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; - (* majorant is integrable *) - REWRITE_TAC[real_integrable_on] THEN - EXISTS_TAC `sqrt(&2 * pi / a)` THEN - ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; - (* pointwise bound: |f(t)| <= exp(-at^2/2) *) - GEN_TAC THEN REWRITE_TAC[IN_UNIV; REAL_ABS_MUL] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `exp(--(a * x pow 2 / &2)) * &1` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_MUL2 THEN - REWRITE_TAC[REAL_ABS_POS; SIN_BOUND] THEN - REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`; REAL_EXP_POS_LE]; - REWRITE_TAC[REAL_MUL_RID; REAL_LE_REFL]]]; - ALL_TAC] THEN - (* f has_real_integral (real_integral R f) *) - SUBGOAL_THEN `(f has_real_integral real_integral (:real) f) (:real)` - ASSUME_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* f is odd: f(-t) = -f(t) *) - SUBGOAL_THEN `!t:real. (f:real->real)(--t) = --(f t)` ASSUME_TAC THENL - [EXPAND_TAC "f" THEN GEN_TAC THEN - REWRITE_TAC[REAL_POW_NEG; ARITH; SIN_NEG; REAL_MUL_RNEG]; ALL_TAC] THEN - (* By reflection + oddness: (\t. -f(t)) has_real_integral I *) - SUBGOAL_THEN `((\t:real. --((f:real->real) t)) has_real_integral - real_integral (:real) f) (:real)` ASSUME_TAC THENL - [MP_TAC(ISPECL [`f:real->real`; `real_integral (:real) (f:real->real)`; - `(:real)`] HAS_REAL_INTEGRAL_REFLECT_GEN) THEN - SUBGOAL_THEN `IMAGE ((--):real->real) (:real) = (:real)` (fun th -> - REWRITE_TAC[th]) THENL - [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN GEN_TAC THEN - EXISTS_TAC `--x:real` THEN REWRITE_TAC[REAL_NEG_NEG]; ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN MESON_TAC[]; ALL_TAC] THEN - (* By negation: (\t. -f(t)) has_real_integral (-I) *) - SUBGOAL_THEN `((\t:real. --((f:real->real) t)) has_real_integral - --(real_integral (:real) f)) (:real)` ASSUME_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_NEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* I = -I => I = 0, then f has_real_integral 0 *) - SUBGOAL_THEN `real_integral (:real) f = &0` ASSUME_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `x = --x ==> x = &0`) THEN - ASM_MESON_TAC[HAS_REAL_INTEGRAL_UNIQUE]; ALL_TAC] THEN - ASM_MESON_TAC[REAL_INTEGRABLE_INTEGRAL]);; + FIRST_ASSUM(SUBST1_TAC o MATCH_MP J_EQUALS_OUTER) THEN + MP_TAC(ISPECL + [`\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)`; + `\u. inv(&1 + u pow 2) * (&1 - exp(--((&1 + u pow 2) * B pow 2)))`; + `real_interval[&0,&1]`] + REAL_INTEGRAL_ADD) THEN + REWRITE_TAC[H_INTEGRAND_INTEGRABLE; J_OUTER_INTEGRAND_INTEGRABLE] THEN + DISCH_THEN(SUBST1_TAC o GSYM) THEN + SUBGOAL_THEN + `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2) + + inv(&1 + t pow 2) * (&1 - exp(--((&1 + t pow 2) * B pow 2)))) = + (\t. inv(&1 + t pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; INTEGRAND_SUM_EQ_INV]; ALL_TAC] THEN + MP_TAC ARCTAN_INTEGRAL THEN + DISCH_THEN(fun th -> REWRITE_TAC[MATCH_MP REAL_INTEGRAL_UNIQUE th]));; -(* --- Phase 2: Standard Normal Distribution --- *) +(* Helper lemmas for convergence *) +let IB_NONNEG = prove + (`!B. &0 <= B ==> + &0 <= real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2)))`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_INTEGRAL_POS THEN + REWRITE_TAC[EXP_NEG_X2_INTEGRABLE] THEN + X_GEN_TAC `x:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + REWRITE_TAC[REAL_EXP_POS_LT]);; -let std_normal_density = new_definition - `std_normal_density (x:real) = - inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2))`;; +let IB_SQ_EQ = prove + (`!B. &0 < B ==> + real_integral (real_interval[&0,B]) + (\x. exp(--(x pow 2))) pow 2 = + pi / &4 - + real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))`, + REPEAT STRIP_TAC THEN + MP_TAC(SPEC `B:real` H_PLUS_J) THEN + ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC);; -let std_normal_cdf = new_definition - `std_normal_cdf (x:real) = - real_integral {t | t <= x} std_normal_density`;; - -(* Density is strictly positive *) -let STD_NORMAL_DENSITY_POS = prove - (`!x. &0 < std_normal_density x`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC SQRT_POS_LT THEN - MP_TAC PI_POS THEN REAL_ARITH_TAC; - REWRITE_TAC[REAL_EXP_POS_LT]]);; - -(* Density is non-negative *) -let STD_NORMAL_DENSITY_NONNEG = prove - (`!x. &0 <= std_normal_density x`, - GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN - REWRITE_TAC[STD_NORMAL_DENSITY_POS]);; - -(* Density integrates to 1 *) -let STD_NORMAL_DENSITY_INTEGRAL = prove - (`(std_normal_density has_real_integral &1) (:real)`, - (* Step 1: Unfold std_normal_density to its lambda definition *) - SUBGOAL_THEN `std_normal_density = - (\x. inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2)))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; std_normal_density]; ALL_TAC] THEN - (* Step 2: Establish inv(sqrt(2*pi)) * sqrt(2*pi) = 1 *) - SUBGOAL_THEN `inv(sqrt(&2 * pi)) * sqrt(&2 * pi) = &1` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_MUL_LINV THEN - MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN - MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* Step 3: Get Gaussian integral for a=1 *) - MP_TAC(SPEC `&1` GAUSSIAN_INTEGRAL_SCALED) THEN - REWRITE_TAC[REAL_LT_01; REAL_MUL_LID; REAL_DIV_1] THEN - (* Step 4: Apply HAS_REAL_INTEGRAL_LMUL via forward reasoning *) - DISCH_THEN(fun th -> - MP_TAC(SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN - REWRITE_TAC[] THEN - ASM_REWRITE_TAC[]);; - -(* Density is integrable on all of R *) -let STD_NORMAL_DENSITY_INTEGRABLE = prove - (`std_normal_density real_integrable_on (:real)`, - MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]);; - -(* Density is integrable on any half-line {t | t <= x} *) -let STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE = prove - (`!x. std_normal_density real_integrable_on {t | t <= x}`, +let HB_NONNEG = prove + (`!B. &0 <= + real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))`, GEN_TAC THEN - MP_TAC(ISPECL [`std_normal_density`; `(:real)`; `{t:real | t <= x}`] - REAL_INTEGRABLE_ON_SUBINTERVAL_GEN) THEN - REWRITE_TAC[SUBSET_UNIV; IS_REALINTERVAL_CLAUSES; - STD_NORMAL_DENSITY_INTEGRABLE]);; - -(* CDF is monotone non-decreasing *) -let STD_NORMAL_CDF_MONO = prove - (`!x y. x <= y ==> std_normal_cdf x <= std_normal_cdf y`, - REPEAT STRIP_TAC THEN REWRITE_TAC[std_normal_cdf] THEN - MATCH_MP_TAC REAL_INTEGRAL_SUBSET_LE THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE; - IN_ELIM_THM; STD_NORMAL_DENSITY_NONNEG] THEN - REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_REAL_ARITH_TAC);; - -(* CDF is bounded between 0 and 1 *) -let STD_NORMAL_CDF_BOUNDS = prove - (`!x. &0 <= std_normal_cdf x /\ std_normal_cdf x <= &1`, - GEN_TAC THEN REWRITE_TAC[std_normal_cdf] THEN CONJ_TAC THENL - [(* Lower bound: 0 <= integral *) - MATCH_MP_TAC REAL_INTEGRAL_POS THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE; - IN_ELIM_THM; STD_NORMAL_DENSITY_NONNEG]; - (* Upper bound: integral <= 1 *) - MP_TAC(ISPECL [`std_normal_density`; `{t:real | t <= x}`; - `(:real)`; - `real_integral {t:real | t <= x} std_normal_density`; - `&1`] HAS_REAL_INTEGRAL_SUBSET_LE) THEN - REWRITE_TAC[SUBSET_UNIV; STD_NORMAL_DENSITY_INTEGRAL; - IN_UNIV; STD_NORMAL_DENSITY_NONNEG] THEN - DISCH_THEN MATCH_MP_TAC THEN - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]]);; + SUBGOAL_THEN + `(\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2)) + real_integrable_on real_interval[&0,&1]` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_NZ THEN + MP_TAC(SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_INTEGRAL_POS THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + STRIP_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; + MATCH_MP_TAC REAL_LE_INV THEN + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]);; -(* Density is bounded above *) -let STD_NORMAL_DENSITY_BOUND = prove - (`!x. std_normal_density x <= inv(sqrt(&2 * pi))`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_INV THEN MATCH_MP_TAC SQRT_POS_LE THEN - MP_TAC PI_POS THEN REAL_ARITH_TAC; - GEN_REWRITE_TAC RAND_CONV [GSYM REAL_EXP_0] THEN - REWRITE_TAC[REAL_EXP_MONO_LE] THEN - REWRITE_TAC[REAL_NEG_LE0] THEN - MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS] THEN - REWRITE_TAC[REAL_LE_POW_2]]);; +let SQRT_PI_HALF_SQ = prove + (`(sqrt(pi) / &2) pow 2 = pi / &4`, + SUBGOAL_THEN `sqrt(pi) pow 2 = pi` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN + MP_TAC PI_POS THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_DIV] THEN + ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN + REAL_ARITH_TAC);; -(* CDF splitting: integral from x to y *) -let STD_NORMAL_CDF_INTERVAL = prove - (`!x y. x <= y ==> - std_normal_cdf y = - std_normal_cdf x + real_integral (real_interval[x,y]) std_normal_density`, - REPEAT STRIP_TAC THEN REWRITE_TAC[std_normal_cdf] THEN - SUBGOAL_THEN `(std_normal_density has_real_integral - real_integral {t:real | t <= y} std_normal_density) {t | t <= y}` +(* Main convergence: I(B) --> sqrt(pi)/2 *) +let HALF_GAUSSIAN_CONVERGES = prove + (`((\B. real_integral (real_interval[&0,B]) + (\x. exp(--(x pow 2)))) ---> sqrt(pi) / &2) at_posinfinity`, + REWRITE_TAC[REALLIM_AT_POSINFINITY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 < sqrt(pi) / &2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; ALL_TAC] THEN + MP_TAC(SPEC `e * sqrt(pi) / &2` + (REWRITE_RULE[REALLIM_AT_POSINFINITY] H_LIMIT_ZERO)) THEN + ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `N:real` ASSUME_TAC) THEN + EXISTS_TAC `max (&1) N` THEN + X_GEN_TAC `B:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 < B` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `B >= N` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ABBREV_TAC + `I_B = real_integral (real_interval[&0,B]) (\x. exp(--(x pow 2)))` THEN + ABBREV_TAC + `H_B = real_integral (real_interval[&0,&1]) + (\t. exp(--(B pow 2 * (&1 + t pow 2))) * inv(&1 + t pow 2))` THEN + SUBGOAL_THEN `&0 <= I_B` ASSUME_TAC THENL + [EXPAND_TAC "I_B" THEN MATCH_MP_TAC IB_NONNEG THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `I_B pow 2 = pi / &4 - H_B` ASSUME_TAC THENL + [EXPAND_TAC "I_B" THEN EXPAND_TAC "H_B" THEN + MATCH_MP_TAC IB_SQ_EQ THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= H_B` ASSUME_TAC THENL + [EXPAND_TAC "H_B" THEN REWRITE_TAC[HB_NONNEG]; ALL_TAC] THEN + SUBGOAL_THEN `abs(H_B - &0) < e * sqrt(pi) / &2` ASSUME_TAC THENL + [EXPAND_TAC "H_B" THEN + FIRST_X_ASSUM(MP_TAC o SPEC `B:real`) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `H_B < e * sqrt(pi) / &2` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(sqrt(pi) / &2) pow 2 = pi / &4` ASSUME_TAC THENL + [REWRITE_TAC[SQRT_PI_HALF_SQ]; ALL_TAC] THEN + SUBGOAL_THEN + `(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = --H_B` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; ALL_TAC] THEN - SUBGOAL_THEN `(std_normal_density has_real_integral - (real_integral {t:real | t <= x} std_normal_density + - real_integral (real_interval[x,y]) std_normal_density)) {t | t <= y}` + [SUBGOAL_THEN + `(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = + I_B pow 2 - (sqrt(pi) / &2) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `sqrt(pi) / &2 <= I_B + sqrt(pi) / &2` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < I_B + sqrt(pi) / &2` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `I_B - sqrt(pi) / &2 <= &0` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `~(&0 < x) ==> x <= &0`) THEN + DISCH_TAC THEN + SUBGOAL_THEN + `&0 < (I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2)` MP_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `abs(I_B - sqrt(pi) / &2) = sqrt(pi) / &2 - I_B` ASSUME_TAC THENL - [SUBGOAL_THEN `{t:real | t <= y} = {t | t <= x} UNION real_interval[x,y]` + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2) = H_B` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(sqrt(pi) / &2 - I_B) * (I_B + sqrt(pi) / &2) = + (sqrt(pi) / &2) pow 2 - I_B pow 2` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM; IN_REAL_INTERVAL] THEN - GEN_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_UNION THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; ALL_TAC] THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN - EXISTS_TAC `(:real)` THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; ALL_TAC] THEN - MATCH_MP_TAC REAL_NEGLIGIBLE_SUBSET THEN EXISTS_TAC `{x:real}` THEN - REWRITE_TAC[REAL_NEGLIGIBLE_SING; SUBSET; IN_INTER; IN_SING; - IN_ELIM_THM; IN_REAL_INTERVAL] THEN - REAL_ARITH_TAC; ALL_TAC] THEN - ASM_MESON_TAC[HAS_REAL_INTEGRAL_UNIQUE]);; + [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `abs(I_B - sqrt(pi) / &2) * (sqrt(pi) / &2) <= + abs(I_B - sqrt(pi) / &2) * (I_B + sqrt(pi) / &2)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `abs(I_B - sqrt(pi) / &2) * (sqrt(pi) / &2) < e * sqrt(pi) / &2` + ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_RCANCEL_IMP THEN + EXISTS_TAC `sqrt(pi) / &2` THEN ASM_REWRITE_TAC[]);; -(* CDF is continuous *) -let STD_NORMAL_CDF_CONTINUOUS = prove - (`!x. std_normal_cdf real_continuous atreal x`, - GEN_TAC THEN REWRITE_TAC[real_continuous_atreal] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&0 < sqrt(&2 * pi)` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LT THEN - MATCH_MP_TAC REAL_LT_MUL THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN - REWRITE_TAC[PI_POS]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < inv(sqrt(&2 * pi))` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - EXISTS_TAC `e * sqrt(&2 * pi)` THEN +(* Final assembly: GAUSSIAN_INTEGRAL *) +let GAUSSIAN_INTEGRAL = prove + (`((\x. exp(--(x pow 2))) has_real_integral sqrt pi) (:real)`, + REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV] THEN + CONV_TAC(ONCE_DEPTH_CONV COND_ELIM_CONV) THEN REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - X_GEN_TAC `y:real` THEN DISCH_TAC THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `inv(sqrt(&2 * pi)) * abs(y - x)` THEN - CONJ_TAC THENL - [(* Lipschitz bound: |F(y) - F(x)| <= inv(sqrt(2pi)) * |y - x| *) - DISJ_CASES_TAC(REAL_ARITH `x <= y \/ y <= x:real`) THENL - [(* Case x <= y *) - SUBGOAL_THEN `abs(std_normal_cdf y - std_normal_cdf x) = - abs(real_integral (real_interval[x,y]) std_normal_density)` SUBST1_TAC THENL - [MP_TAC(SPECL [`x:real`; `y:real`] STD_NORMAL_CDF_INTERVAL) THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `inv(sqrt(&2 * pi)) * abs(y - x) = - inv(sqrt(&2 * pi)) * (y - x)` SUBST1_TAC THENL - [AP_TERM_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC(ISPEC `std_normal_density` HAS_REAL_INTEGRAL_BOUND) THEN - ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN - EXISTS_TAC `(:real)` THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; - GEN_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN DISCH_TAC THEN - MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_NONNEG) THEN - MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_BOUND) THEN REAL_ARITH_TAC]; - (* Case y <= x *) - SUBGOAL_THEN `abs(std_normal_cdf y - std_normal_cdf x) = - abs(real_integral (real_interval[y,x]) std_normal_density)` SUBST1_TAC THENL - [MP_TAC(SPECL [`y:real`; `x:real`] STD_NORMAL_CDF_INTERVAL) THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `inv(sqrt(&2 * pi)) * abs(y - x) = - inv(sqrt(&2 * pi)) * (x - y)` SUBST1_TAC THENL - [AP_TERM_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC(ISPEC `std_normal_density` HAS_REAL_INTEGRAL_BOUND) THEN - ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN - EXISTS_TAC `(:real)` THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; - GEN_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN DISCH_TAC THEN - MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_NONNEG) THEN - MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_BOUND) THEN REAL_ARITH_TAC]]; - (* inv(sqrt(2pi)) * |y-x| < e *) - SUBGOAL_THEN `inv(sqrt(&2 * pi)) * (e * sqrt(&2 * pi)) = e` - (fun th -> ONCE_REWRITE_TAC[GSYM th]) THENL - [SUBGOAL_THEN `~(sqrt(&2 * pi) = &0)` MP_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN - ASM_REWRITE_TAC[]; ALL_TAC] THEN - CONV_TAC REAL_FIELD; ALL_TAC] THEN - MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[]]);; - -(* Density symmetry *) -let STD_NORMAL_DENSITY_SYM = prove - (`!x. std_normal_density(--x) = std_normal_density x`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN - REWRITE_TAC[REAL_POW_NEG; ARITH] THEN REAL_ARITH_TAC);; - -(* Density is integrable on the upper halfline *) -let STD_NORMAL_DENSITY_INTEGRABLE_UPPER_HALFLINE = prove - (`std_normal_density real_integrable_on {t | &0 <= t}`, - MP_TAC(ISPECL [`std_normal_density`; `(:real)`; `{t:real | &0 <= t}`] - REAL_INTEGRABLE_ON_SUBINTERVAL_GEN) THEN - REWRITE_TAC[SUBSET_UNIV; STD_NORMAL_DENSITY_INTEGRABLE] THEN - DISCH_THEN MATCH_MP_TAC THEN - REWRITE_TAC[is_realinterval; IN_ELIM_THM] THEN REAL_ARITH_TAC);; - -(* --- Phase 3: CLT Bridge --- *) - -(* The characteristic function of the standard normal distribution - is exp(-t^2/2). This connects GAUSSIAN_FT to the CLT. *) - -(* Helper: inv(sqrt(2*pi)) * sqrt(2*pi) = 1 *) -let SQRT_2PI_INV = prove - (`inv(sqrt(&2 * pi)) * sqrt(&2 * pi) = &1`, - MATCH_MP_TAC REAL_MUL_LINV THEN - MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN - MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC);; - -(* Cancellation respecting right-association of * *) -let SQRT_2PI_CANCEL = prove - (`!x:real. inv(sqrt(&2 * pi)) * sqrt(&2 * pi) * x = x`, - GEN_TAC THEN REWRITE_TAC[REAL_MUL_ASSOC; SQRT_2PI_INV; REAL_MUL_LID]);; - -(* Real part: integral of std_normal_density * cos(t*x) *) -let STD_NORMAL_CHAR_FN_RE = prove - (`!t. ((\x. std_normal_density x * cos(t * x)) has_real_integral - exp(--(t pow 2 / &2))) (:real)`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - REWRITE_TAC[REAL_ARITH `(a * b) * c:real = a * (b * c)`] THEN - MP_TAC(REWRITE_RULE[REAL_MUL_LID; REAL_DIV_1; - REAL_ARITH `&2 * &1:real = &2`] - (MP (SPECL [`&1`; `t:real`] GAUSSIAN_FT) REAL_LT_01)) THEN - DISCH_THEN(fun th -> - ACCEPT_TAC(REWRITE_RULE[SQRT_2PI_CANCEL] - (BETA_RULE - (SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))))));; - -(* Imaginary part: integral of std_normal_density * sin(t*x) = 0 *) -let STD_NORMAL_CHAR_FN_IM = prove - (`!t. ((\x. std_normal_density x * sin(t * x)) has_real_integral - &0) (:real)`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - REWRITE_TAC[REAL_ARITH `(a * b) * c:real = a * (b * c)`] THEN - MP_TAC(REWRITE_RULE[REAL_MUL_LID; REAL_DIV_1] - (MP (SPECL [`&1`; `t:real`] GAUSSIAN_FT_SIN) REAL_LT_01)) THEN - DISCH_THEN(fun th -> - ACCEPT_TAC(REWRITE_RULE[REAL_MUL_RZERO] - (BETA_RULE - (SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))))));; - - -(* --- Helper lemmas for mean zero proof --- *) - -(* |x| <= exp(x^2/4): from AM-GM (|x| <= 1 + x^2/4) and 1+y <= exp(y) *) -let ABS_LE_EXP_QUARTER = prove - (`!x:real. abs(x) <= exp(x pow 2 / &4)`, - GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `&1 + x pow 2 / &4` THEN CONJ_TAC THENL - [SUBGOAL_THEN `&0 <= (x / &2 - &1) pow 2 /\ &0 <= (x / &2 + &1) pow 2` - MP_TAC THENL - [REWRITE_TAC[REAL_LE_POW_2]; REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC]; - REWRITE_TAC[REAL_EXP_LE_X]]);; - -(* |x * exp(-x^2/2)| <= exp(-x^2/4) *) -let ABS_X_GAUSSIAN_BOUND = prove - (`!x:real. abs(x * exp(--(x pow 2 / &2))) <= exp(--(x pow 2 / &4))`, - GEN_TAC THEN REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs(exp(--(x pow 2 / &2))) = exp(--(x pow 2 / &2))` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL] THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; + [REPEAT GEN_TAC THEN REWRITE_TAC[ETA_AX; EXP_NEG_X2_INTEGRABLE]; ALL_TAC] THEN - SUBGOAL_THEN `exp(--(x pow 2 / &4)) = - exp(x pow 2 / &4) * exp(--(x pow 2 / &2))` - SUBST1_TAC THENL - [REWRITE_TAC[GSYM REAL_EXP_ADD] THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e / &2` + (REWRITE_RULE[REALLIM_AT_POSINFINITY] HALF_GAUSSIAN_CONVERGES)) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `N:real` ASSUME_TAC) THEN + EXISTS_TAC `max (&1) N` THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN DISCH_TAC THEN + SUBGOAL_THEN `a <= --(max (&1) N) /\ max (&1) N <= b` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC) THEN + REWRITE_TAC[SUBSET_REAL_INTERVAL] THEN REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [REWRITE_TAC[ABS_LE_EXP_QUARTER]; - MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]]);; - -(* exp(-x^2/4) is integrable on (:real), from GAUSSIAN_INTEGRAL_SCALED *) -let GAUSSIAN_QUARTER_INTEGRABLE = prove - (`(\t. exp(--(t pow 2 / &4))) real_integrable_on (:real)`, - MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `sqrt(&2 * pi / (&1 / &2))` THEN - MP_TAC(SPEC `&1 / &2` GAUSSIAN_INTEGRAL_SCALED) THEN - CONV_TAC REAL_RAT_REDUCE_CONV THEN - REWRITE_TAC[REAL_ARITH `&1 / &2 * t pow 2 / &2 = t pow 2 / &4`]);; - -(* x * exp(-x^2/2) is integrable on (:real), by domination *) -let X_GAUSSIAN_INTEGRABLE = prove - (`(\x. x * exp(--(x pow 2 / &2))) real_integrable_on (:real)`, - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\t. exp(--(t pow 2 / &4))` THEN - REWRITE_TAC[GAUSSIAN_QUARTER_INTEGRABLE; IN_UNIV; - ABS_X_GAUSSIAN_BOUND] THEN - MATCH_MP_TAC INTEGRABLE_SUBINTERVALS_IMP_REAL_MEASURABLE THEN - REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; - -(* IMAGE (--) (:real) = (:real) *) -let IMAGE_NEG_UNIV_REAL = prove - (`IMAGE (--) (:real) = (:real)`, - REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN - GEN_TAC THEN EXISTS_TAC `--x:real` THEN REWRITE_TAC[REAL_NEG_NEG]);; - -(* Mean of standard normal is 0 - Proof: x*density(x) is odd (by STD_NORMAL_DENSITY_SYM), integrable - (by domination with exp(-x^2/4)), so its integral k satisfies - k = --k by reflection, hence k = 0. *) -let STD_NORMAL_MEAN_ZERO = prove - (`((\x. x * std_normal_density x) has_real_integral &0) (:real)`, - SUBGOAL_THEN `(\x. x * std_normal_density x) real_integrable_on (:real)` - ASSUME_TAC THENL - [SUBGOAL_THEN `(\x. x * std_normal_density x) = - (\x. inv(sqrt(&2 * pi)) * (x * exp(--(x pow 2 / &2))))` + SUBGOAL_THEN `&0 < b` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a < &0` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a <= b:real` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_UNIV] THEN + SUBGOAL_THEN + `real_integral (real_interval[a,b]) (\x. exp(--(x pow 2))) = + real_integral (real_interval[a,&0]) (\x. exp(--(x pow 2))) + + real_integral (real_interval[&0,b]) (\x. exp(--(x pow 2)))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; std_normal_density] THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN REWRITE_TAC[X_GAUSSIAN_INTEGRABLE]]; + [CONV_TAC SYM_CONV THEN + MATCH_MP_TAC REAL_INTEGRAL_COMBINE THEN + ASM_REWRITE_TAC[EXP_NEG_X2_INTEGRABLE] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - FIRST_ASSUM(MP_TAC o MATCH_MP REAL_INTEGRABLE_INTEGRAL) THEN - ABBREV_TAC `k = real_integral (:real) (\x. x * std_normal_density x)` THEN - DISCH_TAC THEN SUBGOAL_THEN - `((\x. --(x * std_normal_density x)) has_real_integral k) (:real)` - ASSUME_TAC THENL - [SUBGOAL_THEN - `(\x. --(x * std_normal_density x)) = - (\x. (--x) * std_normal_density(--x))` + `real_integral (real_interval[a,&0]) (\x. exp(--(x pow 2))) = + real_integral (real_interval[&0,--a]) (\x. exp(--(x pow 2)))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; STD_NORMAL_DENSITY_SYM] THEN REAL_ARITH_TAC; + [MP_TAC(ISPECL [`\x:real. exp(--(x pow 2))`; + `real_interval[&0,--a]`] + REAL_INTEGRAL_REFLECT_GEN) THEN + SIMP_TAC[] THEN + SUBGOAL_THEN `(!x:real. exp(--((--x) pow 2)) = exp(--(x pow 2)))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[REAL_POW_NEG; ARITH] THEN REAL_ARITH_TAC; ALL_TAC] THEN - MP_TAC(ISPECL [`\x:real. x * std_normal_density x`; `k:real`; `(:real)`] - HAS_REAL_INTEGRAL_REFLECT_GEN) THEN - REWRITE_TAC[IMAGE_NEG_UNIV_REAL] THEN - DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN - ASM_REWRITE_TAC[]; + SUBGOAL_THEN `IMAGE (--) (real_interval[&0,--a]) = real_interval[a,&0]` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_REAL_INTERVAL] THEN + X_GEN_TAC `y:real` THEN EQ_TAC THENL + [STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + STRIP_TAC THEN EXISTS_TAC `--y:real` THEN ASM_REAL_ARITH_TAC]; + SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `--a >= N` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `b >= N` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN SUBGOAL_THEN - `((\x. --(x * std_normal_density x)) has_real_integral (--k)) (:real)` + `abs(real_integral (real_interval[&0,--a]) + (\x. exp(--(x pow 2))) - sqrt(pi) / &2) < e / &2` ASSUME_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_NEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `k:real = &0` SUBST_ALL_TAC THENL - [SUBGOAL_THEN `k:real = --k` MP_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_UNIQUE THEN - EXISTS_TAC `\x:real. --(x * std_normal_density x)` THEN - EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[]; - REAL_ARITH_TAC]; - ASM_REWRITE_TAC[]]);; - -(* Mean of standard normal - integral form *) -let STD_NORMAL_MEAN_ZERO_INTEGRAL = prove - (`real_integral (:real) (\x. x * std_normal_density x) = &0`, - MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - REWRITE_TAC[STD_NORMAL_MEAN_ZERO]);; - -(* --- Helper lemmas for second moment proof --- *) - -(* Derivative of -x * exp(-x^2/2) *) -let DERIV_NEG_X_GAUSSIAN = prove - (`!x. ((\x. --x * exp(--(x pow 2 / &2))) has_real_derivative - ((x pow 2 - &1) * exp(--(x pow 2 / &2)))) (atreal x)`, - GEN_TAC THEN REAL_DIFF_TAC THEN CONV_TAC REAL_FIELD);; - -(* Integral of (x^2-1)*exp(-x^2/2) over (:real) is 0. - Proof: By FTC on [a,b], integral = F(b)-F(a) where F(x) = -x*exp(-x^2/2). - F(x) -> 0 as |x| -> infinity, so the integral is 0. *) -let X2_MINUS_1_GAUSSIAN_HAS_INTEGRAL_0 = prove - (`((\x. (x pow 2 - &1) * exp(--(x pow 2 / &2))) has_real_integral &0) - (:real)`, - REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV] THEN - CONJ_TAC THENL - [REPEAT GEN_TAC THEN - MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + [FIRST_X_ASSUM(MP_TAC o SPEC `--a:real`) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - MP_TAC(SPECL [`&1 / &2`; `e:real`] GAUSSIAN_EXP_DECAY) THEN - CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[REAL_ARITH `&1 / &2 * t pow 2 / &2 = t pow 2 / &4`] THEN - DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN - MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN DISCH_TAC THEN - SUBGOAL_THEN `a <= --B /\ B <= b` STRIP_ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_REAL_INTERVAL]) THEN - ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `a <= b:real` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN SUBGOAL_THEN - `real_integral (real_interval[a,b]) - (\x. (x pow 2 - &1) * exp(--(x pow 2 / &2))) = - (--b * exp(--(b pow 2 / &2))) - (--a * exp(--(a pow 2 / &2)))` - SUBST1_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR THEN - ASM_REWRITE_TAC[DERIV_NEG_X_GAUSSIAN] THEN - MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN - REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN - REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + `abs(real_integral (real_interval[&0,b]) + (\x. exp(--(x pow 2))) - sqrt(pi) / &2) < e / &2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `b:real`) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[REAL_SUB_RZERO] THEN - MATCH_MP_TAC(REAL_ARITH - `abs fb < e / &2 /\ abs fa < e / &2 - ==> abs(fb - fa) < e`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `exp(--(b pow 2 / &4))` THEN CONJ_TAC THENL - [ONCE_REWRITE_TAC[REAL_ARITH `--b * x:real = --(b * x)`] THEN - REWRITE_TAC[REAL_ABS_NEG; ABS_X_GAUSSIAN_BOUND]; - SUBGOAL_THEN `&2 * exp(--(b pow 2 / &4)) < e` MP_TAC THENL - [FIRST_X_ASSUM(MATCH_MP_TAC o SPEC `b:real`) THEN - ASM_REAL_ARITH_TAC; - MP_TAC(SPEC `b pow 2 / &4` REAL_EXP_POS_LE) THEN - REAL_ARITH_TAC]]; - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `exp(--(a pow 2 / &4))` THEN CONJ_TAC THENL - [ONCE_REWRITE_TAC[REAL_ARITH `--a * x:real = --(a * x)`] THEN - REWRITE_TAC[REAL_ABS_NEG; ABS_X_GAUSSIAN_BOUND]; - SUBGOAL_THEN `&2 * exp(--(a pow 2 / &4)) < e` MP_TAC THENL - [FIRST_X_ASSUM(MATCH_MP_TAC o SPEC `a:real`) THEN - ASM_REAL_ARITH_TAC; - MP_TAC(SPEC `a pow 2 / &4` REAL_EXP_POS_LE) THEN - REAL_ARITH_TAC]]]);; - -(* x^2 * exp(-x^2/2) has integral sqrt(2*pi) over (:real). - Proof: x^2*exp = (x^2-1)*exp + exp, and integral of (x^2-1)*exp = 0, - integral of exp = sqrt(2*pi). *) -let X2_GAUSSIAN_HAS_INTEGRAL = prove - (`((\x. x pow 2 * exp(--(x pow 2 / &2))) has_real_integral sqrt(&2 * pi)) - (:real)`, - SUBGOAL_THEN - `(\x. x pow 2 * exp(--(x pow 2 / &2))) = - (\x. (x pow 2 - &1) * exp(--(x pow 2 / &2)) + - exp(--(x pow 2 / &2)))` + SUBGOAL_THEN `sqrt pi = sqrt(pi) / &2 + sqrt(pi) / &2` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `sqrt(&2 * pi) = &0 + sqrt(&2 * pi)` SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[X2_MINUS_1_GAUSSIAN_HAS_INTEGRAL_0]; - MP_TAC(SPEC `&1` GAUSSIAN_INTEGRAL_SCALED) THEN - ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[REAL_MUL_LID; REAL_DIV_1]]);; + ASM_REAL_ARITH_TAC);; -(* Second moment of standard normal is 1 *) -let STD_NORMAL_SECOND_MOMENT = prove - (`((\x. x pow 2 * std_normal_density x) has_real_integral &1) (:real)`, - SUBGOAL_THEN - `(\x. x pow 2 * std_normal_density x) = - (\x. inv(sqrt(&2 * pi)) * (x pow 2 * exp(--(x pow 2 / &2))))` +(* Scaled Gaussian integral: integrate exp(-at^2/2) over all of R *) +let GAUSSIAN_INTEGRAL_SCALED = prove + (`!a. &0 < a + ==> ((\t. exp(--(a * t pow 2 / &2))) has_real_integral + sqrt(&2 * pi / a)) (:real)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < sqrt(a / &2)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LT THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Replace the result with the equivalent form *) + SUBGOAL_THEN `sqrt(&2 * pi / a) = inv(sqrt(a / &2)) * sqrt pi` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; std_normal_density] THEN REAL_ARITH_TAC; + [CONV_TAC SYM_CONV THEN + ONCE_REWRITE_TAC[GSYM SQRT_INV] THEN + REWRITE_TAC[GSYM SQRT_MUL] THEN AP_TERM_TAC THEN + UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN - SUBGOAL_THEN `&1 = inv(sqrt(&2 * pi)) * sqrt(&2 * pi)` SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_MUL_LINV THEN - MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN - MATCH_MP_TAC SQRT_POS_LT THEN - MP_TAC PI_POS THEN REAL_ARITH_TAC; - MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN - REWRITE_TAC[X2_GAUSSIAN_HAS_INTEGRAL]]);; - -(* Second moment integral form *) -let STD_NORMAL_SECOND_MOMENT_INTEGRAL = prove - (`real_integral (:real) (\x. x pow 2 * std_normal_density x) = &1`, - MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]);; + (* Show integrands are equal up to substitution *) + MATCH_MP_TAC HAS_REAL_INTEGRAL_EQ THEN + EXISTS_TAC `\x:real. exp(--((sqrt(a / &2) * x) pow 2))` THEN + CONJ_TAC THENL + [X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_UNIV] THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[REAL_POW_MUL] THEN + ASM_SIMP_TAC[SQRT_POW_2; REAL_LE_DIV; REAL_LT_IMP_LE; + REAL_ARITH `&0 < &2`] THEN + REAL_ARITH_TAC; + (* Apply the stretching lemma to the Gaussian integral *) + MATCH_MP_TAC HAS_REAL_INTEGRAL_STRETCH_UNIV THEN + ASM_REWRITE_TAC[GAUSSIAN_INTEGRAL]]);; -(* ========================================================================= *) -(* TIGHTNESS FROM BOUNDED SECOND MOMENTS *) -(* ========================================================================= *) +(* Gaussian * cosine is integrable *) +let GAUSSIAN_COS_INTEGRABLE = prove + (`!a b. &0 < a + ==> (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + real_integrable_on (:real)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2))` THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + REWRITE_TAC[real_integrable_on] THEN + EXISTS_TAC `sqrt(&2 * pi / a)` THEN + ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; + GEN_TAC THEN REWRITE_TAC[IN_UNIV; REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp(--(a * x pow 2 / &2)) * &1` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN + REWRITE_TAC[REAL_ABS_POS; COS_BOUND] THEN + REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`; REAL_EXP_POS_LE]; + REWRITE_TAC[REAL_MUL_RID; REAL_LE_REFL]]]);; -(* Helper: |x| >= M iff x^2 >= M^2, for M >= 0 *) -let ABS_GE_IFF_POW2_GE = prove - (`!x M. &0 <= M ==> (abs(x) >= M <=> x pow 2 >= M pow 2)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[real_ge] THEN - SUBGOAL_THEN `M = abs(M:real)` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; - REWRITE_TAC[REAL_LE_SQUARE_ABS; REAL_POW2_ABS]]);; +(* y * exp(-y) <= 1 for y >= 0 *) +let REAL_EXP_DECAY_BOUND = prove + (`!y. &0 <= y ==> y * exp(--y) <= &1`, + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp y * exp(--y)` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN + MP_TAC(SPEC `y:real` REAL_EXP_LE_X) THEN REAL_ARITH_TAC; + REWRITE_TAC[GSYM REAL_EXP_ADD] THEN + SUBGOAL_THEN `y + --y = &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; REWRITE_TAC[REAL_EXP_0; REAL_LE_REFL]]]);; -(* Markov-type bound: P(|X| >= M) <= E[X^2] / M^2 *) -let MARKOV_SECOND_MOMENT = prove - (`!p:A prob_space (X:A->real) M. - simple_rv p X /\ &0 < M - ==> prob p {a | a IN prob_carrier p /\ abs(X a) >= M} <= - simple_expectation p (\x. X x pow 2) / M pow 2`, +(* Pointwise bound: x^2 * exp(-ax^2/2) <= (4/a) * exp(-(a/2)*x^2/2) *) +(* Proof: split exp(-ax^2/2) = exp(-ax^2/4)^2, cancel one factor, *) +(* then x^2*exp(-ax^2/4) = (4/a)*((ax^2/4)*exp(-ax^2/4)) <= 4/a *) +(* by REAL_EXP_DECAY_BOUND. *) +(* NOTE: / has higher precedence than * in HOL Light, so *) +(* a * x pow 2 / &4 parses as a * (x^2/4), NOT (a*x^2)/4. *) +let GAUSSIAN_T2_POINTWISE_BOUND = prove + (`!a x. &0 < a + ==> x pow 2 * exp(--(a * x pow 2 / &2)) <= + (&4 / a) * exp(--((a / &2) * x pow 2 / &2))`, REPEAT STRIP_TAC THEN - SUBGOAL_THEN - `{a:A | a IN prob_carrier p /\ abs((X:A->real) a) >= M} = - {a | a IN prob_carrier p /\ (\a. X a pow 2) a >= M pow 2}` + (* Simplify RHS exponent: (a/2)*x^2/2 = a*x^2/4 *) + SUBGOAL_THEN `(a / &2) * x pow 2 / &2 = a * x pow 2 / &4` + (fun th -> REWRITE_TAC[th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + (* Split exp(-ax^2/2) = exp(-ax^2/4) * exp(-ax^2/4) *) + SUBGOAL_THEN `exp(--(a * x pow 2 / &2)) = + exp(--(a * x pow 2 / &4)) * exp(--(a * x pow 2 / &4))` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN - BETA_TAC THEN AP_TERM_TAC THEN - MATCH_MP_TAC ABS_GE_IFF_POW2_GE THEN ASM_REAL_ARITH_TAC; + [REWRITE_TAC[GSYM REAL_EXP_ADD] THEN AP_TERM_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (X:A->real) a pow 2)` - ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_SQUARE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [X_GEN_TAC `a:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; - ASM_SIMP_TAC[REAL_POW_LT]]);; + (* Reassociate: x^2 * (e * e) = (x^2 * e) * e *) + ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN + (* Cancel exp(-ax^2/4) from both sides *) + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ALL_TAC; REWRITE_TAC[REAL_EXP_POS_LE]] THEN + (* Goal: x^2 * exp(-ax^2/4) <= 4/a *) + (* Key step: x^2*e = (4/a) * ((a*(x^2/4)) * e), then use DECAY_BOUND *) + (* Note: a * x pow 2 / &4 parses as a * (x^2/4) in HOL Light *) + SUBGOAL_THEN `x pow 2 * exp(--(a * x pow 2 / &4)) = + (&4 / a) * + ((a * x pow 2 / &4) * exp(--(a * x pow 2 / &4)))` + SUBST1_TAC THENL + [SUBGOAL_THEN `~(a = &0)` MP_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + (* Goal: (4/a) * ((a*(x^2/4)) * exp(-ax^2/4)) <= 4/a *) + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; + (* Goal: (a*(x^2/4))*exp(--(a*(x^2/4))) <= 1 *) + MATCH_MP_TAC REAL_EXP_DECAY_BOUND THEN + (* Goal: 0 <= a * (x^2/4) *) + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_LE_POW_2] THEN REAL_ARITH_TAC]]);; -(* Tightness from uniformly bounded second moments *) -let SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS = prove - (`!p:A prob_space (X:num->A->real) C. - (!n. simple_rv p (X n)) /\ - &0 < C /\ - (!n. simple_expectation p (\x. (X:num->A->real) n x pow 2) <= C) - ==> - !e. &0 < e ==> - ?M. &0 < M /\ - !n:num. - prob (p:A prob_space) {a | a IN prob_carrier p /\ - abs((X:num->A->real) n a) >= M} < e`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - ABBREV_TAC `M = sqrt(C / e) + &1` THEN - EXISTS_TAC `M:real` THEN - SUBGOAL_THEN `&0 <= sqrt(C / e)` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LE THEN - MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; - ALL_TAC] THEN - SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL - [EXPAND_TAC "M" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `C / e < (M:real) pow 2` ASSUME_TAC THENL - [EXPAND_TAC "M" THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `sqrt(C / e) pow 2` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC SQRT_POW_2 THEN - MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; - MATCH_MP_TAC REAL_POW_LT2 THEN - ASM_REWRITE_TAC[ARITH_EQ] THEN ASM_REAL_ARITH_TAC]; - ALL_TAC] THEN - SUBGOAL_THEN `&0 < (M:real) pow 2` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_POW_LT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `(C:real) / (M:real) pow 2 < e` ASSUME_TAC THENL - [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `(e:real) * (C / e)` THEN +(* t^2 * Gaussian is integrable *) +let GAUSSIAN_T2_INTEGRABLE = prove + (`!a. &0 < a + ==> (\t. t pow 2 * exp(--(a * t pow 2 / &2))) + real_integrable_on (:real)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\t:real. (&4 / a) * exp(--((a / &2) * t pow 2 / &2))` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + REWRITE_TAC[real_integrable_on] THEN + EXISTS_TAC `sqrt(&2 * pi / (a / &2))` THEN + MATCH_MP_TAC GAUSSIAN_INTEGRAL_SCALED THEN ASM_REAL_ARITH_TAC; + GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN + SUBGOAL_THEN `abs(x pow 2 * exp(--(a * x pow 2 / &2))) = + x pow 2 * exp(--(a * x pow 2 / &2))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN + MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_LE_POW_2; REAL_EXP_POS_LE]; ALL_TAC] THEN + ASM_SIMP_TAC[GAUSSIAN_T2_POINTWISE_BOUND]]);; + +(* Helper: |x| <= 1 + x^2 *) +let ABS_LE_1_PLUS_POW2 = prove + (`!x:real. abs x <= &1 + x pow 2`, + GEN_TAC THEN + DISJ_CASES_TAC (SPEC `abs(x:real)` (REAL_ARITH `!u. u <= &1 \/ &1 <= u`)) THENL + [MP_TAC (SPEC `x:real` REAL_LE_POW_2) THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs x * abs x` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC REAL_DIV_LMUL THEN - MATCH_MP_TAC REAL_LT_IMP_NZ THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - X_GEN_TAC `n:num` THEN - SUBGOAL_THEN - `prob (p:A prob_space) {a | a IN prob_carrier p /\ - abs((X:num->A->real) n a) >= M} <= - simple_expectation p (\x. X n x pow 2) / (M:real) pow 2` - ASSUME_TAC THENL - [MP_TAC(ISPECL - [`p:A prob_space`; `(X:num->A->real) n`; `M:real`] - MARKOV_SECOND_MOMENT) THEN - REWRITE_TAC[ETA_AX] THEN - ANTS_TAC THENL - [ASM_REWRITE_TAC[]; SIMP_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN - `simple_expectation (p:A prob_space) (\x. (X:num->A->real) n x pow 2) / - (M:real) pow 2 <= (C:real) / (M:real) pow 2` - ASSUME_TAC THENL - [ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN ASM_MESON_TAC[]; + [GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[GSYM REAL_POW_2; REAL_POW2_ABS] THEN + MP_TAC (SPEC `x:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]]);; + +(* t * Gaussian * sin is integrable *) +(* Dominator: exp(-at^2/2) + t^2*exp(-at^2/2) since |t|*exp <= (1+t^2)*exp *) +let GAUSSIAN_T_SIN_INTEGRABLE = prove + (`!a b. &0 < a + ==> (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) + real_integrable_on (:real)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2)) + + t pow 2 * exp(--(a * t pow 2 / &2))` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[real_integrable_on] THEN + EXISTS_TAC `sqrt(&2 * pi / a)` THEN + ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; + ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE]]; + GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs x * exp(--(a * x pow 2 / &2))` THEN CONJ_TAC THENL + [(* |t*exp*sin| <= |t|*exp: simplify abs, factor, use |sin| <= 1 *) + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(exp(--(a * x pow 2 / &2))) = exp(--(a * x pow 2 / &2))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL; REAL_EXP_POS_LE]; ALL_TAC] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN + REWRITE_TAC[REAL_EXP_POS_LE; SIN_BOUND]; + (* |t|*exp <= (1+t^2)*exp = exp + t^2*exp *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&1 + x pow 2) * exp(--(a * x pow 2 / &2))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[ABS_LE_1_PLUS_POW2]; REWRITE_TAC[REAL_EXP_POS_LE]]; + REWRITE_TAC[REAL_ADD_RDISTRIB; REAL_MUL_LID; REAL_LE_REFL]]]]);; + +(* Taylor bound for cosine: |cos(x+h) - cos(x) + h*sin(x)| <= h^2 *) +let COS_TAYLOR2_BOUND = prove + (`!x h. abs(cos(x + h) - cos x + h * sin x) <= h pow 2`, + REPEAT GEN_TAC THEN + MP_TAC (ISPECL + [`\(i:num) (t:real). + if i = 0 then cos t + else if i = 1 then --(sin t) + else --(cos t)`; + `1`; `(:real)`; `&1`] REAL_TAYLOR) THEN + REWRITE_TAC[IS_REALINTERVAL_UNIV; IN_UNIV] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [(* Derivative conditions for i <= 1 *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `i = 0 \/ i = 1` DISJ_CASES_TAC THENL + [ASM_ARITH_TAC; ALL_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[ARITH_RULE `0 + 1 = 1`; ARITH_RULE `1 + 1 = 2`; + ARITH_RULE `0 = 0 <=> T`; ARITH_RULE `1 = 0 <=> F`; + ARITH_RULE `1 = 1 <=> T`; ARITH_RULE `~(2 = 0)`; + ARITH_RULE `~(2 = 1)`] THEN + REWRITE_TAC[WITHINREAL_UNIV] THENL + [(* i=0: cos has_real_derivative --sin *) + REWRITE_TAC[ETA_AX; HAS_REAL_DERIVATIVE_COS]; + (* i=1: (\t. --sin t) has_real_derivative --cos *) + MATCH_MP_TAC HAS_REAL_DERIVATIVE_NEG THEN + REWRITE_TAC[ETA_AX; HAS_REAL_DERIVATIVE_SIN]]; + (* Bound: |--cos(u)| <= 1 *) + X_GEN_TAC `u:real` THEN + REWRITE_TAC[ARITH_RULE `1 + 1 = 2`; ARITH_RULE `~(2 = 0)`; + ARITH_RULE `~(2 = 1)`] THEN + REWRITE_TAC[REAL_ABS_NEG; COS_BOUND]]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `(C:real) / (M:real) pow 2` THEN - ASM_REWRITE_TAC[] THEN + (* Apply with w=x, z=x+h *) + DISCH_THEN (MP_TAC o SPECL [`x:real`; `x + h:real`]) THEN + REWRITE_TAC[REAL_ARITH `(x + h) - x = h:real`] THEN + (* Simplify sum(0..1) *) + SIMP_TAC[SUM_CLAUSES_LEFT; LE_0] THEN + CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[SUM_SING_NUMSEG] THEN + CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[FACT] THEN CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[CONJUNCT1 real_pow; REAL_POW_1; REAL_MUL_LID; REAL_MUL_RID; + REAL_DIV_1; REAL_ADD_RID] THEN + (* Hypothesis: abs(cos(x+h) - (cos x + --sin x * h)) <= abs h pow 2 / &2 + Goal: abs(cos(x+h) - cos x + h * sin x) <= h pow 2 *) + DISCH_TAC THEN + SUBGOAL_THEN `cos(x + h) - cos x + h * sin x = + cos(x + h) - (cos x + --(sin x) * h)` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `simple_expectation (p:A prob_space) (\x. (X:num->A->real) n x pow 2) / (M:real) pow 2` THEN - ASM_REWRITE_TAC[]);; + EXISTS_TAC `abs h pow 2 / &2` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `abs h pow 2 = h pow 2` SUBST1_TAC THENL + [ONCE_REWRITE_TAC[GSYM REAL_ABS_POW] THEN + REWRITE_TAC[REAL_ABS_REFL; REAL_LE_POW_2]; ALL_TAC] THEN + MP_TAC (SPEC `h:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]);; -(* Convergence set is measurable: the set of points where X_n -> L - pointwise is a measurable event. Proof: express the convergence set as - INTERS_k liminf_events (\n. {x | |X_n(x) - L(x)| < inv(k+1)}) and use - closure of sigma-algebras under countable operations. *) -let CONVERGENCE_SET_IN_EVENTS = prove - (`!p:A prob_space (X:num->A->real) (L:A->real). - (!n. random_variable p (X n)) /\ random_variable p L - ==> {x | x IN prob_carrier p /\ - ((\n. X n x) ---> L x) sequentially} IN prob_events p`, +(* General bound on the antiderivative *) +let GAUSSIAN_ANTIDERIV_BOUND = prove + (`!a b t. &0 < a + ==> abs(--inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)) + <= inv(a) * exp(--(a * t pow 2 / &2))`, REPEAT STRIP_TAC THEN - (* Step 1: Each {x | |X n x - L x| < inv(&k+1)} is an event *) - SUBGOAL_THEN `!n:num k:num. - {x:A | x IN prob_carrier p /\ - abs ((X:num->A->real) n x - (L:A->real) x) < inv(&k + &1)} - IN prob_events (p:A prob_space)` ASSUME_TAC THENL - [REPEAT GEN_TAC THEN - SUBGOAL_THEN - `{x:A | x IN prob_carrier p /\ - abs ((X:num->A->real) n x - (L:A->real) x) < inv(&k + &1)} = - {x | x IN prob_carrier p /\ - --(inv(&k + &1)) < X n x - L x /\ X n x - L x < inv(&k + &1)}` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN - EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN - ASM_REAL_ARITH_TAC; - MATCH_MP_TAC RANDOM_VARIABLE_OPEN_INTERVAL THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN - ASM_REWRITE_TAC[ETA_AX]]; - ALL_TAC] THEN - (* Step 2: Show convergence set = INTERS of liminf events *) - SUBGOAL_THEN - `{x:A | x IN prob_carrier p /\ - ((\n. (X:num->A->real) n x) ---> (L:A->real) x) sequentially} = - INTERS {liminf_events - (\n. {x:A | x IN prob_carrier p /\ - abs (X n x - L x) < inv(&k + &1)}) | k IN (:num)}` + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NEG] THEN + SUBGOAL_THEN `abs(inv a) = inv a` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(exp(--(a * t pow 2 / &2))) = exp(--(a * t pow 2 / &2))` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `w:A` THEN EQ_TAC THENL - [(* Forward: convergence => in INTERS of liminf *) - REWRITE_TAC[IN_ELIM_THM; IN_INTERS; FORALL_IN_GSPEC; IN_UNIV] THEN - STRIP_TAC THEN - X_GEN_TAC `k:num` THEN - REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN - UNDISCH_TAC - `((\n. (X:num->A->real) n (w:A)) ---> (L:A->real) w) sequentially` THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `inv(&k + &1)`) THEN - ANTS_TAC THENL - [MATCH_MP_TAC REAL_LT_INV THEN REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - EXISTS_TAC `N:num` THEN - X_GEN_TAC `nn:num` THEN REWRITE_TAC[GE] THEN DISCH_TAC THEN - REWRITE_TAC[IN_ELIM_THM] THEN - CONJ_TAC THENL - [ASM_REWRITE_TAC[]; - FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; - (* Backward: in INTERS of liminf => convergence *) - REWRITE_TAC[IN_INTERS; FORALL_IN_GSPEC; IN_UNIV; IN_ELIM_THM] THEN - DISCH_TAC THEN - SUBGOAL_THEN `(w:A) IN prob_carrier (p:A prob_space)` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN - REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_THEN `mm:num` (MP_TAC o SPEC `mm:num`)) THEN - REWRITE_TAC[GE; LE_REFL; IN_ELIM_THM] THEN SIMP_TAC[]; - ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - MP_TAC(SPEC `e:real` REAL_ARCH_INV_SUC) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `k:num`) THEN - FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN - REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_TAC `mm:num`) THEN - EXISTS_TAC `mm:num` THEN - X_GEN_TAC `nn:num` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[GE]; ALL_TAC] THEN - REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN - MATCH_MP_TAC REAL_LT_TRANS THEN - EXISTS_TAC `inv(&k + &1)` THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - (* Step 3: Show RHS is an event *) - MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN - GEN_TAC THEN - MATCH_MP_TAC LIMINF_EVENTS_IN_EVENTS THEN - GEN_TAC THEN ASM_REWRITE_TAC[]);; + [REWRITE_TAC[REAL_ABS_REFL; REAL_EXP_POS_LE]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC; + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN + REWRITE_TAC[REAL_EXP_POS_LE; SIN_BOUND]]);; -(* Helper: INTERS of tail unions SUBSET complement of convergence set *) -let INTERS_TAIL_UNIONS_SUBSET_COMPL = prove - (`!p:A prob_space (X:num->A->real) (L:A->real) (e:real). - &0 < e /\ - (!n. {x:A | x IN prob_carrier p /\ - abs (X n x - L x) >= e} IN prob_events p) - ==> - INTERS {UNIONS {{x:A | x IN prob_carrier p /\ - abs (X n' x - L x) >= e} | n' >= n} | n IN (:num)} - SUBSET - prob_carrier p DIFF - {x:A | x IN prob_carrier p /\ - ((\n. X n x) ---> L x) sequentially}`, - REPEAT STRIP_TAC THEN - REWRITE_TAC[SUBSET; IN_INTERS; IN_DIFF; IN_ELIM_THM; IN_UNIV] THEN - X_GEN_TAC `w:A` THEN DISCH_TAC THEN - CONJ_TAC THENL - [FIRST_ASSUM(MP_TAC o SPEC - `UNIONS {{x:A | x IN prob_carrier (p:A prob_space) /\ - abs ((X:num->A->real) n' x - (L:A->real) x) >= e} | n' >= 0}`) THEN - ANTS_TAC THENL - [EXISTS_TAC `0` THEN REFL_TAC; ALL_TAC] THEN - REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_THEN `t:A->bool` - (CONJUNCTS_THEN2 (X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) MP_TAC)) THEN - FIRST_X_ASSUM SUBST1_TAC THEN - REWRITE_TAC[IN_ELIM_THM] THEN SIMP_TAC[]; - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC `e:real`)) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - FIRST_ASSUM(MP_TAC o SPEC - `UNIONS {{x:A | x IN prob_carrier (p:A prob_space) /\ - abs ((X:num->A->real) n' x - (L:A->real) x) >= e} | n' >= N}`) THEN - ANTS_TAC THENL - [EXISTS_TAC `N:num` THEN REFL_TAC; ALL_TAC] THEN - REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_THEN `t:A->bool` - (CONJUNCTS_THEN2 (X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) MP_TAC)) THEN - FIRST_X_ASSUM SUBST1_TAC THEN - REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN - UNDISCH_TAC `m >= N:num` THEN REWRITE_TAC[GE] THEN - DISCH_TAC THEN ASM_REWRITE_TAC[] THEN - ASM_REAL_ARITH_TAC]);; +(* Helper: derivative of the antiderivative F(t) = --inv(a)*exp(-at^2/2)*sin(bt) *) +let GAUSSIAN_FT_ANTIDERIV_DERIV = prove + (`!a b t. &0 < a ==> + ((\t. --inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)) + has_real_derivative + (t * exp(--(a * t pow 2 / &2)) * sin(b * t) - + b / a * exp(--(a * t pow 2 / &2)) * cos(b * t))) + (atreal t)`, + REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN + UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD);; -(* ========================================================================= *) -(* SUBSEQUENCE CONVERGENCE TOOLS *) -(* ========================================================================= *) +(* For x > 0, exp(-x) < inv(x). Used for the IBP antiderivative decay. *) +let REAL_EXP_NEG_LT_INV = prove + (`!x. &0 < x ==> exp(--x) < inv x`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `x < exp(x)` MP_TAC THENL + [MP_TAC(SPEC `x:real` REAL_EXP_LE_X) THEN ASM_REAL_ARITH_TAC; + DISCH_TAC THEN REWRITE_TAC[REAL_EXP_NEG] THEN + MATCH_MP_TAC REAL_LT_INV2 THEN ASM_REWRITE_TAC[]]);; -(* Every bounded real sequence has a convergent subsequence *) -let BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ = prove - (`!f:num->real b. - (!n. abs(f n) <= b) - ==> ?l r. (!m n. m < n ==> r m < r n) /\ - ((\k. f(r k)) ---> l) sequentially`, +(* For large |t|, inv(a)*exp(-a*t^2/2) is arbitrarily small *) +let GAUSSIAN_EXP_DECAY = prove + (`!a e. &0 < a /\ &0 < e + ==> ?B. &0 < B /\ + !t. B <= abs(t) ==> inv(a) * exp(--(a * t pow 2 / &2)) < e`, REPEAT STRIP_TAC THEN - MP_TAC(SPEC `f:num->real` MONOTONE_SUBSEQUENCE) THEN - DISCH_THEN(X_CHOOSE_THEN `r:num->num` - (CONJUNCTS_THEN2 ASSUME_TAC DISJ_CASES_TAC)) THENL - [MP_TAC(SPECL [`\k:num. (f:num->real)(r k)`; `b:real`] - CONVERGENT_BOUNDED_MONOTONE) THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [GEN_TAC THEN ASM_REWRITE_TAC[]; - DISJ1_TAC THEN ASM_MESON_TAC[LE_REFL; NOT_LT; LT_IMP_LE]]; - ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(X_CHOOSE_TAC `l:real`) THEN - EXISTS_TAC `l:real` THEN EXISTS_TAC `r:num->num` THEN - ASM_REWRITE_TAC[REALLIM_SEQUENTIALLY]; - MP_TAC(SPECL [`\k:num. (f:num->real)(r k)`; `b:real`] - CONVERGENT_BOUNDED_MONOTONE) THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [GEN_TAC THEN ASM_REWRITE_TAC[]; - DISJ2_TAC THEN ASM_MESON_TAC[LE_REFL; NOT_LT; LT_IMP_LE]]; - ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(X_CHOOSE_TAC `l:real`) THEN - EXISTS_TAC `l:real` THEN EXISTS_TAC `r:num->num` THEN - ASM_REWRITE_TAC[REALLIM_SEQUENTIALLY]]);; - -(* Extract strictly increasing sequence from cofinal property *) -let INFINITE_EXTRACT_SUBSEQ = prove - (`!P:num->bool. (!N:num. ?n. N <= n /\ P n) - ==> ?r:num->num. (!m n. m < n ==> r m < r n) /\ (!k. P (r k))`, - GEN_TAC THEN DISCH_TAC THEN - SUBGOAL_THEN `!m:num. ?n. m < n /\ (P:num->bool) n` ASSUME_TAC THENL - [GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `m + 1`) THEN - DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + EXISTS_TAC `(&1 + &2 / ((a:real) pow 2 * (e:real))):real` THEN + ABBREV_TAC `B = (&1 + &2 / ((a:real) pow 2 * (e:real))):real` THEN + SUBGOAL_THEN `&0 < (a:real) pow 2 * (e:real)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_SIMP_TAC[REAL_POW_LT]; ALL_TAC] THEN + SUBGOAL_THEN `&1 <= B` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &1 <= &1 + x`) THEN + MATCH_MP_TAC REAL_LE_DIV THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < B` ASSUME_TAC THENL + [UNDISCH_TAC `&1 <= B` THEN REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `t:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `B pow 2 <= t pow 2` ASSUME_TAC THENL + [ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_POS]; + UNDISCH_TAC `&0 < B` THEN UNDISCH_TAC `B <= abs(t)` THEN + REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `B <= B pow 2` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_2] THEN + GEN_REWRITE_TAC (LAND_CONV) [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; + UNDISCH_TAC `&1 <= B` THEN REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < (a:real) * (B:real) / &2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < a` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < B` THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < (a:real) * (e:real)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN + UNDISCH_TAC `&0 < a` THEN UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC; ALL_TAC] THEN + (* Step 1: Establish B <= t^2 *) + SUBGOAL_THEN `(B:real) <= t pow 2` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LE_TRANS]; ALL_TAC] THEN + (* Step 2: Part 1 - inv(a)*exp(-at^2/2) <= inv(a)*exp(-aB/2) *) SUBGOAL_THEN - `!m:num. m < (@n. m < n /\ (P:num->bool) n) /\ P(@n. m < n /\ P n)` + `inv((a:real)) * exp(--(a * t pow 2 / &2)) <= + inv(a) * exp(--(a * (B:real) / &2))` ASSUME_TAC THENL - [GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN - DISCH_THEN(X_CHOOSE_THEN `w:num` STRIP_ASSUME_TAC) THEN - MP_TAC(ISPECL [`\n:num. m < n /\ (P:num->bool) n`; `w:num`] SELECT_AX) THEN - BETA_TAC THEN ASM_REWRITE_TAC[]; + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + REWRITE_TAC[REAL_EXP_MONO_LE; REAL_LE_NEG2] THEN + ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`; + REAL_LE_LMUL_EQ]]; ALL_TAC] THEN - MP_TAC(ISPECL [`@n:num. 0 < n /\ P n`; - `\(prev:num) (k:num). @n:num. prev < n /\ P n`] num_RECURSION) THEN - DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `r:num->num` THEN - SUBGOAL_THEN `!k:num. (r:num->num) k < r(SUC k)` ASSUME_TAC THENL - [INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + (* Step 3: Part 2 - inv(a)*exp(-aB/2) < e *) + SUBGOAL_THEN `~((a:real) = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~((e:real) = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `inv((a:real) * e) <= a * B / &2` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN + SUBGOAL_THEN + `(a:real) * (&1 + &2 / (a pow 2 * e)) / &2 = a / &2 + inv(a * e)` + SUBST1_TAC THENL + [UNDISCH_TAC `~((a:real) = &0)` THEN + UNDISCH_TAC `~((e:real) = &0)` THEN + CONV_TAC REAL_FIELD; + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> y <= x + y`) THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LT_DIV THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; REAL_ARITH_TAC]]; ALL_TAC] THEN + SUBGOAL_THEN `exp(--((a:real) * B / &2)) < a * e` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `inv((a:real) * B / &2)` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_EXP_NEG_LT_INV THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(inv((a:real) * e))` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + REWRITE_TAC[REAL_INV_INV; REAL_LE_REFL]]]; + ALL_TAC] THEN + (* Step 4: Combine via REAL_LET_TRANS *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(inv((a:real)) * exp(--((a:real) * (B:real) / &2))):real` THEN CONJ_TAC THENL - [MATCH_MP_TAC TRANSITIVE_STEPWISE_LT THEN - ASM_REWRITE_TAC[] THEN ARITH_TAC; - INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(e:real) = inv(a) * (a * e)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_ASSOC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID]; + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]]]);; -(* Subsequence convergence principle: - If every subsequence has a sub-subsequence converging to L, - then the full sequence converges to L *) -let REALLIM_SUBSEQ_SAME_LIMIT = prove - (`!f:num->real L b. - (!n. abs(f n) <= b) /\ - (!r:num->num. (!m n. m < n ==> r m < r n) - ==> ?s:num->num. (!m n. m < n ==> s m < s n) /\ - ((\k. f(r(s k))) ---> L) sequentially) - ==> (f ---> L) sequentially`, +(* IBP identity: integral of t * exp(-at^2/2) * sin(bt) = (b/a) * I(b) *) +(* Proof: F(t) = --inv(a)*exp(-at^2/2)*sin(bt) has derivative = integrand, *) +(* F -> 0 at infinity, so by FTC + HAS_REAL_INTEGRAL_ALT, integral F' = 0 *) +let GAUSSIAN_FT_IBP = prove + (`!a b. &0 < a + ==> real_integral (:real) (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = + (b / a) * real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))`, REPEAT STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - ASM_CASES_TAC `?N:num. !n. N <= n ==> abs((f:num->real) n - L) < e` THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `!N:num. ?n. N <= n /\ ~(abs((f:num->real) n - L) < e)` + ABBREV_TAC `f = \t:real. t * exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN + ABBREV_TAC `g = \t:real. exp(--(a * t pow 2 / &2)) * cos(b * t)` THEN + ABBREV_TAC `Fa = \t:real. --inv(a) * exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN + (* Step 1: Both integrands are integrable *) + SUBGOAL_THEN `(f:real->real) real_integrable_on (:real)` ASSUME_TAC THENL + [EXPAND_TAC "f" THEN ASM_SIMP_TAC[GAUSSIAN_T_SIN_INTEGRABLE]; ALL_TAC] THEN + SUBGOAL_THEN `(g:real->real) real_integrable_on (:real)` ASSUME_TAC THENL + [EXPAND_TAC "g" THEN ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE]; ALL_TAC] THEN + (* Step 2: Fa'(t) = f(t) - (b/a)*g(t) everywhere *) + SUBGOAL_THEN + `!t. ((Fa:real->real) has_real_derivative + ((f:real->real) t - b / a * (g:real->real) t)) (atreal t)` ASSUME_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN + [X_GEN_TAC `t:real` THEN EXPAND_TAC "f" THEN EXPAND_TAC "g" THEN + EXPAND_TAC "Fa" THEN ASM_SIMP_TAC[GAUSSIAN_FT_ANTIDERIV_DERIV]; + ALL_TAC] THEN + (* Step 3: |Fa(t)| <= inv(a) * exp(-at^2/2) *) SUBGOAL_THEN - `?r1:num->num. (!m n:num. m < n ==> r1 m < r1 n) /\ - (!k:num. ~(abs((f:num->real)(r1 k) - L) < e))` - STRIP_ASSUME_TAC THENL - [MP_TAC(ISPEC `\n:num. ~(abs((f:num->real) n - L) < e)` INFINITE_EXTRACT_SUBSEQ) THEN - BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + `!t. abs((Fa:real->real) t) <= inv(a) * exp(--(a * t pow 2 / &2))` + ASSUME_TAC THENL + [X_GEN_TAC `t:real` THEN EXPAND_TAC "Fa" THEN + ASM_SIMP_TAC[GAUSSIAN_ANTIDERIV_BOUND]; ALL_TAC] THEN - FIRST_X_ASSUM(MP_TAC o SPEC `r1:num->num`) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_THEN `s1:num->num` STRIP_ASSUME_TAC) THEN - UNDISCH_TAC - `((\k:num. (f:num->real)((r1:num->num)((s1:num->num) k))) ---> (L:real)) sequentially` THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN - FIRST_X_ASSUM(MP_TAC o SPEC `M:num`) THEN - REWRITE_TAC[LE_REFL] THEN BETA_TAC THEN - ASM_MESON_TAC[]);; - - -(* ========================================================================= *) -(* LIMIT IDENTIFICATION TOOLS *) -(* ========================================================================= *) - -(* General lemma: if f is continuous at x and f(x-h) <= l <= f(x+h) - for all h > 0, then l = f(x). *) -let CONTINUOUS_LIMIT_SANDWICH = prove - (`!f x l. f real_continuous (atreal x) /\ - (!h. &0 < h ==> f(x - h) <= l /\ l <= f(x + h)) - ==> l = f x`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH `a <= l /\ l <= a ==> l = a`) THEN + (* Step 4: Fa' is integrable on every finite interval *) + SUBGOAL_THEN + `!c d. (\t. (f:real->real) t - b / a * (g:real->real) t) + real_integrable_on real_interval[c,d]` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[SUBSET_UNIV]; + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[SUBSET_UNIV]]; + ALL_TAC] THEN + (* Step 5: FTC on [c,d] gives integral = Fa(d) - Fa(c) *) + SUBGOAL_THEN + `!c d. c <= d ==> + ((\t. (f:real->real) t - b / a * (g:real->real) t) + has_real_integral ((Fa:real->real) d - Fa c)) (real_interval[c,d])` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR THEN + ASM_REWRITE_TAC[] THEN + EXPAND_TAC "Fa" THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + ALL_TAC] THEN + (* Step 6: integral value on [c,d] when c <= d *) + SUBGOAL_THEN + `!c d. c <= d ==> + real_integral (real_interval[c,d]) + (\t. (f:real->real) t - b / a * (g:real->real) t) = + (Fa:real->real) d - Fa c` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 7: (h has_real_integral 0) on (:real) *) + (* Use: Fa(t) -> 0 as |t| -> infinity, so integral -> 0 *) + SUBGOAL_THEN + `((\t. (f:real->real) t - b / a * (g:real->real) t) + has_real_integral (&0)) (:real)` + ASSUME_TAC THENL + [REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV; REAL_SUB_RZERO] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Use decay lemma: Fa -> 0 at infinity *) + MP_TAC(SPECL [`a:real`; `e / &2`] GAUSSIAN_EXP_DECAY) THEN + ASM_REWRITE_TAC[REAL_HALF] THEN + DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN + MAP_EVERY X_GEN_TAC [`c:real`; `d:real`] THEN DISCH_TAC THEN + SUBGOAL_THEN `c <= --B /\ B <= d` STRIP_ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_REAL_INTERVAL]) THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `c <= d:real` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH + `abs d < e / &2 /\ abs c < e / &2 ==> abs(d - c) < e`) THEN + CONJ_TAC THEN MATCH_MP_TAC REAL_LET_TRANS THENL + [EXISTS_TAC `inv(a) * exp(--(a * d pow 2 / &2))`; + EXISTS_TAC `inv(a) * exp(--(a * c pow 2 / &2))`] THEN + (CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Conclude: real_integral f = b/a * real_integral g *) + ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_UNIQUE THEN + EXISTS_TAC `\t. (f:real->real) t - b / a * (g:real->real) t` THEN + EXISTS_TAC `(:real)` THEN CONJ_TAC THENL - [REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN - UNDISCH_TAC `(f:real->real) real_continuous (atreal x)` THEN - REWRITE_TAC[real_continuous_atreal] THEN - DISCH_THEN(MP_TAC o SPEC `(f:real->real) x - l`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN - FIRST_X_ASSUM(MP_TAC o SPEC `x - d / &2`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `d / &2`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REAL_ARITH_TAC; - REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN - UNDISCH_TAC `(f:real->real) real_continuous (atreal x)` THEN - REWRITE_TAC[real_continuous_atreal] THEN - DISCH_THEN(MP_TAC o SPEC `l - (f:real->real) x`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN - FIRST_X_ASSUM(MP_TAC o SPEC `x + d / &2`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `d / &2`) THEN - ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REAL_ARITH_TAC]);; - -(* Strictly increasing num->num satisfies r(k) >= k *) -let STRICTLY_INCREASING_GE = prove - (`!(r:num->num). (!m n. m < n ==> r m < r n) ==> !k. k <= r k`, - GEN_TAC THEN DISCH_TAC THEN INDUCT_TAC THENL - [ARITH_TAC; - FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `SUC k`]) THEN - REWRITE_TAC[LT] THEN ASM_ARITH_TAC]);; - -(* Subsequences of convergent real sequences converge to the same limit *) -let REALLIM_SUBSEQUENCE = prove - (`!(f:num->real) l (r:num->num). - (f ---> l) sequentially /\ (!m n. m < n ==> r m < r n) - ==> ((\k. f(r k)) ---> l) sequentially`, - REPEAT GEN_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN STRIP_TAC THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - EXISTS_TAC `N:num` THEN X_GEN_TAC `k:num` THEN DISCH_TAC THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN - MP_TAC(SPEC `r:num->num` STRICTLY_INCREASING_GE) THEN - ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `k:num`) THEN - ASM_ARITH_TAC);; - -(* ---- Helper lemmas for the sandwich argument ---- *) + [MATCH_MP_TAC HAS_REAL_INTEGRAL_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]);; -(* CDF as expectation of indicator *) -let SIMPLE_CDF_AS_EXPECTATION = prove - (`!p:A prob_space (X:A->real) x. - simple_rv p X - ==> simple_cdf p X x = - simple_expectation p (\a. if X a <= x then &1 else &0)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[simple_cdf] THEN - CONV_TAC SYM_CONV THEN +(* Differentiation under the integral for the Gaussian cosine integral. *) +(* Key step: Taylor bound |cos(x+h)-cos(x)+h*sin(x)| <= h^2 gives *) +(* |I(y)-I(b)-l*(y-b)| <= (y-b)^2 * C where C = integral t^2*exp(-at^2/2) *) +let GAUSSIAN_COS_INTEGRAL_HAS_DERIV = prove + (`!a b. &0 < a ==> + ((\b. real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))) + has_real_derivative + (--(real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))))) + (atreal b)`, + REPEAT STRIP_TAC THEN + ABBREV_TAC + `C = real_integral (:real) + (\t. t pow 2 * exp(--(a * t pow 2 / &2)))` THEN + (* C >= 0 *) + SUBGOAL_THEN `&0 <= C` ASSUME_TAC THENL + [EXPAND_TAC "C" THEN MATCH_MP_TAC REAL_INTEGRAL_POS THEN + ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE; IN_UNIV] THEN GEN_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_LE_POW_2; REAL_EXP_POS_LE]; + ALL_TAC] THEN + (* Key error bound: |I(y)-I(b)+(y-b)*integral(t*exp*sin)| <= (y-b)^2*C *) + SUBGOAL_THEN + `!y. abs(real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - + real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + + (y - b) * real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))) + <= (y - b) pow 2 * C` + ASSUME_TAC THENL + [X_GEN_TAC `y:real` THEN + (* Establish integrability assumptions *) + SUBGOAL_THEN + `(\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) + real_integrable_on (:real) /\ + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + real_integrable_on (:real) /\ + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) + real_integrable_on (:real)` + STRIP_ASSUME_TAC THENL + [ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE; GAUSSIAN_T_SIN_INTEGRABLE]; + ALL_TAC] THEN + (* Express error as single integral *) + SUBGOAL_THEN + `real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - + real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + + (y - b) * real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = + real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * + (cos(y * t) - cos(b * t) + (y - b) * t * sin(b * t)))` + SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_INTEGRAL_SUB] THEN + SUBGOAL_THEN + `(y - b) * real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)) = + real_integral (:real) + (\t. (y - b) * (t * exp(--(a * t pow 2 / &2)) * sin(b * t)))` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_LMUL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[GSYM REAL_INTEGRAL_ADD; REAL_INTEGRABLE_SUB; + REAL_INTEGRABLE_LMUL] THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN CONV_TAC REAL_RING; + ALL_TAC] THEN + (* Bound via REAL_INTEGRAL_ABS_BOUND_INTEGRAL *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_integral (:real) + (\t. (y - b) pow 2 * + (t pow 2 * exp(--(a * t pow 2 / &2))))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_ABS_BOUND_INTEGRAL THEN + CONJ_TAC THENL + [(* Integrability of error integrand *) + SUBGOAL_THEN + `(\t. exp(--(a * t pow 2 / &2)) * + (cos(y * t) - cos(b * t) + (y - b) * t * sin(b * t))) = + (\t. (exp(--(a * t pow 2 / &2)) * cos(y * t) - + exp(--(a * t pow 2 / &2)) * cos(b * t)) + + (y - b) * (t * exp(--(a * t pow 2 / &2)) * sin(b * t)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN CONV_TAC REAL_RING; + ALL_TAC] THEN + MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* Integrability of bound function *) + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + ASM_SIMP_TAC[GAUSSIAN_T2_INTEGRABLE]; + ALL_TAC] THEN + (* Pointwise bound *) + X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_UNIV] THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_EXP] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `exp(--(a * t pow 2 / &2)) * + ((y - b:real) pow 2 * t pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_EXP_POS_LE] THEN + MP_TAC(SPECL [`b * t:real`; `(y - b) * t:real`] + COS_TAYLOR2_BOUND) THEN + REWRITE_TAC[GSYM REAL_ADD_RDISTRIB] THEN + REWRITE_TAC[REAL_ARITH `b + y - b:real = y`] THEN + REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; + (* Simplify bound integral to (y-b)^2 * C *) + EXPAND_TAC "C" THEN + ASM_SIMP_TAC[REAL_INTEGRAL_LMUL; GAUSSIAN_T2_INTEGRABLE] THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Convert to limit form *) + REWRITE_TAC[HAS_REAL_DERIVATIVE_ATREAL; REALLIM_ATREAL] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + EXISTS_TAC `e / (C + &1)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `y:real` THEN STRIP_TAC THEN + SUBGOAL_THEN `~(y - b = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Rewrite: quotient - l = error / (y - b) *) + SUBGOAL_THEN + `(real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - + real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t))) / + (y - b) - + (--(real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t)))) + = (real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(y * t)) - + real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) + + (y - b) * real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(b * t))) / + (y - b)` + SUBST1_TAC THENL + [UNDISCH_TAC `~(y - b = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN + (* Apply bound: abs(error/(y-b)) <= abs(y-b)*C < e *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(y - b) * C` THEN CONJ_TAC THENL + [(* abs(error/(y-b)) <= abs(y-b)*C *) + REWRITE_TAC[REAL_ABS_DIV] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(y - b:real) pow 2 * C` THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MATCH_ACCEPT_TAC o SPEC `y:real`); + REWRITE_TAC[REAL_POW_2] THEN ASM_REAL_ARITH_TAC]; + (* abs(y-b)*C < e *) + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `abs(y - b) * (C + &1)` THEN CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LMUL; REAL_ARITH `C < C + &1`]; ALL_TAC] THEN + SUBGOAL_THEN `~(C + &1 = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs(y - b) * (C + &1) <= e / (C + &1) * (C + &1)` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE; + REAL_ARITH `&0 <= x ==> &0 <= x + &1`]; + ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LE_REFL]]] + );; + +(* GAUSSIAN_COS_INTEGRAL_HAS_DERIV_REAL: alternative proof sketch, not needed. + The proved GAUSSIAN_COS_INTEGRAL_HAS_DERIV (above) suffices. + Keeping a brief note instead of the full commented-out proof attempt. *) + +(* If x * e = c and e != 0, then x = c * inv(e) *) +let REAL_EQ_RDIV_CANCEL = prove + (`!(x:real) c e. ~(e = &0) /\ x * e = c ==> x = c * inv e`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN + ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_RINV; REAL_MUL_RID]);; + +(* Zero derivative on all reals means constant *) +let HAS_REAL_DERIVATIVE_ZERO_CONSTANT = prove + (`!f c (a:real). + f a = c /\ + (!x. (f has_real_derivative (&0)) (atreal x)) + ==> !x. f x = c`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(SPECL [`f:real->real`; `(:real)`; `c:real`; `a:real`] + HAS_REAL_DERIVATIVE_ZERO_UNIQUE) THEN + REWRITE_TAC[IS_REALINTERVAL_UNIV; IN_UNIV] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `y:real` THEN + REWRITE_TAC[WITHINREAL_UNIV] THEN + ASM_REWRITE_TAC[]);; + +(* Gaussian Fourier Transform (cosine part) *) +(* Proof strategy: ODE approach. Show F(b) = I(b)*exp(b^2/(2a)) is constant *) +(* by proving I'(b) = -(b/a)*I(b) using Taylor error + IBP identity, *) +(* then MVT shows F is constant, and F(0) = sqrt(2pi/a). *) +let GAUSSIAN_FT = prove + (`!a b. &0 < a + ==> ((\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) has_real_integral + sqrt(&2 * pi / a) * exp(--(b pow 2 / (&2 * a)))) (:real)`, + REPEAT STRIP_TAC THEN + (* The function is integrable *) + SUBGOAL_THEN + `(\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) real_integrable_on (:real)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRABLE]; ALL_TAC] THEN + (* Suffices to show the integral value equals the RHS *) + SUBGOAL_THEN + `real_integral (:real) (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) = + sqrt(&2 * pi / a) * exp(--(b pow 2 / (&2 * a)))` + (fun th -> ASM_MESON_TAC[th; REAL_INTEGRABLE_INTEGRAL; + HAS_REAL_INTEGRAL_UNIQUE; HAS_REAL_INTEGRAL_INTEGRABLE_INTEGRAL]) THEN + (* Abbreviate I(b) *) + ABBREV_TAC `Ib = \u:real. real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(u * t))` THEN + SUBGOAL_THEN `real_integral (:real) + (\t. exp(--(a * t pow 2 / &2)) * cos(b * t)) = (Ib:real->real) b` + SUBST1_TAC THENL + [EXPAND_TAC "Ib" THEN REWRITE_TAC[]; ALL_TAC] THEN + (* Abbreviate F(b) *) + ABBREV_TAC `Fb = \u:real. (Ib:real->real) u * exp(u pow 2 / (&2 * a))` THEN + (* Step 1: Ib(0) = sqrt(2pi/a) *) + SUBGOAL_THEN `(Ib:real->real) (&0) = sqrt(&2 * pi / a)` ASSUME_TAC THENL + [EXPAND_TAC "Ib" THEN + REWRITE_TAC[REAL_MUL_LZERO; COS_0; REAL_MUL_RID] THEN + ASM_MESON_TAC[REAL_INTEGRAL_UNIQUE; GAUSSIAN_INTEGRAL_SCALED]; ALL_TAC] THEN + (* Step 2: Fb(0) = sqrt(2pi/a) *) + SUBGOAL_THEN `(Fb:real->real) (&0) = sqrt(&2 * pi / a)` ASSUME_TAC THENL + [EXPAND_TAC "Fb" THEN + REWRITE_TAC[REAL_POW_ZERO; ARITH; REAL_MUL_LZERO; real_div; + REAL_MUL_LZERO; REAL_EXP_0; REAL_MUL_RID] THEN + REWRITE_TAC[GSYM real_div] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 3: Fb has derivative 0 everywhere *) + SUBGOAL_THEN + `!x:real. ((Fb:real->real) has_real_derivative (&0)) (atreal x)` + ASSUME_TAC THENL + [X_GEN_TAC `u:real` THEN EXPAND_TAC "Fb" THEN + (* Step 3a-0: IBP identity *) + SUBGOAL_THEN + `real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(u * t)) = + u / a * (Ib:real->real) u` ASSUME_TAC THENL + [ASM_SIMP_TAC[GAUSSIAN_FT_IBP] THEN + EXPAND_TAC "Ib" THEN REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3a-i: derivative of Ib via differentiation under integral *) + SUBGOAL_THEN + `((Ib:real->real) has_real_derivative + (--real_integral (:real) + (\t. t * exp(--(a * t pow 2 / &2)) * sin(u * t)))) + (atreal u)` ASSUME_TAC THENL + [EXPAND_TAC "Ib" THEN ASM_SIMP_TAC[GAUSSIAN_COS_INTEGRAL_HAS_DERIV]; + ALL_TAC] THEN + (* Step 3a-i': combine: Ib' = -(u/a * Ib u) *) + SUBGOAL_THEN + `((Ib:real->real) has_real_derivative + (--(u / a * (Ib:real->real) u))) (atreal u)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Step 3a-ii: derivative of exp(u^2/(2a)) at u *) + SUBGOAL_THEN + `((\u:real. exp(u pow 2 / (&2 * a))) has_real_derivative + (u / a * exp(u pow 2 / (&2 * a)))) (atreal u)` ASSUME_TAC THENL + [REAL_DIFF_TAC THEN + UNDISCH_TAC `&0 < a` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + (* Step 3a-iii: product rule + cancellation *) + SUBGOAL_THEN + `&0 = (Ib:real->real) u * (u / a * exp(u pow 2 / (&2 * a))) + + (--(u / a * (Ib:real->real) u)) * exp(u pow 2 / (&2 * a))` + SUBST1_TAC THENL + [CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_MUL_ATREAL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3b: Fb is constant *) + SUBGOAL_THEN `!x:real. (Fb:real->real) x = Fb (&0)` ASSUME_TAC THENL + [ASM_MESON_TAC[HAS_REAL_DERIVATIVE_ZERO_CONSTANT]; ALL_TAC] THEN + (* Step 4: derive Ib(b) = sqrt(2pi/a) * exp(-b^2/(2a)) *) + (* Rewrite exp(--x) = inv(exp x) so MATCH_MP_TAC can find e *) + REWRITE_TAC[REAL_EXP_NEG] THEN + MATCH_MP_TAC REAL_EQ_RDIV_CANCEL THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_EXP_NZ]; ALL_TAC] THEN + (* Goal: Ib b * exp(b^2/(2a)) = sqrt(2pi/a) *) + (* This is Fb(b) which equals Fb(0) = sqrt(2pi/a) *) + SUBGOAL_THEN `(Ib:real->real) b * exp(b pow 2 / (&2 * a)) = (Fb:real->real) b` + SUBST1_TAC THENL + [EXPAND_TAC "Fb" THEN REWRITE_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[]);; + +(* Gaussian Fourier Transform (sine part = 0 by odd symmetry) *) + +let GAUSSIAN_FT_SIN = prove + (`!a b. &0 < a + ==> ((\t. exp(--(a * t pow 2 / &2)) * sin(b * t)) has_real_integral + &0) (:real)`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `f = \t:real. exp(--(a * t pow 2 / &2)) * sin(b * t)` THEN + (* f is integrable: measurable + bounded by integrable Gaussian *) + SUBGOAL_THEN `f real_integrable_on (:real)` ASSUME_TAC THENL + [EXPAND_TAC "f" THEN + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\t:real. exp(--(a * t pow 2 / &2))` THEN REPEAT CONJ_TAC THENL + [(* measurable: differentiable => continuous => measurable *) + MATCH_MP_TAC CONTINUOUS_IMP_REAL_MEASURABLE_ON THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + (* majorant is integrable *) + REWRITE_TAC[real_integrable_on] THEN + EXISTS_TAC `sqrt(&2 * pi / a)` THEN + ASM_SIMP_TAC[GAUSSIAN_INTEGRAL_SCALED]; + (* pointwise bound: |f(t)| <= exp(-at^2/2) *) + GEN_TAC THEN REWRITE_TAC[IN_UNIV; REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp(--(a * x pow 2 / &2)) * &1` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN + REWRITE_TAC[REAL_ABS_POS; SIN_BOUND] THEN + REWRITE_TAC[REAL_ARITH `abs x <= x <=> &0 <= x`; REAL_EXP_POS_LE]; + REWRITE_TAC[REAL_MUL_RID; REAL_LE_REFL]]]; + ALL_TAC] THEN + (* f has_real_integral (real_integral R f) *) + SUBGOAL_THEN `(f has_real_integral real_integral (:real) f) (:real)` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* f is odd: f(-t) = -f(t) *) + SUBGOAL_THEN `!t:real. (f:real->real)(--t) = --(f t)` ASSUME_TAC THENL + [EXPAND_TAC "f" THEN GEN_TAC THEN + REWRITE_TAC[REAL_POW_NEG; ARITH; SIN_NEG; REAL_MUL_RNEG]; ALL_TAC] THEN + (* By reflection + oddness: (\t. -f(t)) has_real_integral I *) + SUBGOAL_THEN `((\t:real. --((f:real->real) t)) has_real_integral + real_integral (:real) f) (:real)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`f:real->real`; `real_integral (:real) (f:real->real)`; + `(:real)`] HAS_REAL_INTEGRAL_REFLECT_GEN) THEN + SUBGOAL_THEN `IMAGE ((--):real->real) (:real) = (:real)` (fun th -> + REWRITE_TAC[th]) THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN GEN_TAC THEN + EXISTS_TAC `--x:real` THEN REWRITE_TAC[REAL_NEG_NEG]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN MESON_TAC[]; ALL_TAC] THEN + (* By negation: (\t. -f(t)) has_real_integral (-I) *) + SUBGOAL_THEN `((\t:real. --((f:real->real) t)) has_real_integral + --(real_integral (:real) f)) (:real)` ASSUME_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_NEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* I = -I => I = 0, then f has_real_integral 0 *) + SUBGOAL_THEN `real_integral (:real) f = &0` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `x = --x ==> x = &0`) THEN + ASM_MESON_TAC[HAS_REAL_INTEGRAL_UNIQUE]; ALL_TAC] THEN + ASM_MESON_TAC[REAL_INTEGRABLE_INTEGRAL]);; + +(* --- Phase 2: Standard Normal Distribution --- *) + +let std_normal_density = new_definition + `std_normal_density (x:real) = + inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2))`;; + +let std_normal_cdf = new_definition + `std_normal_cdf (x:real) = + real_integral {t | t <= x} std_normal_density`;; + +(* Density is strictly positive *) +let STD_NORMAL_DENSITY_POS = prove + (`!x. &0 < std_normal_density x`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC SQRT_POS_LT THEN + MP_TAC PI_POS THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_EXP_POS_LT]]);; + +(* Density is non-negative *) +let STD_NORMAL_DENSITY_NONNEG = prove + (`!x. &0 <= std_normal_density x`, + GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + REWRITE_TAC[STD_NORMAL_DENSITY_POS]);; + +(* Density integrates to 1 *) +let STD_NORMAL_DENSITY_INTEGRAL = prove + (`(std_normal_density has_real_integral &1) (:real)`, + (* Step 1: Unfold std_normal_density to its lambda definition *) + SUBGOAL_THEN `std_normal_density = + (\x. inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; std_normal_density]; ALL_TAC] THEN + (* Step 2: Establish inv(sqrt(2*pi)) * sqrt(2*pi) = 1 *) + SUBGOAL_THEN `inv(sqrt(&2 * pi)) * sqrt(&2 * pi) = &1` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_MUL_LINV THEN + MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN + MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 3: Get Gaussian integral for a=1 *) + MP_TAC(SPEC `&1` GAUSSIAN_INTEGRAL_SCALED) THEN + REWRITE_TAC[REAL_LT_01; REAL_MUL_LID; REAL_DIV_1] THEN + (* Step 4: Apply HAS_REAL_INTEGRAL_LMUL via forward reasoning *) + DISCH_THEN(fun th -> + MP_TAC(SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))) THEN + REWRITE_TAC[] THEN + ASM_REWRITE_TAC[]);; + +(* Density is integrable on all of R *) +let STD_NORMAL_DENSITY_INTEGRABLE = prove + (`std_normal_density real_integrable_on (:real)`, + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]);; + +(* Density is integrable on any half-line {t | t <= x} *) +let STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE = prove + (`!x. std_normal_density real_integrable_on {t | t <= x}`, + GEN_TAC THEN + MP_TAC(ISPECL [`std_normal_density`; `(:real)`; `{t:real | t <= x}`] + REAL_INTEGRABLE_ON_SUBINTERVAL_GEN) THEN + REWRITE_TAC[SUBSET_UNIV; IS_REALINTERVAL_CLAUSES; + STD_NORMAL_DENSITY_INTEGRABLE]);; + +(* CDF is monotone non-decreasing *) +let STD_NORMAL_CDF_MONO = prove + (`!x y. x <= y ==> std_normal_cdf x <= std_normal_cdf y`, + REPEAT STRIP_TAC THEN REWRITE_TAC[std_normal_cdf] THEN + MATCH_MP_TAC REAL_INTEGRAL_SUBSET_LE THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE; + IN_ELIM_THM; STD_NORMAL_DENSITY_NONNEG] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_REAL_ARITH_TAC);; + +(* CDF is bounded between 0 and 1 *) +let STD_NORMAL_CDF_BOUNDS = prove + (`!x. &0 <= std_normal_cdf x /\ std_normal_cdf x <= &1`, + GEN_TAC THEN REWRITE_TAC[std_normal_cdf] THEN CONJ_TAC THENL + [(* Lower bound: 0 <= integral *) + MATCH_MP_TAC REAL_INTEGRAL_POS THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE; + IN_ELIM_THM; STD_NORMAL_DENSITY_NONNEG]; + (* Upper bound: integral <= 1 *) + MP_TAC(ISPECL [`std_normal_density`; `{t:real | t <= x}`; + `(:real)`; + `real_integral {t:real | t <= x} std_normal_density`; + `&1`] HAS_REAL_INTEGRAL_SUBSET_LE) THEN + REWRITE_TAC[SUBSET_UNIV; STD_NORMAL_DENSITY_INTEGRAL; + IN_UNIV; STD_NORMAL_DENSITY_NONNEG] THEN + DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]]);; + +(* Density is bounded above *) +let STD_NORMAL_DENSITY_BOUND = prove + (`!x. std_normal_density x <= inv(sqrt(&2 * pi))`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN MATCH_MP_TAC SQRT_POS_LE THEN + MP_TAC PI_POS THEN REAL_ARITH_TAC; + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_EXP_0] THEN + REWRITE_TAC[REAL_EXP_MONO_LE] THEN + REWRITE_TAC[REAL_NEG_LE0] THEN + MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS] THEN + REWRITE_TAC[REAL_LE_POW_2]]);; + +(* CDF splitting: integral from x to y *) +let STD_NORMAL_CDF_INTERVAL = prove + (`!x y. x <= y ==> + std_normal_cdf y = + std_normal_cdf x + real_integral (real_interval[x,y]) std_normal_density`, + REPEAT STRIP_TAC THEN REWRITE_TAC[std_normal_cdf] THEN + SUBGOAL_THEN `(std_normal_density has_real_integral + real_integral {t:real | t <= y} std_normal_density) {t | t <= y}` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; ALL_TAC] THEN + SUBGOAL_THEN `(std_normal_density has_real_integral + (real_integral {t:real | t <= x} std_normal_density + + real_integral (real_interval[x,y]) std_normal_density)) {t | t <= y}` + ASSUME_TAC THENL + [SUBGOAL_THEN `{t:real | t <= y} = {t | t <= x} UNION real_interval[x,y]` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM; IN_REAL_INTERVAL] THEN + GEN_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_UNION THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; ALL_TAC] THEN + MATCH_MP_TAC REAL_NEGLIGIBLE_SUBSET THEN EXISTS_TAC `{x:real}` THEN + REWRITE_TAC[REAL_NEGLIGIBLE_SING; SUBSET; IN_INTER; IN_SING; + IN_ELIM_THM; IN_REAL_INTERVAL] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_MESON_TAC[HAS_REAL_INTEGRAL_UNIQUE]);; + +(* CDF is continuous *) +let STD_NORMAL_CDF_CONTINUOUS = prove + (`!x. std_normal_cdf real_continuous atreal x`, + GEN_TAC THEN REWRITE_TAC[real_continuous_atreal] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 < sqrt(&2 * pi)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LT THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN + REWRITE_TAC[PI_POS]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(sqrt(&2 * pi))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXISTS_TAC `e * sqrt(&2 * pi)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `inv(sqrt(&2 * pi)) * abs(y - x)` THEN + CONJ_TAC THENL + [(* Lipschitz bound: |F(y) - F(x)| <= inv(sqrt(2pi)) * |y - x| *) + DISJ_CASES_TAC(REAL_ARITH `x <= y \/ y <= x:real`) THENL + [(* Case x <= y *) + SUBGOAL_THEN `abs(std_normal_cdf y - std_normal_cdf x) = + abs(real_integral (real_interval[x,y]) std_normal_density)` SUBST1_TAC THENL + [MP_TAC(SPECL [`x:real`; `y:real`] STD_NORMAL_CDF_INTERVAL) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `inv(sqrt(&2 * pi)) * abs(y - x) = + inv(sqrt(&2 * pi)) * (y - x)` SUBST1_TAC THENL + [AP_TERM_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `std_normal_density` HAS_REAL_INTEGRAL_BOUND) THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; + GEN_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN DISCH_TAC THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_NONNEG) THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_BOUND) THEN REAL_ARITH_TAC]; + (* Case y <= x *) + SUBGOAL_THEN `abs(std_normal_cdf y - std_normal_cdf x) = + abs(real_integral (real_interval[y,x]) std_normal_density)` SUBST1_TAC THENL + [MP_TAC(SPECL [`y:real`; `x:real`] STD_NORMAL_CDF_INTERVAL) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `inv(sqrt(&2 * pi)) * abs(y - x) = + inv(sqrt(&2 * pi)) * (x - y)` SUBST1_TAC THENL + [AP_TERM_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `std_normal_density` HAS_REAL_INTEGRAL_BOUND) THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; + GEN_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN DISCH_TAC THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_NONNEG) THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_BOUND) THEN REAL_ARITH_TAC]]; + (* inv(sqrt(2pi)) * |y-x| < e *) + SUBGOAL_THEN `inv(sqrt(&2 * pi)) * (e * sqrt(&2 * pi)) = e` + (fun th -> ONCE_REWRITE_TAC[GSYM th]) THENL + [SUBGOAL_THEN `~(sqrt(&2 * pi) = &0)` MP_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[]]);; + +(* Density symmetry *) +let STD_NORMAL_DENSITY_SYM = prove + (`!x. std_normal_density(--x) = std_normal_density x`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[REAL_POW_NEG; ARITH] THEN REAL_ARITH_TAC);; + +(* Density is integrable on the upper halfline *) +let STD_NORMAL_DENSITY_INTEGRABLE_UPPER_HALFLINE = prove + (`std_normal_density real_integrable_on {t | &0 <= t}`, + MP_TAC(ISPECL [`std_normal_density`; `(:real)`; `{t:real | &0 <= t}`] + REAL_INTEGRABLE_ON_SUBINTERVAL_GEN) THEN + REWRITE_TAC[SUBSET_UNIV; STD_NORMAL_DENSITY_INTEGRABLE] THEN + DISCH_THEN MATCH_MP_TAC THEN + REWRITE_TAC[is_realinterval; IN_ELIM_THM] THEN REAL_ARITH_TAC);; + +(* --- Phase 3: CLT Bridge --- *) + +(* The characteristic function of the standard normal distribution + is exp(-t^2/2). This connects GAUSSIAN_FT to the CLT. *) + +(* Helper: inv(sqrt(2*pi)) * sqrt(2*pi) = 1 *) +let SQRT_2PI_INV = prove + (`inv(sqrt(&2 * pi)) * sqrt(&2 * pi) = &1`, + MATCH_MP_TAC REAL_MUL_LINV THEN + MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN + MATCH_MP_TAC SQRT_POS_LT THEN MP_TAC PI_POS THEN REAL_ARITH_TAC);; + +(* Cancellation respecting right-association of * *) +let SQRT_2PI_CANCEL = prove + (`!x:real. inv(sqrt(&2 * pi)) * sqrt(&2 * pi) * x = x`, + GEN_TAC THEN REWRITE_TAC[REAL_MUL_ASSOC; SQRT_2PI_INV; REAL_MUL_LID]);; + +(* Real part: integral of std_normal_density * cos(t*x) *) +let STD_NORMAL_CHAR_FN_RE = prove + (`!t. ((\x. std_normal_density x * cos(t * x)) has_real_integral + exp(--(t pow 2 / &2))) (:real)`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + REWRITE_TAC[REAL_ARITH `(a * b) * c:real = a * (b * c)`] THEN + MP_TAC(REWRITE_RULE[REAL_MUL_LID; REAL_DIV_1; + REAL_ARITH `&2 * &1:real = &2`] + (MP (SPECL [`&1`; `t:real`] GAUSSIAN_FT) REAL_LT_01)) THEN + DISCH_THEN(fun th -> + ACCEPT_TAC(REWRITE_RULE[SQRT_2PI_CANCEL] + (BETA_RULE + (SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))))));; + +(* Imaginary part: integral of std_normal_density * sin(t*x) = 0 *) +let STD_NORMAL_CHAR_FN_IM = prove + (`!t. ((\x. std_normal_density x * sin(t * x)) has_real_integral + &0) (:real)`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + REWRITE_TAC[REAL_ARITH `(a * b) * c:real = a * (b * c)`] THEN + MP_TAC(REWRITE_RULE[REAL_MUL_LID; REAL_DIV_1] + (MP (SPECL [`&1`; `t:real`] GAUSSIAN_FT_SIN) REAL_LT_01)) THEN + DISCH_THEN(fun th -> + ACCEPT_TAC(REWRITE_RULE[REAL_MUL_RZERO] + (BETA_RULE + (SPEC `inv(sqrt(&2 * pi))` (MATCH_MP HAS_REAL_INTEGRAL_LMUL th))))));; + + +(* --- Helper lemmas for mean zero proof --- *) + +(* |x| <= exp(x^2/4): from AM-GM (|x| <= 1 + x^2/4) and 1+y <= exp(y) *) +let ABS_LE_EXP_QUARTER = prove + (`!x:real. abs(x) <= exp(x pow 2 / &4)`, + GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&1 + x pow 2 / &4` THEN CONJ_TAC THENL + [SUBGOAL_THEN `&0 <= (x / &2 - &1) pow 2 /\ &0 <= (x / &2 + &1) pow 2` + MP_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC]; + REWRITE_TAC[REAL_EXP_LE_X]]);; + +(* |x * exp(-x^2/2)| <= exp(-x^2/4) *) +let ABS_X_GAUSSIAN_BOUND = prove + (`!x:real. abs(x * exp(--(x pow 2 / &2))) <= exp(--(x pow 2 / &4))`, + GEN_TAC THEN REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(exp(--(x pow 2 / &2))) = exp(--(x pow 2 / &2))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]; + ALL_TAC] THEN + SUBGOAL_THEN `exp(--(x pow 2 / &4)) = + exp(x pow 2 / &4) * exp(--(x pow 2 / &2))` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_EXP_ADD] THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[ABS_LE_EXP_QUARTER]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN REWRITE_TAC[REAL_EXP_POS_LT]]);; + +(* exp(-x^2/4) is integrable on (:real), from GAUSSIAN_INTEGRAL_SCALED *) +let GAUSSIAN_QUARTER_INTEGRABLE = prove + (`(\t. exp(--(t pow 2 / &4))) real_integrable_on (:real)`, + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `sqrt(&2 * pi / (&1 / &2))` THEN + MP_TAC(SPEC `&1 / &2` GAUSSIAN_INTEGRAL_SCALED) THEN + CONV_TAC REAL_RAT_REDUCE_CONV THEN + REWRITE_TAC[REAL_ARITH `&1 / &2 * t pow 2 / &2 = t pow 2 / &4`]);; + +(* x * exp(-x^2/2) is integrable on (:real), by domination *) +let X_GAUSSIAN_INTEGRABLE = prove + (`(\x. x * exp(--(x pow 2 / &2))) real_integrable_on (:real)`, + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\t. exp(--(t pow 2 / &4))` THEN + REWRITE_TAC[GAUSSIAN_QUARTER_INTEGRABLE; IN_UNIV; + ABS_X_GAUSSIAN_BOUND] THEN + MATCH_MP_TAC INTEGRABLE_SUBINTERVALS_IMP_REAL_MEASURABLE THEN + REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC);; + +(* IMAGE (--) (:real) = (:real) *) +let IMAGE_NEG_UNIV_REAL = prove + (`IMAGE (--) (:real) = (:real)`, + REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN EXISTS_TAC `--x:real` THEN REWRITE_TAC[REAL_NEG_NEG]);; + +(* Mean of standard normal is 0 + Proof: x*density(x) is odd (by STD_NORMAL_DENSITY_SYM), integrable + (by domination with exp(-x^2/4)), so its integral k satisfies + k = --k by reflection, hence k = 0. *) +let STD_NORMAL_MEAN_ZERO = prove + (`((\x. x * std_normal_density x) has_real_integral &0) (:real)`, + SUBGOAL_THEN `(\x. x * std_normal_density x) real_integrable_on (:real)` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x. x * std_normal_density x) = + (\x. inv(sqrt(&2 * pi)) * (x * exp(--(x pow 2 / &2))))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; std_normal_density] THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN REWRITE_TAC[X_GAUSSIAN_INTEGRABLE]]; + ALL_TAC] THEN + FIRST_ASSUM(MP_TAC o MATCH_MP REAL_INTEGRABLE_INTEGRAL) THEN + ABBREV_TAC `k = real_integral (:real) (\x. x * std_normal_density x)` THEN + DISCH_TAC THEN + SUBGOAL_THEN + `((\x. --(x * std_normal_density x)) has_real_integral k) (:real)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `(\x. --(x * std_normal_density x)) = + (\x. (--x) * std_normal_density(--x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; STD_NORMAL_DENSITY_SYM] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`\x:real. x * std_normal_density x`; `k:real`; `(:real)`] + HAS_REAL_INTEGRAL_REFLECT_GEN) THEN + REWRITE_TAC[IMAGE_NEG_UNIV_REAL] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `((\x. --(x * std_normal_density x)) has_real_integral (--k)) (:real)` + ASSUME_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_NEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `k:real = &0` SUBST_ALL_TAC THENL + [SUBGOAL_THEN `k:real = --k` MP_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_UNIQUE THEN + EXISTS_TAC `\x:real. --(x * std_normal_density x)` THEN + EXISTS_TAC `(:real)` THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]);; + +(* Mean of standard normal - integral form *) +let STD_NORMAL_MEAN_ZERO_INTEGRAL = prove + (`real_integral (:real) (\x. x * std_normal_density x) = &0`, + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + REWRITE_TAC[STD_NORMAL_MEAN_ZERO]);; + +(* --- Helper lemmas for second moment proof --- *) + +(* Derivative of -x * exp(-x^2/2) *) +let DERIV_NEG_X_GAUSSIAN = prove + (`!x. ((\x. --x * exp(--(x pow 2 / &2))) has_real_derivative + ((x pow 2 - &1) * exp(--(x pow 2 / &2)))) (atreal x)`, + GEN_TAC THEN REAL_DIFF_TAC THEN CONV_TAC REAL_FIELD);; + +(* Integral of (x^2-1)*exp(-x^2/2) over (:real) is 0. + Proof: By FTC on [a,b], integral = F(b)-F(a) where F(x) = -x*exp(-x^2/2). + F(x) -> 0 as |x| -> infinity, so the integral is 0. *) +let X2_MINUS_1_GAUSSIAN_HAS_INTEGRAL_0 = prove + (`((\x. (x pow 2 - &1) * exp(--(x pow 2 / &2))) has_real_integral &0) + (:real)`, + REWRITE_TAC[HAS_REAL_INTEGRAL_ALT; IN_UNIV] THEN + CONJ_TAC THENL + [REPEAT GEN_TAC THEN + MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + ALL_TAC] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPECL [`&1 / &2`; `e:real`] GAUSSIAN_EXP_DECAY) THEN + CONV_TAC REAL_RAT_REDUCE_CONV THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `&1 / &2 * t pow 2 / &2 = t pow 2 / &4`] THEN + DISCH_THEN(X_CHOOSE_THEN `B:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN DISCH_TAC THEN + SUBGOAL_THEN `a <= --B /\ B <= b` STRIP_ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET_REAL_INTERVAL]) THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a <= b:real` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `real_integral (real_interval[a,b]) + (\x. (x pow 2 - &1) * exp(--(x pow 2 / &2))) = + (--b * exp(--(b pow 2 / &2))) - (--a * exp(--(a pow 2 / &2)))` + SUBST1_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS_INTERIOR THEN + ASM_REWRITE_TAC[DERIV_NEG_X_GAUSSIAN] THEN + MATCH_MP_TAC REAL_DIFFERENTIABLE_ON_IMP_REAL_CONTINUOUS_ON THEN + REWRITE_TAC[REAL_DIFFERENTIABLE_ON_DIFFERENTIABLE] THEN + REPEAT STRIP_TAC THEN REAL_DIFFERENTIABLE_TAC; + ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH + `abs fb < e / &2 /\ abs fa < e / &2 + ==> abs(fb - fa) < e`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `exp(--(b pow 2 / &4))` THEN CONJ_TAC THENL + [ONCE_REWRITE_TAC[REAL_ARITH `--b * x:real = --(b * x)`] THEN + REWRITE_TAC[REAL_ABS_NEG; ABS_X_GAUSSIAN_BOUND]; + SUBGOAL_THEN `&2 * exp(--(b pow 2 / &4)) < e` MP_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o SPEC `b:real`) THEN + ASM_REAL_ARITH_TAC; + MP_TAC(SPEC `b pow 2 / &4` REAL_EXP_POS_LE) THEN + REAL_ARITH_TAC]]; + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `exp(--(a pow 2 / &4))` THEN CONJ_TAC THENL + [ONCE_REWRITE_TAC[REAL_ARITH `--a * x:real = --(a * x)`] THEN + REWRITE_TAC[REAL_ABS_NEG; ABS_X_GAUSSIAN_BOUND]; + SUBGOAL_THEN `&2 * exp(--(a pow 2 / &4)) < e` MP_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o SPEC `a:real`) THEN + ASM_REAL_ARITH_TAC; + MP_TAC(SPEC `a pow 2 / &4` REAL_EXP_POS_LE) THEN + REAL_ARITH_TAC]]]);; + +(* x^2 * exp(-x^2/2) has integral sqrt(2*pi) over (:real). + Proof: x^2*exp = (x^2-1)*exp + exp, and integral of (x^2-1)*exp = 0, + integral of exp = sqrt(2*pi). *) +let X2_GAUSSIAN_HAS_INTEGRAL = prove + (`((\x. x pow 2 * exp(--(x pow 2 / &2))) has_real_integral sqrt(&2 * pi)) + (:real)`, + SUBGOAL_THEN + `(\x. x pow 2 * exp(--(x pow 2 / &2))) = + (\x. (x pow 2 - &1) * exp(--(x pow 2 / &2)) + + exp(--(x pow 2 / &2)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sqrt(&2 * pi) = &0 + sqrt(&2 * pi)` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[X2_MINUS_1_GAUSSIAN_HAS_INTEGRAL_0]; + MP_TAC(SPEC `&1` GAUSSIAN_INTEGRAL_SCALED) THEN + ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_LID; REAL_DIV_1]]);; + +(* Second moment of standard normal is 1 *) +let STD_NORMAL_SECOND_MOMENT = prove + (`((\x. x pow 2 * std_normal_density x) has_real_integral &1) (:real)`, + SUBGOAL_THEN + `(\x. x pow 2 * std_normal_density x) = + (\x. inv(sqrt(&2 * pi)) * (x pow 2 * exp(--(x pow 2 / &2))))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; std_normal_density] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&1 = inv(sqrt(&2 * pi)) * sqrt(&2 * pi)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_MUL_LINV THEN + MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN + MATCH_MP_TAC SQRT_POS_LT THEN + MP_TAC PI_POS THEN REAL_ARITH_TAC; + MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN + REWRITE_TAC[X2_GAUSSIAN_HAS_INTEGRAL]]);; + +(* Second moment integral form *) +let STD_NORMAL_SECOND_MOMENT_INTEGRAL = prove + (`real_integral (:real) (\x. x pow 2 * std_normal_density x) = &1`, + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]);; + +(* ========================================================================= *) +(* TIGHTNESS FROM BOUNDED SECOND MOMENTS *) +(* ========================================================================= *) + +(* Helper: |x| >= M iff x^2 >= M^2, for M >= 0 *) +let ABS_GE_IFF_POW2_GE = prove + (`!x M. &0 <= M ==> (abs(x) >= M <=> x pow 2 >= M pow 2)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_ge] THEN + SUBGOAL_THEN `M = abs(M:real)` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_LE_SQUARE_ABS; REAL_POW2_ABS]]);; + +(* Markov-type bound: P(|X| >= M) <= E[X^2] / M^2 *) +let MARKOV_SECOND_MOMENT = prove + (`!p:A prob_space (X:A->real) M. + simple_rv p X /\ &0 < M + ==> prob p {a | a IN prob_carrier p /\ abs(X a) >= M} <= + simple_expectation p (\x. X x pow 2) / M pow 2`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `{a:A | a IN prob_carrier p /\ abs((X:A->real) a) >= M} = + {a | a IN prob_carrier p /\ (\a. X a pow 2) a >= M pow 2}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + BETA_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC ABS_GE_IFF_POW2_GE THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (X:A->real) a pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_SQUARE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `a:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + ASM_SIMP_TAC[REAL_POW_LT]]);; + +(* Tightness from uniformly bounded second moments *) +let SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. simple_rv p (X n)) /\ + &0 < C /\ + (!n. simple_expectation p (\x. (X:num->A->real) n x pow 2) <= C) + ==> + !e. &0 < e ==> + ?M. &0 < M /\ + !n:num. + prob (p:A prob_space) {a | a IN prob_carrier p /\ + abs((X:num->A->real) n a) >= M} < e`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + ABBREV_TAC `M = sqrt(C / e) + &1` THEN + EXISTS_TAC `M:real` THEN + SUBGOAL_THEN `&0 <= sqrt(C / e)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN + MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `C / e < (M:real) pow 2` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sqrt(C / e) pow 2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC SQRT_POW_2 THEN + MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + MATCH_MP_TAC REAL_POW_LT2 THEN + ASM_REWRITE_TAC[ARITH_EQ] THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < (M:real) pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(C:real) / (M:real) pow 2 < e` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(e:real) * (C / e)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_EQ_IMP_LE THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC REAL_DIV_LMUL THEN + MATCH_MP_TAC REAL_LT_IMP_NZ THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + X_GEN_TAC `n:num` THEN + SUBGOAL_THEN + `prob (p:A prob_space) {a | a IN prob_carrier p /\ + abs((X:num->A->real) n a) >= M} <= + simple_expectation p (\x. X n x pow 2) / (M:real) pow 2` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`p:A prob_space`; `(X:num->A->real) n`; `M:real`] + MARKOV_SECOND_MOMENT) THEN + REWRITE_TAC[ETA_AX] THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[]; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. (X:num->A->real) n x pow 2) / + (M:real) pow 2 <= (C:real) / (M:real) pow 2` + ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(C:real) / (M:real) pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) (\x. (X:num->A->real) n x pow 2) / (M:real) pow 2` THEN + ASM_REWRITE_TAC[]);; + +(* Convergence set is measurable: the set of points where X_n -> L + pointwise is a measurable event. Proof: express the convergence set as + INTERS_k liminf_events (\n. {x | |X_n(x) - L(x)| < inv(k+1)}) and use + closure of sigma-algebras under countable operations. *) +let CONVERGENCE_SET_IN_EVENTS = prove + (`!p:A prob_space (X:num->A->real) (L:A->real). + (!n. random_variable p (X n)) /\ random_variable p L + ==> {x | x IN prob_carrier p /\ + ((\n. X n x) ---> L x) sequentially} IN prob_events p`, + REPEAT STRIP_TAC THEN + (* Step 1: Each {x | |X n x - L x| < inv(&k+1)} is an event *) + SUBGOAL_THEN `!n:num k:num. + {x:A | x IN prob_carrier p /\ + abs ((X:num->A->real) n x - (L:A->real) x) < inv(&k + &1)} + IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + abs ((X:num->A->real) n x - (L:A->real) x) < inv(&k + &1)} = + {x | x IN prob_carrier p /\ + --(inv(&k + &1)) < X n x - L x /\ X n x - L x < inv(&k + &1)}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_OPEN_INTERVAL THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + (* Step 2: Show convergence set = INTERS of liminf events *) + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + ((\n. (X:num->A->real) n x) ---> (L:A->real) x) sequentially} = + INTERS {liminf_events + (\n. {x:A | x IN prob_carrier p /\ + abs (X n x - L x) < inv(&k + &1)}) | k IN (:num)}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `w:A` THEN EQ_TAC THENL + [(* Forward: convergence => in INTERS of liminf *) + REWRITE_TAC[IN_ELIM_THM; IN_INTERS; FORALL_IN_GSPEC; IN_UNIV] THEN + STRIP_TAC THEN + X_GEN_TAC `k:num` THEN + REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN + UNDISCH_TAC + `((\n. (X:num->A->real) n (w:A)) ---> (L:A->real) w) sequentially` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `inv(&k + &1)`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN + X_GEN_TAC `nn:num` THEN REWRITE_TAC[GE] THEN DISCH_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + (* Backward: in INTERS of liminf => convergence *) + REWRITE_TAC[IN_INTERS; FORALL_IN_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + DISCH_TAC THEN + SUBGOAL_THEN `(w:A) IN prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `mm:num` (MP_TAC o SPEC `mm:num`)) THEN + REWRITE_TAC[GE; LE_REFL; IN_ELIM_THM] THEN SIMP_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e:real` REAL_ARCH_INV_SUC) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `k:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[LIMINF_EVENTS_ALT; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_TAC `mm:num`) THEN + EXISTS_TAC `mm:num` THEN + X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[GE]; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LT_TRANS THEN + EXISTS_TAC `inv(&k + &1)` THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 3: Show RHS is an event *) + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN + MATCH_MP_TAC LIMINF_EVENTS_IN_EVENTS THEN + GEN_TAC THEN ASM_REWRITE_TAC[]);; + +(* Helper: INTERS of tail unions SUBSET complement of convergence set *) +let INTERS_TAIL_UNIONS_SUBSET_COMPL = prove + (`!p:A prob_space (X:num->A->real) (L:A->real) (e:real). + &0 < e /\ + (!n. {x:A | x IN prob_carrier p /\ + abs (X n x - L x) >= e} IN prob_events p) + ==> + INTERS {UNIONS {{x:A | x IN prob_carrier p /\ + abs (X n' x - L x) >= e} | n' >= n} | n IN (:num)} + SUBSET + prob_carrier p DIFF + {x:A | x IN prob_carrier p /\ + ((\n. X n x) ---> L x) sequentially}`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[SUBSET; IN_INTERS; IN_DIFF; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + CONJ_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC + `UNIONS {{x:A | x IN prob_carrier (p:A prob_space) /\ + abs ((X:num->A->real) n' x - (L:A->real) x) >= e} | n' >= 0}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` + (CONJUNCTS_THEN2 (X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) MP_TAC)) THEN + FIRST_X_ASSUM SUBST1_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN SIMP_TAC[]; + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC `e:real`)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + FIRST_ASSUM(MP_TAC o SPEC + `UNIONS {{x:A | x IN prob_carrier (p:A prob_space) /\ + abs ((X:num->A->real) n' x - (L:A->real) x) >= e} | n' >= N}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `N:num` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` + (CONJUNCTS_THEN2 (X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) MP_TAC)) THEN + FIRST_X_ASSUM SUBST1_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + UNDISCH_TAC `m >= N:num` THEN REWRITE_TAC[GE] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC]);; + +(* ========================================================================= *) +(* SUBSEQUENCE CONVERGENCE TOOLS *) +(* ========================================================================= *) + +(* Every bounded real sequence has a convergent subsequence *) +let BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ = prove + (`!f:num->real b. + (!n. abs(f n) <= b) + ==> ?l r. (!m n. m < n ==> r m < r n) /\ + ((\k. f(r k)) ---> l) sequentially`, + REPEAT STRIP_TAC THEN + MP_TAC(SPEC `f:num->real` MONOTONE_SUBSEQUENCE) THEN + DISCH_THEN(X_CHOOSE_THEN `r:num->num` + (CONJUNCTS_THEN2 ASSUME_TAC DISJ_CASES_TAC)) THENL + [MP_TAC(SPECL [`\k:num. (f:num->real)(r k)`; `b:real`] + CONVERGENT_BOUNDED_MONOTONE) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[]; + DISJ1_TAC THEN ASM_MESON_TAC[LE_REFL; NOT_LT; LT_IMP_LE]]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(X_CHOOSE_TAC `l:real`) THEN + EXISTS_TAC `l:real` THEN EXISTS_TAC `r:num->num` THEN + ASM_REWRITE_TAC[REALLIM_SEQUENTIALLY]; + MP_TAC(SPECL [`\k:num. (f:num->real)(r k)`; `b:real`] + CONVERGENT_BOUNDED_MONOTONE) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[]; + DISJ2_TAC THEN ASM_MESON_TAC[LE_REFL; NOT_LT; LT_IMP_LE]]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(X_CHOOSE_TAC `l:real`) THEN + EXISTS_TAC `l:real` THEN EXISTS_TAC `r:num->num` THEN + ASM_REWRITE_TAC[REALLIM_SEQUENTIALLY]]);; + +(* Extract strictly increasing sequence from cofinal property *) +let INFINITE_EXTRACT_SUBSEQ = prove + (`!P:num->bool. (!N:num. ?n. N <= n /\ P n) + ==> ?r:num->num. (!m n. m < n ==> r m < r n) /\ (!k. P (r k))`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `!m:num. ?n. m < n /\ (P:num->bool) n` ASSUME_TAC THENL + [GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `m + 1`) THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `!m:num. m < (@n. m < n /\ (P:num->bool) n) /\ P(@n. m < n /\ P n)` + ASSUME_TAC THENL + [GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `w:num` STRIP_ASSUME_TAC) THEN + MP_TAC(ISPECL [`\n:num. m < n /\ (P:num->bool) n`; `w:num`] SELECT_AX) THEN + BETA_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`@n:num. 0 < n /\ P n`; + `\(prev:num) (k:num). @n:num. prev < n /\ P n`] num_RECURSION) THEN + DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `r:num->num` THEN + SUBGOAL_THEN `!k:num. (r:num->num) k < r(SUC k)` ASSUME_TAC THENL + [INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC TRANSITIVE_STEPWISE_LT THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + INDUCT_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; + +(* Subsequence convergence principle: + If every subsequence has a sub-subsequence converging to L, + then the full sequence converges to L *) +let REALLIM_SUBSEQ_SAME_LIMIT = prove + (`!f:num->real L b. + (!n. abs(f n) <= b) /\ + (!r:num->num. (!m n. m < n ==> r m < r n) + ==> ?s:num->num. (!m n. m < n ==> s m < s n) /\ + ((\k. f(r(s k))) ---> L) sequentially) + ==> (f ---> L) sequentially`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + ASM_CASES_TAC `?N:num. !n. N <= n ==> abs((f:num->real) n - L) < e` THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!N:num. ?n. N <= n /\ ~(abs((f:num->real) n - L) < e)` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `?r1:num->num. (!m n:num. m < n ==> r1 m < r1 n) /\ + (!k:num. ~(abs((f:num->real)(r1 k) - L) < e))` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPEC `\n:num. ~(abs((f:num->real) n - L) < e)` INFINITE_EXTRACT_SUBSEQ) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `r1:num->num`) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `s1:num->num` STRIP_ASSUME_TAC) THEN + UNDISCH_TAC + `((\k:num. (f:num->real)((r1:num->num)((s1:num->num) k))) ---> (L:real)) sequentially` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `M:num`) THEN + REWRITE_TAC[LE_REFL] THEN BETA_TAC THEN + ASM_MESON_TAC[]);; + + +(* ========================================================================= *) +(* LIMIT IDENTIFICATION TOOLS *) +(* ========================================================================= *) + +(* General lemma: if f is continuous at x and f(x-h) <= l <= f(x+h) + for all h > 0, then l = f(x). *) +let CONTINUOUS_LIMIT_SANDWICH = prove + (`!f x l. f real_continuous (atreal x) /\ + (!h. &0 < h ==> f(x - h) <= l /\ l <= f(x + h)) + ==> l = f x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `a <= l /\ l <= a ==> l = a`) THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + UNDISCH_TAC `(f:real->real) real_continuous (atreal x)` THEN + REWRITE_TAC[real_continuous_atreal] THEN + DISCH_THEN(MP_TAC o SPEC `(f:real->real) x - l`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x - d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + UNDISCH_TAC `(f:real->real) real_continuous (atreal x)` THEN + REWRITE_TAC[real_continuous_atreal] THEN + DISCH_THEN(MP_TAC o SPEC `l - (f:real->real) x`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x + d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REAL_ARITH_TAC]);; + +(* Strictly increasing num->num satisfies r(k) >= k *) +let STRICTLY_INCREASING_GE = prove + (`!(r:num->num). (!m n. m < n ==> r m < r n) ==> !k. k <= r k`, + GEN_TAC THEN DISCH_TAC THEN INDUCT_TAC THENL + [ARITH_TAC; + FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `SUC k`]) THEN + REWRITE_TAC[LT] THEN ASM_ARITH_TAC]);; + +(* Subsequences of convergent real sequences converge to the same limit *) +let REALLIM_SUBSEQUENCE = prove + (`!(f:num->real) l (r:num->num). + (f ---> l) sequentially /\ (!m n. m < n ==> r m < r n) + ==> ((\k. f(r k)) ---> l) sequentially`, + REPEAT GEN_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN STRIP_TAC THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MP_TAC(SPEC `r:num->num` STRICTLY_INCREASING_GE) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + ASM_ARITH_TAC);; + +(* ---- Helper lemmas for the sandwich argument ---- *) + +(* CDF as expectation of indicator *) +let SIMPLE_CDF_AS_EXPECTATION = prove + (`!p:A prob_space (X:A->real) x. + simple_rv p X + ==> simple_cdf p X x = + simple_expectation p (\a. if X a <= x then &1 else &0)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_cdf] THEN + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\a:A. if (X:A->real) a <= x then &1 else &0) = + simple_expectation p (indicator_fn {a | a IN prob_carrier p /\ X a <= x})` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR THEN + FIRST_ASSUM(MP_TAC o CONJUNCT1 o GEN_REWRITE_RULE I [simple_rv]) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]);; + +(* E[g(X)] <= F(x) when g(y) <= 1 for y<=x and g(y) <= 0 for y>x *) +let SIMPLE_EXPECTATION_LE_CDF = prove + (`!p:A prob_space (X:A->real) (g:real->real) x. + simple_rv p X /\ + (!y. y <= x ==> g y <= &1) /\ + (!y. y > x ==> g y <= &0) + ==> simple_expectation p (\a. g(X a)) <= simple_cdf p X x`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(fun th -> + MP_TAC(SPEC `x:real` (MATCH_MP SIMPLE_CDF_AS_EXPECTATION th))) THEN + DISCH_THEN SUBST1_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\a:A. (g:real->real) ((X:A->real) a)`; + `\a:A. if (X:A->real) a <= x then &1 else &0`] + SIMPLE_EXPECTATION_MONO) THEN + BETA_TAC THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; + `\y:real. if y <= x then &1 else &0`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + ASM_CASES_TAC `(X:A->real) a <= x` THENL + [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; REAL_ARITH_TAC]]; + SIMP_TAC[]]);; + +(* F(x) <= E[g(X)] when g(y) >= 1 for y<=x and g(y) >= 0 for y>x *) +let SIMPLE_CDF_LE_EXPECTATION = prove + (`!p:A prob_space (X:A->real) (g:real->real) x. + simple_rv p X /\ + (!y. y <= x ==> &1 <= g y) /\ + (!y. y > x ==> &0 <= g y) + ==> simple_cdf p X x <= simple_expectation p (\a. g(X a))`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(fun th -> + MP_TAC(SPEC `x:real` (MATCH_MP SIMPLE_CDF_AS_EXPECTATION th))) THEN + DISCH_THEN SUBST1_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\a:A. if (X:A->real) a <= x then &1 else &0`; + `\a:A. (g:real->real) ((X:A->real) a)`] + SIMPLE_EXPECTATION_MONO) THEN + BETA_TAC THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; + `\y:real. if y <= x then &1 else &0`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + ASM_CASES_TAC `(X:A->real) a <= x` THENL + [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REAL_ARITH_TAC]; + SIMP_TAC[]]);; + +(* Standard normal density is continuous at every point *) +let STD_NORMAL_DENSITY_CONTINUOUS = prove + (`!x. std_normal_density real_continuous atreal x`, + GEN_TAC THEN + SUBGOAL_THEN `std_normal_density = + (\x. inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; std_normal_density]; ALL_TAC] THEN + MATCH_MP_TAC REAL_CONTINUOUS_LMUL THEN + MP_TAC(ISPECL [`\x:real. --(x pow 2 / &2)`; `exp`; `x:real`] + (REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ATREAL_COMPOSE)) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_NEG THEN + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_POW THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; REAL_ARITH_TAC]]; + REWRITE_TAC[REAL_CONTINUOUS_AT_EXP]]);; + +(* Product of bounded continuous function with density is integrable *) +let BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE = prove + (`!g:real->real. + (!y. g real_continuous atreal y) /\ + (?B. !y. abs(g y) <= B) + ==> (\y. g y * std_normal_density y) real_integrable_on (:real)`, + GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(X_CHOOSE_THEN `B:real` ASSUME_TAC) THEN + MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN + EXISTS_TAC `\y:real. B * std_normal_density y` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_IMP_REAL_MEASURABLE_ON_CLOSED_SUBSET THEN + CONJ_TAC THENL + [REWRITE_TAC[MATCH_MP REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT + REAL_OPEN_UNIV; IN_UNIV] THEN + GEN_TAC THEN + MATCH_MP_TAC REAL_CONTINUOUS_MUL THEN + ASM_REWRITE_TAC[STD_NORMAL_DENSITY_CONTINUOUS]; + REWRITE_TAC[REAL_CLOSED_UNIV]]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE]; + ALL_TAC] THEN + GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(std_normal_density x) = std_normal_density x` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL; STD_NORMAL_DENSITY_NONNEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN + ASM_REWRITE_TAC[]);; + +(* ========================================================================= *) +(* DENSITY SYMMETRY AND FOURIER TRANSFORM PROPERTIES *) +(* ========================================================================= *) + +(* std_normal_density is an even function *) +let STD_NORMAL_DENSITY_EVEN = prove + (`!y. std_normal_density(--y) = std_normal_density y`, + GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[REAL_POW_NEG; ARITH]);; + +(* Reflection of the whole real line is itself *) +let IMAGE_NEG_UNIV = prove + (`IMAGE (--) (:real) = (:real)`, + REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN EXISTS_TAC `--x:real` THEN + REWRITE_TAC[REAL_NEG_NEG]);; + +(* sin(ty) * density is integrable *) +let SIN_DENSITY_INTEGRABLE = prove + (`!t. (\y. sin(t * y) * std_normal_density y) real_integrable_on (:real)`, + GEN_TAC THEN + MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN + CONJ_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`\y:real. t * y`; `sin`; `y:real`] + (REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ATREAL_COMPOSE)) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_LMUL THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID]; + REWRITE_TAC[REAL_CONTINUOUS_AT_SIN]]; + EXISTS_TAC `&1` THEN REWRITE_TAC[SIN_BOUND]]);; + +(* ========================================================================= *) +(* WEAK CONVERGENCE FROM CHAR FN CONVERGENCE *) +(* ========================================================================= *) + +(* Weak convergence from characteristic function convergence. + This is the portmanteau theorem direction: char fn convergence + tightness + implies weak convergence (convergence of expectations of bounded + continuous functions). + + Proof approach: For bounded continuous g, eps > 0: + 1. Tightness gives M with P(|X_n| > M) small + 2. Trig polynomial T approximates g on [-M,M] (Weierstrass) + 3. E[T(X_n)] -> int(T*density) by char fn hypothesis + Gaussian FT + 4. Errors from approximation + tails controlled by eps argument + + Key sub-lemma: trigonometric polynomial approximation on compact + intervals. Uses WEIERSTRASS_TRIG_POLYNOMIAL (from fourier.ml) for + approximation on [-pi,pi], then scales by B/(B+eps/2) to get global + bound |T| <= B while preserving approximation quality. *) + +(* Periodicity of sin and cos with natural number multiples of 2*pi *) +let SIN_PERIODIC_N = prove + (`!k:num. !x. sin(x + &2 * &k * pi) = sin(x)`, + INDUCT_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; + GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; + REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN + REWRITE_TAC[REAL_ADD_ASSOC; SIN_PERIODIC] THEN ASM_REWRITE_TAC[]]);; + +let COS_PERIODIC_N = prove + (`!k:num. !x. cos(x + &2 * &k * pi) = cos(x)`, + INDUCT_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; + GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; + REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN + REWRITE_TAC[REAL_ADD_ASSOC; COS_PERIODIC] THEN ASM_REWRITE_TAC[]]);; + +(* A 2*pi-periodic function bounded on [-pi,pi] is bounded everywhere *) +let PERIODIC_REAL_BOUND = prove + (`!(fn:real->real) (B:real). (!x. fn(x + &2 * pi) = fn x) /\ + (!x. x IN real_interval[--pi,pi] ==> abs(fn x) <= B) + ==> !x. abs(fn x) <= B`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < &2 * pi` ASSUME_TAC THENL + [MP_TAC PI_POS THEN REAL_ARITH_TAC; ALL_TAC] THEN + (* Shift x into [-pi, pi] *) + (* Step 1: find N such that x + 2*N*pi > 0 *) + MP_TAC(SPEC `--(x:real)` (MATCH_MP (SPEC `&2 * pi` REAL_ARCH) + (ASSUME `&0 < &2 * pi`))) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + ABBREV_TAC `y = x + &2 * &N * pi` THEN + SUBGOAL_THEN `&0 < (y:real)` ASSUME_TAC THENL + [EXPAND_TAC "y" THEN + UNDISCH_TAC `--(x:real) < &N * (&2 * pi)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 2: find m such that y - 2*m*pi in [-pi, pi] *) + MP_TAC(SPEC `(y:real) - pi` (MATCH_MP (SPEC `&2 * pi` REAL_ARCH) + (ASSUME `&0 < &2 * pi`))) THEN + DISCH_THEN(X_CHOOSE_TAC `K:num`) THEN + MP_TAC(fst(EQ_IMP_RULE(BETA_RULE + (SPEC `\m:num. (y:real) - &2 * &m * pi < pi` num_WOP)))) THEN + ANTS_TAC THENL + [EXISTS_TAC `K:num` THEN + UNDISCH_TAC `(y:real) - pi < &K * (&2 * pi)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `m0:num` STRIP_ASSUME_TAC) THEN + (* fn(x) = fn(y) by forward periodicity *) + SUBGOAL_THEN `(fn:real->real) x = fn y` SUBST1_TAC THENL + [EXPAND_TAC "y" THEN + SUBGOAL_THEN `!n:num. !z:real. (fn:real->real)(z) = fn(z + &2 * &n * pi)` + MP_TAC THENL + [INDUCT_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; + GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; + REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN + REWRITE_TAC[REAL_ADD_ASSOC] THEN + ONCE_REWRITE_TAC[ASSUME + `!x:real. (fn:real->real)(x + &2 * pi) = fn x`] THEN + ASM_MESON_TAC[]]; + DISCH_THEN(MP_TAC o SPECL [`N:num`; `x:real`]) THEN + MESON_TAC[]]; ALL_TAC] THEN + (* fn(y) = fn(y - 2*m0*pi) by backward periodicity *) + SUBGOAL_THEN `(fn:real->real) y = fn(y - &2 * &m0 * pi)` SUBST1_TAC THENL + [SUBGOAL_THEN `!n:num. !z:real. (fn:real->real)(z) = fn(z + &2 * &n * pi)` + MP_TAC THENL + [INDUCT_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; + GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; + REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN + REWRITE_TAC[REAL_ADD_ASSOC] THEN + ONCE_REWRITE_TAC[ASSUME + `!x:real. (fn:real->real)(x + &2 * pi) = fn x`] THEN + ASM_MESON_TAC[]]; + DISCH_THEN(MP_TAC o SPECL [`m0:num`; `(y:real) - &2 * &m0 * pi`]) THEN + REWRITE_TAC[REAL_SUB_ADD] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* y - 2*m0*pi in [-pi, pi] *) + FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + ASM_CASES_TAC `m0 = 0` THENL + [SUBGOAL_THEN `(y:real) < pi` ASSUME_TAC THENL + [UNDISCH_TAC `(y:real) - &2 * &m0 * pi < pi` THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_SUB_RZERO]; + ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_SUB_RZERO] THEN + MP_TAC(ASSUME `&0 < (y:real)`) THEN + MP_TAC(ASSUME `(y:real) < pi`) THEN + MP_TAC PI_POS THEN REAL_ARITH_TAC; + SUBGOAL_THEN `--pi <= (y:real) - &2 * &m0 * pi` MP_TAC THENL + [SUBGOAL_THEN `1 <= m0` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m0 - 1`) THEN + ASM_SIMP_TAC[ARITH_RULE `1 <= m ==> m - 1 < m`] THEN + REWRITE_TAC[REAL_NOT_LT] THEN + ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB] THEN + REAL_ARITH_TAC; + UNDISCH_TAC `(y:real) - &2 * &m0 * pi < pi` THEN + REAL_ARITH_TAC]]);; + +let SCALED_APPROX_BOUND = prove + (`!h s c e2. + abs(h - s) < e2 /\ (&1 - c) * abs(s) <= e2 /\ &0 <= &1 - c + ==> abs(h - c * s) < e2 + e2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(h:real) - c * s = (h - s) + (&1 - c) * s` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs((h:real) - s) + abs((&1 - c) * s)` THEN + REWRITE_TAC[REAL_ABS_TRIANGLE] THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(&1 - c) = &1 - c` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +let BOUNDED_CONTINUOUS_TRIG_APPROX = prove + (`!g:real->real B M e. + (!y. g real_continuous atreal y) /\ (!y. abs(g y) <= B) /\ + &0 < B /\ &0 < M /\ &0 < e + ==> ?n:num a b f. + (!y. abs(y) <= M + ==> abs(g y - sum(0..n) (\k. a k * cos(f k * y) + + b k * sin(f k * y))) < e) /\ + (!y. abs(sum(0..n) (\k. a k * cos(f k * y) + + b k * sin(f k * y))) <= B)`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `L = M + &1` THEN + SUBGOAL_THEN `&0 < L /\ ~(L = &0)` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "L" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC PI_POS THEN DISCH_TAC THEN + SUBGOAL_THEN `~(pi = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Define h on [-pi, pi]: h(t) = g(L*t/pi) * window(t) *) + ABBREV_TAC + `h = \t. (g:real->real)(L * t / pi) * + max (&0) (min (&1) (L * (pi - abs t) / pi))` THEN + (* h continuous on [-pi, pi] *) + SUBGOAL_THEN + `(h:real->real) real_continuous_on real_interval[--pi, pi]` + ASSUME_TAC THENL + [EXPAND_TAC "h" THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC(REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ON_COMPOSE) THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(\t:real. L * t / pi) = (\t. (L / pi) * t)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_ID]]; + MATCH_MP_TAC REAL_CONTINUOUS_ON_SUBSET THEN + EXISTS_TAC `(:real)` THEN REWRITE_TAC[SUBSET_UNIV] THEN + SIMP_TAC[REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT; + REAL_OPEN_UNIV; IN_UNIV] THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_CONTINUOUS_ON_MAX THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_MIN THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN + SUBGOAL_THEN `(\t:real. L * (pi - abs t) / pi) = + (\t. (L / pi) * (pi - abs t))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN + GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_ABS THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_ID]]]; + ALL_TAC] THEN + (* h(-pi) = h(pi) *) + SUBGOAL_THEN `(h:real->real)(--pi) = h(pi)` ASSUME_TAC THENL + [EXPAND_TAC "h" THEN + SUBGOAL_THEN `abs(pi) = pi /\ abs(--pi) = pi` + (fun th -> REWRITE_TAC[th]) THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO] THEN + SUBGOAL_THEN `&0 / pi = &0` (fun th -> REWRITE_TAC[th]) THENL + [ASM_SIMP_TAC[REAL_DIV_EQ_0; REAL_LT_IMP_NZ]; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* |h(t)| <= B on [-pi, pi] *) + SUBGOAL_THEN `!t. t IN real_interval[--pi,pi] ==> abs(h t) <= B` + ASSUME_TAC THENL + [X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + DISCH_TAC THEN EXPAND_TAC "h" THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `B * &1` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN CONJ_TAC THENL + [ASM_MESON_TAC[]; REAL_ARITH_TAC]; REAL_ARITH_TAC]; + ALL_TAC] THEN + (* h(pi*y/L) = g(y) for |y| <= M *) + SUBGOAL_THEN `!y. abs y <= M ==> h(pi * y / L) = (g:real->real) y` + ASSUME_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN EXPAND_TAC "h" THEN + SUBGOAL_THEN `L * (pi * y / L) / pi = y` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_FIELD + `&0 < p /\ &0 < L ==> L * (p * y / L) / p = y`) THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(pi * y / L) = pi * abs y / L` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs pi = pi` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs L = L` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REFL_TAC; ALL_TAC] THEN + SUBGOAL_THEN `L * (pi - pi * abs y / L) / pi = L - abs y` + SUBST1_TAC THENL + [SUBGOAL_THEN `pi - pi * abs y / L = pi * (&1 - abs y / L)` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_SUB_LDISTRIB; REAL_MUL_RID]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_FIELD + `~(p = &0) /\ ~(q = &0) ==> q * (p * (&1 - y / q)) / p = q - y`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&1 <= L - abs y` ASSUME_TAC THENL + [EXPAND_TAC "L" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `min (&1) (L - abs y) = &1` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Apply WEIERSTRASS_TRIG_POLYNOMIAL with e/2 *) + MP_TAC(SPECL [`h:real->real`; `e / &2`] WEIERSTRASS_TRIG_POLYNOMIAL) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` (X_CHOOSE_THEN `aw:num->real` + (X_CHOOSE_THEN `bw:num->real` ASSUME_TAC))) THEN + (* |T(x)| <= B + e/2 on [-pi,pi] *) + SUBGOAL_THEN + `!x. x IN real_interval[--pi,pi] + ==> abs(sum(0..N) (\k. aw k * sin(&k * x) + + bw k * cos(&k * x))) < B + e / &2` + ASSUME_TAC THENL + [X_GEN_TAC `x:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `abs((h:real->real) x) <= B` MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `abs(h x - sum(0..N) (\k. aw k * sin(&k * x) + + bw k * cos(&k * x))) < e / &2` MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + (* T is 2*pi periodic *) + SUBGOAL_THEN + `!x. sum(0..N) (\k. aw k * sin(&k * (x + &2 * pi)) + + bw k * cos(&k * (x + &2 * pi))) = + sum(0..N) (\k. aw k * sin(&k * x) + bw k * cos(&k * x))` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SUM_EQ THEN + REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ARITH `k * (x + &2 * p) = k * x + &2 * k * p`] THEN + REWRITE_TAC[SIN_PERIODIC_N; COS_PERIODIC_N]; ALL_TAC] THEN + (* |T(x)| <= B + e/2 on ALL of R (by periodicity) *) SUBGOAL_THEN - `simple_expectation (p:A prob_space) (\a:A. if (X:A->real) a <= x then &1 else &0) = - simple_expectation p (indicator_fn {a | a IN prob_carrier p /\ X a <= x})` - SUBST1_TAC THENL - [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN - X_GEN_TAC `a:A` THEN DISCH_TAC THEN - REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR THEN - FIRST_ASSUM(MP_TAC o CONJUNCT1 o GEN_REWRITE_RULE I [simple_rv]) THEN - REWRITE_TAC[random_variable] THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]);; - -(* E[g(X)] <= F(x) when g(y) <= 1 for y<=x and g(y) <= 0 for y>x *) -let EXPECTATION_LE_CDF = prove - (`!p:A prob_space (X:A->real) (g:real->real) x. - simple_rv p X /\ - (!y. y <= x ==> g y <= &1) /\ - (!y. y > x ==> g y <= &0) - ==> simple_expectation p (\a. g(X a)) <= simple_cdf p X x`, - REPEAT STRIP_TAC THEN - FIRST_ASSUM(fun th -> - MP_TAC(SPEC `x:real` (MATCH_MP SIMPLE_CDF_AS_EXPECTATION th))) THEN - DISCH_THEN SUBST1_TAC THEN - MP_TAC(ISPECL - [`p:A prob_space`; - `\a:A. (g:real->real) ((X:A->real) a)`; - `\a:A. if (X:A->real) a <= x then &1 else &0`] - SIMPLE_EXPECTATION_MONO) THEN - BETA_TAC THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN + `!x. abs(sum(0..N) (\k. aw k * sin(&k * x) + + bw k * cos(&k * x))) <= B + e / &2` + ASSUME_TAC THENL + [MATCH_MP_TAC PERIODIC_REAL_BOUND THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + X_GEN_TAC `u:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_MESON_TAC[]]; ALL_TAC] THEN + (* Scale factor c = B / (B + e/2) *) + ABBREV_TAC `c = B / (B + e / &2)` THEN + SUBGOAL_THEN `&0 < B + e / &2` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(B + e / &2 = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < c` ASSUME_TAC THENL + [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_LT_DIV]; ALL_TAC] THEN + SUBGOAL_THEN `c < &1` ASSUME_TAC THENL + [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `c * (B + e / &2) = B` ASSUME_TAC THENL + [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_DIV_RMUL]; ALL_TAC] THEN + (* Provide witnesses: n=N, a(k)=c*bw(k), b(k)=c*aw(k), f(k)=k*pi/L *) + MAP_EVERY EXISTS_TAC + [`N:num`; `\k:num. (c:real) * (bw:num->real) k`; + `\k:num. (c:real) * (aw:num->real) k`; + `\k:num. &k * pi / (L:real)`] THEN + (* Rewrite the trig polynomial *) + SUBGOAL_THEN + `!y. sum(0..N) (\k. (c * bw k) * cos ((&k * pi / L) * y) + + (c * aw k) * sin ((&k * pi / L) * y)) = + c * sum(0..N) (\k. aw k * sin(&k * (pi * y / L)) + + bw k * cos(&k * (pi * y / L)))` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[GSYM SUM_LMUL] THEN + MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN + REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + REWRITE_TAC[REAL_MUL_AC] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* Approximation: |g(y) - c*T(pi*y/L)| < e for |y| <= M *) + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `pi * y / L IN real_interval[--pi,pi]` ASSUME_TAC THENL + [REWRITE_TAC[IN_REAL_INTERVAL] THEN + SUBGOAL_THEN `abs(pi * y / L) <= pi * M / L` MP_TAC THENL + [REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs pi = pi` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs L = L` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LE_LMUL_EQ]; + SUBGOAL_THEN `pi * M / L < pi` MP_TAC THENL + [REWRITE_TAC[REAL_ARITH `p * M / L < p <=> &0 < p * (&1 - M / L)`] THEN + MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "L" THEN + ASM_SIMP_TAC[REAL_SUB_LT; REAL_LT_LDIV_EQ; + REAL_ARITH `&0 < M ==> &0 < M + &1`; + REAL_MUL_LID] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]]; ALL_TAC] THEN + (* g(y) = h(pi*y/L), then use WEIERSTRASS and SCALED_APPROX_BOUND *) + SUBGOAL_THEN `(g:real->real) y = h(pi * y / L)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `x < e / &2 + e / &2 ==> x < (e:real)`) THEN + MATCH_MP_TAC SCALED_APPROX_BOUND THEN + REPEAT CONJ_TAC THENL + [ASM_MESON_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&1 - c) * (B + e / &2)` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[]]; + SUBGOAL_THEN `(&1 - c) * (B + e / &2) = e / &2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ARITH `(&1 - c) * x = x - c * x`] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; REWRITE_TAC[REAL_LE_REFL]]]; + ASM_REAL_ARITH_TAC]; + (* Global bound: |c*T(pi*y/L)| <= B for all y *) + X_GEN_TAC `y:real` THEN REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs c = c` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `c * (B + e / &2)` THEN CONJ_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; - `\y:real. if y <= x then &1 else &0`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; - ALL_TAC] THEN - X_GEN_TAC `a:A` THEN DISCH_TAC THEN - ASM_CASES_TAC `(X:A->real) a <= x` THENL - [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN CONJ_TAC THENL - [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; REAL_ARITH_TAC]]; - SIMP_TAC[]]);; + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[]]; + ASM_REWRITE_TAC[REAL_LE_REFL]]]);; -(* F(x) <= E[g(X)] when g(y) >= 1 for y<=x and g(y) >= 0 for y>x *) -let CDF_LE_EXPECTATION = prove - (`!p:A prob_space (X:A->real) (g:real->real) x. - simple_rv p X /\ - (!y. y <= x ==> &1 <= g y) /\ - (!y. y > x ==> &0 <= g y) - ==> simple_cdf p X x <= simple_expectation p (\a. g(X a))`, + +(* Expectation of a single trig term a*cos(f*X) + b*sin(f*X) decomposes + into char fn values *) +let SIMPLE_EXPECTATION_TRIG_TERM = prove + (`!p:A prob_space (Y:A->real) a b t. + simple_rv p Y + ==> simple_expectation p (\x. a * cos(t * Y x) + b * sin(t * Y x)) = + a * simple_char_fn_re p Y t + b * simple_char_fn_im p Y t`, REPEAT STRIP_TAC THEN - FIRST_ASSUM(fun th -> - MP_TAC(SPEC `x:real` (MATCH_MP SIMPLE_CDF_AS_EXPECTATION th))) THEN - DISCH_THEN SUBST1_TAC THEN - MP_TAC(ISPECL - [`p:A prob_space`; - `\a:A. if (X:A->real) a <= x then &1 else &0`; - `\a:A. (g:real->real) ((X:A->real) a)`] - SIMPLE_EXPECTATION_MONO) THEN + REWRITE_TAC[simple_char_fn_re; simple_char_fn_im] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (Y:A->real) x))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `\y:real. cos(t * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. sin(t * (Y:A->real) x))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `\y:real. sin(t * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + (* E[a*cos + b*sin] = E[a*cos] + E[b*sin] *) + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. a * cos(t * (Y:A->real) x)`; + `\x:A. b * sin(t * (Y:A->real) x)`] + SIMPLE_EXPECTATION_ADD) THEN BETA_TAC THEN ANTS_TAC THENL [CONJ_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; - `\y:real. if y <= x then &1 else &0`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; - ALL_TAC] THEN - CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - X_GEN_TAC `a:A` THEN DISCH_TAC THEN - ASM_CASES_TAC `(X:A->real) a <= x` THENL - [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN - ASM_REAL_ARITH_TAC]; - SIMP_TAC[]]);; - -(* Standard normal density is continuous at every point *) -let STD_NORMAL_DENSITY_CONTINUOUS = prove - (`!x. std_normal_density real_continuous atreal x`, - GEN_TAC THEN - SUBGOAL_THEN `std_normal_density = - (\x. inv(sqrt(&2 * pi)) * exp(--(x pow 2 / &2)))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; std_normal_density]; ALL_TAC] THEN - MATCH_MP_TAC REAL_CONTINUOUS_LMUL THEN - MP_TAC(ISPECL [`\x:real. --(x pow 2 / &2)`; `exp`; `x:real`] - (REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ATREAL_COMPOSE)) THEN - BETA_TAC THEN - DISCH_THEN MATCH_MP_TAC THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_NEG THEN - MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_POW THEN - REWRITE_TAC[REAL_CONTINUOUS_AT_ID]; - CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; REAL_ARITH_TAC]]; - REWRITE_TAC[REAL_CONTINUOUS_AT_EXP]]);; + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. cos(t * (Y:A->real) x)`; `a:real`] + SIMPLE_RV_CMUL) THEN + BETA_TAC THEN ASM_SIMP_TAC[]; + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sin(t * (Y:A->real) x)`; `b:real`] + SIMPLE_RV_CMUL) THEN + BETA_TAC THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + (* E[a*cos] = a * E[cos] *) + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. cos(t * (Y:A->real) x)`; `a:real`] + SIMPLE_EXPECTATION_CMUL) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + (* E[b*sin] = b * E[sin] *) + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sin(t * (Y:A->real) x)`; `b:real`] + SIMPLE_EXPECTATION_CMUL) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + REFL_TAC);; -(* Product of bounded continuous function with density is integrable *) -let BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE = prove - (`!g:real->real. - (!y. g real_continuous atreal y) /\ - (?B. !y. abs(g y) <= B) - ==> (\y. g y * std_normal_density y) real_integrable_on (:real)`, - GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN - DISCH_THEN(X_CHOOSE_THEN `B:real` ASSUME_TAC) THEN - MATCH_MP_TAC REAL_MEASURABLE_BOUNDED_BY_INTEGRABLE_IMP_INTEGRABLE THEN - EXISTS_TAC `\y:real. B * std_normal_density y` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_IMP_REAL_MEASURABLE_ON_CLOSED_SUBSET THEN - CONJ_TAC THENL - [REWRITE_TAC[MATCH_MP REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT - REAL_OPEN_UNIV; IN_UNIV] THEN - GEN_TAC THEN - MATCH_MP_TAC REAL_CONTINUOUS_MUL THEN - ASM_REWRITE_TAC[STD_NORMAL_DENSITY_CONTINUOUS]; - REWRITE_TAC[REAL_CLOSED_UNIV]]; +(* Trig polynomial expectations converge to the Gaussian integral. + Key intermediate lemma for weak convergence. *) +let SIMPLE_TRIG_POLY_WEAK_CONVERGENCE = prove + (`!p:A prob_space (X:num->A->real) m (a:num->real) (b:num->real) (freq:num->real). + (!n. simple_rv p (X n)) /\ + (!t. ((\n. simple_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + sequentially) /\ + (!t. ((\n. simple_char_fn_im p (X n) t) ---> &0) sequentially) + ==> ((\n. simple_expectation p + (\x. sum(0..m) (\k. a k * cos(freq k * X n x) + + b k * sin(freq k * X n x)))) ---> + sum(0..m) (\k. a k * exp(--(freq k pow 2 / &2)))) + sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: E[trig_poly(X_n)] = sum of char fn values for each n (admitted) *) + SUBGOAL_THEN + `!n:num. simple_expectation (p:A prob_space) + (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x))) = + sum(0..m) (\k. a k * simple_char_fn_re p (X n) (freq k) + + b k * simple_char_fn_im p (X n) (freq k))` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x)`; + `m:num`] + SIMPLE_EXPECTATION_SUM_NUMSEG) THEN + BETA_TAC THEN + ANTS_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + (* Need: simple_rv p (\x. a i * cos(freq i * X n x) + b i * sin(freq i * X n x)) *) + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `\y:real. cos((freq:num->real) i * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `\y:real. sin((freq:num->real) i * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. cos((freq:num->real) i * (X:num->A->real) n x)`; + `(a:num->real) i`] SIMPLE_RV_CMUL) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sin((freq:num->real) i * (X:num->A->real) n x)`; + `(b:num->real) i`] SIMPLE_RV_CMUL) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (a:num->real) i * cos((freq:num->real) i * (X:num->A->real) n x)`; + `\x:A. (b:num->real) i * sin((freq:num->real) i * (X:num->A->real) n x)`] + SIMPLE_RV_ADD) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + X_GEN_TAC `k:num` THEN STRIP_TAC THEN BETA_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `(a:num->real) k`; `(b:num->real) k`; `(freq:num->real) k`] + SIMPLE_EXPECTATION_TRIG_TERM) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 2: Rewrite the convergence using the decomposition *) + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. sum(0..m) (\k. (a:num->real) k * simple_char_fn_re (p:A prob_space) ((X:num->A->real) n) ((freq:num->real) k) + + (b:num->real) k * simple_char_fn_im p (X n) (freq k))` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE]; + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - GEN_TAC THEN REWRITE_TAC[IN_UNIV] THEN - REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs(std_normal_density x) = std_normal_density x` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_REFL; STD_NORMAL_DENSITY_NONNEG]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN - ASM_REWRITE_TAC[]);; - -(* ========================================================================= *) -(* DENSITY SYMMETRY AND FOURIER TRANSFORM PROPERTIES *) -(* ========================================================================= *) - -(* std_normal_density is an even function *) -let STD_NORMAL_DENSITY_EVEN = prove - (`!y. std_normal_density(--y) = std_normal_density y`, - GEN_TAC THEN REWRITE_TAC[std_normal_density] THEN - AP_TERM_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN - REWRITE_TAC[REAL_POW_NEG; ARITH]);; - -(* Reflection of the whole real line is itself *) -let IMAGE_NEG_UNIV = prove - (`IMAGE (--) (:real) = (:real)`, - REWRITE_TAC[EXTENSION; IN_IMAGE; IN_UNIV] THEN - GEN_TAC THEN EXISTS_TAC `--x:real` THEN - REWRITE_TAC[REAL_NEG_NEG]);; - -(* sin(ty) * density is integrable *) -let SIN_DENSITY_INTEGRABLE = prove - (`!t. (\y. sin(t * y) * std_normal_density y) real_integrable_on (:real)`, - GEN_TAC THEN - MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN - CONJ_TAC THENL - [GEN_TAC THEN - MP_TAC(ISPECL [`\y:real. t * y`; `sin`; `y:real`] - (REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ATREAL_COMPOSE)) THEN - BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_LMUL THEN - REWRITE_TAC[REAL_CONTINUOUS_AT_ID]; - REWRITE_TAC[REAL_CONTINUOUS_AT_SIN]]; - EXISTS_TAC `&1` THEN REWRITE_TAC[SIN_BOUND]]);; - -(* ========================================================================= *) -(* WEAK CONVERGENCE FROM CHAR FN CONVERGENCE *) -(* ========================================================================= *) - -(* Weak convergence from characteristic function convergence. - This is the portmanteau theorem direction: char fn convergence + tightness - implies weak convergence (convergence of expectations of bounded - continuous functions). - - Proof approach: For bounded continuous g, eps > 0: - 1. Tightness gives M with P(|X_n| > M) small - 2. Trig polynomial T approximates g on [-M,M] (Weierstrass) - 3. E[T(X_n)] -> int(T*density) by char fn hypothesis + Gaussian FT - 4. Errors from approximation + tails controlled by eps argument - - Key sub-lemma: trigonometric polynomial approximation on compact - intervals. Uses WEIERSTRASS_TRIG_POLYNOMIAL (from fourier.ml) for - approximation on [-pi,pi], then scales by B/(B+eps/2) to get global - bound |T| <= B while preserving approximation quality. *) + (* Step 3: Sum of convergent sequences converges *) + MATCH_MP_TAC REALLIM_SUM THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `(a:num->real) k * exp (--((freq:num->real) k pow 2 / &2)) = + a k * exp (--(freq k pow 2 / &2)) + (b:num->real) k * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; -(* Periodicity of sin and cos with natural number multiples of 2*pi *) -let SIN_PERIODIC_N = prove - (`!k:num. !x. sin(x + &2 * &k * pi) = sin(x)`, - INDUCT_TAC THENL - [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; - GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; - REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN - REWRITE_TAC[REAL_ADD_ASSOC; SIN_PERIODIC] THEN ASM_REWRITE_TAC[]]);; +(* Gaussian integral of a single trig term: uses forward reasoning with + explicit ISPECL to avoid higher-order matching issues *) +let HAS_INTEGRAL_TRIG_TERM = prove + (`!a b t. + ((\y. (a * cos(t * y) + b * sin(t * y)) * + std_normal_density y) has_real_integral + (a * exp(--(t pow 2 / &2)))) + (:real)`, + REPEAT GEN_TAC THEN + (* Rewrite goal function and value *) + SUBGOAL_THEN + `(\y:real. ((a:real) * cos((t:real) * y) + (b:real) * sin(t * y)) * + std_normal_density y) = + (\y. a * (std_normal_density y * cos(t * y)) + + b * (std_normal_density y * sin(t * y)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(a:real) * exp(--((t:real) pow 2 / &2)) = + a * exp(--(t pow 2 / &2)) + (b:real) * &0` + SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + (* Prove a * (density * cos) has integral a * exp *) + SUBGOAL_THEN + `((\y:real. (a:real) * (std_normal_density y * cos((t:real) * y))) + has_real_integral (a * exp(--(t pow 2 / &2)))) (:real)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`\y:real. std_normal_density y * cos((t:real) * y)`; + `exp(--((t:real) pow 2 / &2))`; + `(:real)`; + `a:real`] HAS_REAL_INTEGRAL_LMUL) THEN + REWRITE_TAC[STD_NORMAL_CHAR_FN_RE] THEN BETA_TAC THEN + DISCH_THEN ACCEPT_TAC; ALL_TAC] THEN + (* Prove b * (density * sin) has integral b * 0 *) + SUBGOAL_THEN + `((\y:real. (b:real) * (std_normal_density y * sin((t:real) * y))) + has_real_integral (b * &0)) (:real)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`\y:real. std_normal_density y * sin((t:real) * y)`; + `&0`; + `(:real)`; + `b:real`] HAS_REAL_INTEGRAL_LMUL) THEN + REWRITE_TAC[STD_NORMAL_CHAR_FN_IM] THEN BETA_TAC THEN + DISCH_THEN ACCEPT_TAC; ALL_TAC] THEN + (* Combine with HAS_REAL_INTEGRAL_ADD *) + MP_TAC(ISPECL + [`\y:real. (a:real) * (std_normal_density y * cos((t:real) * y))`; + `\y:real. (b:real) * (std_normal_density y * sin((t:real) * y))`; + `(a:real) * exp(--((t:real) pow 2 / &2))`; + `(b:real) * &0`; + `(:real)`] HAS_REAL_INTEGRAL_ADD) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN ACCEPT_TAC);; -let COS_PERIODIC_N = prove - (`!k:num. !x. cos(x + &2 * &k * pi) = cos(x)`, - INDUCT_TAC THENL - [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; - GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; - REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN - REWRITE_TAC[REAL_ADD_ASSOC; COS_PERIODIC] THEN ASM_REWRITE_TAC[]]);; +(* Full trig polynomial Gaussian integral - uses HAS_INTEGRAL_TRIG_TERM *) +let GAUSSIAN_INTEGRAL_TRIG_POLY = prove + (`!m:num (a:num->real) (b:num->real) (freq:num->real). + ((\y. sum(0..m) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y)) * + std_normal_density y) has_real_integral + sum(0..m) (\k. a k * exp(--(freq k pow 2 / &2)))) + (:real)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN + `(\y:real. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * y) + + (b:num->real) k * sin(freq k * y)) * + std_normal_density y) = + (\y. sum(0..m) (\k. (a k * cos(freq k * y) + + b k * sin(freq k * y)) * + std_normal_density y))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[GSYM SUM_RMUL]; ALL_TAC] THEN + MP_TAC(INST + [`\k:num. (a:num->real) k * exp(--((freq:num->real) k pow 2 / &2))`, + `i:num->real`] + (ISPECL + [`\k:num. \y:real. ((a:num->real) k * cos((freq:num->real) k * y) + + (b:num->real) k * sin(freq k * y)) * + std_normal_density y`; + `(:real)`; + `0..m`] + HAS_REAL_INTEGRAL_SUM)) THEN + BETA_TAC THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[HAS_INTEGRAL_TRIG_TERM]; + DISCH_THEN ACCEPT_TAC]);; -(* A 2*pi-periodic function bounded on [-pi,pi] is bounded everywhere *) -let PERIODIC_REAL_BOUND = prove - (`!(fn:real->real) (B:real). (!x. fn(x + &2 * pi) = fn x) /\ - (!x. x IN real_interval[--pi,pi] ==> abs(fn x) <= B) - ==> !x. abs(fn x) <= B`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `&0 < &2 * pi` ASSUME_TAC THENL - [MP_TAC PI_POS THEN REAL_ARITH_TAC; ALL_TAC] THEN - (* Shift x into [-pi, pi] *) - (* Step 1: find N such that x + 2*N*pi > 0 *) - MP_TAC(SPEC `--(x:real)` (MATCH_MP (SPEC `&2 * pi` REAL_ARCH) - (ASSUME `&0 < &2 * pi`))) THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - ABBREV_TAC `y = x + &2 * &N * pi` THEN - SUBGOAL_THEN `&0 < (y:real)` ASSUME_TAC THENL - [EXPAND_TAC "y" THEN - UNDISCH_TAC `--(x:real) < &N * (&2 * pi)` THEN REAL_ARITH_TAC; +(* Helper lemma for Step C of SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN: + Pointwise trig approximation bound + second moment bound + implies expectation error bound *) +let SIMPLE_STEP_C_BOUND = prove + (`!p:A prob_space (X:num->A->real) (g:real->real) (T':real->real) BB CC e M. + (!n. simple_rv p (X n)) /\ + &0 < CC /\ + (!n. simple_expectation p (\x. X n x pow 2) <= CC) /\ + (!y. abs(g y) <= BB) /\ + (!y. abs(T' y) <= BB) /\ + &0 < BB /\ &0 < e /\ &0 < M /\ + (!y. abs y <= M ==> abs(g y - T' y) < e / &6) + ==> !n:num. abs(simple_expectation p (\a. g(X n a)) - + simple_expectation p (\a. T'(X n a))) <= + e / &6 + &2 * BB * CC / M pow 2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `n:num` THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (g:real->real)((X:num->A->real) n a))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `g:real->real`] SIMPLE_RV_REAL_COMPOSE) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (T':real->real)((X:num->A->real) n a))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `T':real->real`] SIMPLE_RV_REAL_COMPOSE) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (X:num->A->real) n a pow 2)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `\y:real. y pow 2`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\a:A. (g:real->real)((X:num->A->real) n a)) - + simple_expectation p (\a. (T':real->real)(X n a)) = + simple_expectation p (\a. g(X n a) - T'(X n a))` + (fun th -> REWRITE_TAC[th]) THENL + [CONV_TAC SYM_CONV THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 2: find m such that y - 2*m*pi in [-pi, pi] *) - MP_TAC(SPEC `(y:real) - pi` (MATCH_MP (SPEC `&2 * pi` REAL_ARCH) - (ASSUME `&0 < &2 * pi`))) THEN - DISCH_THEN(X_CHOOSE_TAC `K:num`) THEN - MP_TAC(fst(EQ_IMP_RULE(BETA_RULE - (SPEC `\m:num. (y:real) - &2 * &m * pi < pi` num_WOP)))) THEN - ANTS_TAC THENL - [EXISTS_TAC `K:num` THEN - UNDISCH_TAC `(y:real) - pi < &K * (&2 * pi)` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\a:A. abs((g:real->real)((X:num->A->real) n a) - (T':real->real)(X n a)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_ABS_LE THEN + MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `m0:num` STRIP_ASSUME_TAC) THEN - (* fn(x) = fn(y) by forward periodicity *) - SUBGOAL_THEN `(fn:real->real) x = fn y` SUBST1_TAC THENL - [EXPAND_TAC "y" THEN - SUBGOAL_THEN `!n:num. !z:real. (fn:real->real)(z) = fn(z + &2 * &n * pi)` - MP_TAC THENL - [INDUCT_TAC THENL - [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; - GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; - REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN - REWRITE_TAC[REAL_ADD_ASSOC] THEN - ONCE_REWRITE_TAC[ASSUME - `!x:real. (fn:real->real)(x + &2 * pi) = fn x`] THEN - ASM_MESON_TAC[]]; - DISCH_THEN(MP_TAC o SPECL [`N:num`; `x:real`]) THEN - MESON_TAC[]]; ALL_TAC] THEN - (* fn(y) = fn(y - 2*m0*pi) by backward periodicity *) - SUBGOAL_THEN `(fn:real->real) y = fn(y - &2 * &m0 * pi)` SUBST1_TAC THENL - [SUBGOAL_THEN `!n:num. !z:real. (fn:real->real)(z) = fn(z + &2 * &n * pi)` - MP_TAC THENL - [INDUCT_TAC THENL - [REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_ADD_RID]; - GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_SUC; - REAL_ARITH `&2 * (k + &1) * p = &2 * k * p + &2 * p`] THEN - REWRITE_TAC[REAL_ADD_ASSOC] THEN - ONCE_REWRITE_TAC[ASSUME - `!x:real. (fn:real->real)(x + &2 * pi) = fn x`] THEN - ASM_MESON_TAC[]]; - DISCH_THEN(MP_TAC o SPECL [`m0:num`; `(y:real) - &2 * &m0 * pi`]) THEN - REWRITE_TAC[REAL_SUB_ADD] THEN MESON_TAC[]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\a:A. e / &6 + &2 * BB * (X:num->A->real) n a pow 2 / M pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[SIMPLE_RV_CONST]; ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_RV_CMUL THEN + SUBGOAL_THEN `(\a:A. BB * (X:num->A->real) n a pow 2 / M pow 2) = + (\a. (\y:real. BB * y pow 2 / M pow 2) (X n a))` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `\y:real. BB * y pow 2 / M pow 2`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN REWRITE_TAC[ETA_AX] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `a:A` THEN DISCH_TAC THEN BETA_TAC THEN + ASM_CASES_TAC `abs((X:num->A->real) n (a:A)) <= M` THENL + [MATCH_MP_TAC(REAL_ARITH `x < ep /\ &0 <= r ==> x <= ep + r`) THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_SIMP_TAC[REAL_POW_LT]]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * BB * (X:num->A->real) n (a:A) pow 2 / M pow 2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * BB` THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `abs x <= B /\ abs y <= B ==> abs(x - y) <= &2 * B`) THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_POW_LT] THEN + REWRITE_TAC[REAL_MUL_LID; GSYM REAL_LE_SQUARE_ABS] THEN + UNDISCH_TAC `~(abs((X:num->A->real) n (a:A)) <= M)` THEN + UNDISCH_TAC `&0 < M` THEN REAL_ARITH_TAC]]]; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]; ALL_TAC] THEN - (* y - 2*m0*pi in [-pi, pi] *) - FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - ASM_CASES_TAC `m0 = 0` THENL - [SUBGOAL_THEN `(y:real) < pi` ASSUME_TAC THENL - [UNDISCH_TAC `(y:real) - &2 * &m0 * pi < pi` THEN - ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_SUB_RZERO]; + (* E[e/6 + 2*BB*X^2/M^2] = e/6 + 2*BB*E[X^2]/M^2 *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\a:A. e / &6 + &2 * BB * (X:num->A->real) n a pow 2 / M pow 2) = + e / &6 + &2 * BB * simple_expectation p (\a. X n a pow 2) / M pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN + SUBGOAL_THEN `(\a:A. e * inv(&6) + &2 * BB * (X:num->A->real) n a pow 2 * inv(M pow 2)) = + (\a. e * inv(&6) + &2 * BB * (inv(M pow 2) * X n a pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_LZERO; REAL_SUB_RZERO] THEN - MP_TAC(ASSUME `&0 < (y:real)`) THEN - MP_TAC(ASSUME `(y:real) < pi`) THEN - MP_TAC PI_POS THEN REAL_ARITH_TAC; - SUBGOAL_THEN `--pi <= (y:real) - &2 * &m0 * pi` MP_TAC THENL - [SUBGOAL_THEN `1 <= m0` ASSUME_TAC THENL - [ASM_ARITH_TAC; ALL_TAC] THEN - FIRST_X_ASSUM(MP_TAC o SPEC `m0 - 1`) THEN - ASM_SIMP_TAC[ARITH_RULE `1 <= m ==> m - 1 < m`] THEN - REWRITE_TAC[REAL_NOT_LT] THEN - ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB] THEN - REAL_ARITH_TAC; - UNDISCH_TAC `(y:real) - &2 * &m0 * pi < pi` THEN - REAL_ARITH_TAC]]);; + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\a:A. inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\a:A. BB * inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\a:A. &2 * BB * inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\a:A. e * inv(&6)`; + `\a:A. &2 * BB * inv(M pow 2) * (X:num->A->real) n a pow 2`] + SIMPLE_EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[SIMPLE_RV_CONST] THEN BETA_TAC THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[SIMPLE_EXPECTATION_CONST] THEN + AP_TERM_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_CMUL] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `x <= y ==> a + x <= a + y`) THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POW_LT]);; -let SCALED_APPROX_BOUND = prove - (`!h s c e2. - abs(h - s) < e2 /\ (&1 - c) * abs(s) <= e2 /\ &0 <= &1 - c - ==> abs(h - c * s) < e2 + e2`, +(* Helper lemma for Step D of SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN: + Pointwise trig approximation bound implies integral error bound + against standard normal density *) +let STEP_D_BOUND = prove + (`!g:real->real (T':real->real) BB e M L. + (!y. g real_continuous atreal y) /\ + (!y. abs(g y) <= BB) /\ + (!y. abs(T' y) <= BB) /\ + &0 < BB /\ &0 < e /\ &0 < M /\ + (!y. abs y <= M ==> abs(g y - T' y) < e / &6) /\ + ((\y. T' y * std_normal_density y) has_real_integral L) (:real) + ==> abs(L - real_integral (:real) (\y. g y * std_normal_density y)) <= + e / &6 + &2 * BB / M pow 2`, REPEAT GEN_TAC THEN STRIP_TAC THEN - SUBGOAL_THEN `(h:real) - c * s = (h - s) + (&1 - c) * s` - SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `abs((h:real) - s) + abs((&1 - c) * s)` THEN - REWRITE_TAC[REAL_ABS_TRIANGLE] THEN - REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs(&1 - c) = &1 - c` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REAL_ARITH_TAC);; - -let BOUNDED_CONTINUOUS_TRIG_APPROX = prove - (`!g:real->real B M e. - (!y. g real_continuous atreal y) /\ (!y. abs(g y) <= B) /\ - &0 < B /\ &0 < M /\ &0 < e - ==> ?n:num a b f. - (!y. abs(y) <= M - ==> abs(g y - sum(0..n) (\k. a k * cos(f k * y) + - b k * sin(f k * y))) < e) /\ - (!y. abs(sum(0..n) (\k. a k * cos(f k * y) + - b k * sin(f k * y))) <= B)`, - REPEAT STRIP_TAC THEN - ABBREV_TAC `L = M + &1` THEN - SUBGOAL_THEN `&0 < L /\ ~(L = &0)` STRIP_ASSUME_TAC THENL - [EXPAND_TAC "L" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MP_TAC PI_POS THEN DISCH_TAC THEN - SUBGOAL_THEN `~(pi = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - (* Define h on [-pi, pi]: h(t) = g(L*t/pi) * window(t) *) - ABBREV_TAC - `h = \t. (g:real->real)(L * t / pi) * - max (&0) (min (&1) (L * (pi - abs t) / pi))` THEN - (* h continuous on [-pi, pi] *) SUBGOAL_THEN - `(h:real->real) real_continuous_on real_interval[--pi, pi]` - ASSUME_TAC THENL - [EXPAND_TAC "h" THEN - MATCH_MP_TAC REAL_CONTINUOUS_ON_MUL THEN CONJ_TAC THENL - [MATCH_MP_TAC(REWRITE_RULE[o_DEF] REAL_CONTINUOUS_ON_COMPOSE) THEN - CONJ_TAC THENL - [SUBGOAL_THEN `(\t:real. L * t / pi) = (\t. (L / pi) * t)` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL THEN - REWRITE_TAC[REAL_CONTINUOUS_ON_ID]]; - MATCH_MP_TAC REAL_CONTINUOUS_ON_SUBSET THEN - EXISTS_TAC `(:real)` THEN REWRITE_TAC[SUBSET_UNIV] THEN - SIMP_TAC[REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT; - REAL_OPEN_UNIV; IN_UNIV] THEN ASM_REWRITE_TAC[]]; - MATCH_MP_TAC REAL_CONTINUOUS_ON_MAX THEN - REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN - MATCH_MP_TAC REAL_CONTINUOUS_ON_MIN THEN - REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN - SUBGOAL_THEN `(\t:real. L * (pi - abs t) / pi) = - (\t. (L / pi) * (pi - abs t))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_CONTINUOUS_ON_LMUL THEN - MATCH_MP_TAC REAL_CONTINUOUS_ON_SUB THEN - REWRITE_TAC[REAL_CONTINUOUS_ON_CONST] THEN - GEN_REWRITE_TAC LAND_CONV [GSYM ETA_AX] THEN - MATCH_MP_TAC REAL_CONTINUOUS_ON_ABS THEN - REWRITE_TAC[REAL_CONTINUOUS_ON_ID]]]; + `(\y. (g:real->real) y * std_normal_density y) real_integrable_on (:real)` + ASSUME_TAC THENL + [MATCH_MP_TAC ABSOLUTELY_REAL_INTEGRABLE_IMP_INTEGRABLE THEN + MATCH_MP_TAC ABSOLUTELY_REAL_INTEGRABLE_BOUNDED_MEASURABLE_PRODUCT THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_IMP_REAL_MEASURABLE_ON_CLOSED_SUBSET THEN + REWRITE_TAC[REAL_CLOSED_UNIV] THEN + ASM_SIMP_TAC[REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT; + REAL_OPEN_UNIV; IN_UNIV]; ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[real_bounded; IN_IMAGE; IN_UNIV] THEN + EXISTS_TAC `BB:real` THEN ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[absolutely_real_integrable_on] THEN CONJ_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; + SUBGOAL_THEN `(\x:real. abs(std_normal_density x)) = std_normal_density` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]; + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]]]; ALL_TAC] THEN - (* h(-pi) = h(pi) *) - SUBGOAL_THEN `(h:real->real)(--pi) = h(pi)` ASSUME_TAC THENL - [EXPAND_TAC "h" THEN - SUBGOAL_THEN `abs(pi) = pi /\ abs(--pi) = pi` - (fun th -> REWRITE_TAC[th]) THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[REAL_SUB_REFL; REAL_MUL_RZERO] THEN - SUBGOAL_THEN `&0 / pi = &0` (fun th -> REWRITE_TAC[th]) THENL - [ASM_SIMP_TAC[REAL_DIV_EQ_0; REAL_LT_IMP_NZ]; ALL_TAC] THEN - REAL_ARITH_TAC; + SUBGOAL_THEN `L = real_integral (:real) + (\y. (T':real->real) y * std_normal_density y)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM REAL_INTEGRAL_UNIQUE) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* |h(t)| <= B on [-pi, pi] *) - SUBGOAL_THEN `!t. t IN real_interval[--pi,pi] ==> abs(h t) <= B` - ASSUME_TAC THENL - [X_GEN_TAC `t:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN - DISCH_TAC THEN EXPAND_TAC "h" THEN + SUBGOAL_THEN `(\y. (T':real->real) y * std_normal_density y) + real_integrable_on (:real)` ASSUME_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `L:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `real_integral (:real) (\y. (T':real->real) y * std_normal_density y) - + real_integral (:real) (\y. (g:real->real) y * std_normal_density y) = + real_integral (:real) (\y. T' y * std_normal_density y - + g y * std_normal_density y)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_SUB THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(\y:real. (T':real->real) y * std_normal_density y - + (g:real->real) y * std_normal_density y) = + (\y. (T' y - g y) * std_normal_density y)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_integral (:real) + (\y. (e / &6 + &2 * BB * y pow 2 / M pow 2) * + std_normal_density y)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_ABS_BOUND_INTEGRAL THEN CONJ_TAC THENL + [SUBGOAL_THEN + `(\y:real. ((T':real->real) y - (g:real->real) y) * + std_normal_density y) = + (\y. T' y * std_normal_density y - g y * std_normal_density y)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `(\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * + std_normal_density y) = + (\y. e / &6 * std_normal_density y + + &2 * BB / M pow 2 * (y pow 2 * std_normal_density y))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]]]; + ALL_TAC] THEN + REWRITE_TAC[IN_UNIV] THEN X_GEN_TAC `y:real` THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_MUL] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `B * &1` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_MUL2 THEN - REWRITE_TAC[REAL_ABS_POS] THEN CONJ_TAC THENL - [ASM_MESON_TAC[]; REAL_ARITH_TAC]; REAL_ARITH_TAC]; + SUBGOAL_THEN `abs(std_normal_density y) = std_normal_density y` + SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_CASES_TAC `abs(y:real) <= M` THENL + [MATCH_MP_TAC(REAL_ARITH `x < ep /\ &0 <= r ==> x <= ep + r`) THEN + CONJ_TAC THENL + [ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_SIMP_TAC[REAL_POW_LT]]]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * BB * y pow 2 / M pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * BB` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `abs x <= B /\ abs y <= B ==> abs(x - y) <= &2 * B`) THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_POW_LT] THEN + REWRITE_TAC[REAL_MUL_LID; GSYM REAL_LE_SQUARE_ABS] THEN + UNDISCH_TAC `~(abs(y:real) <= M)` THEN + UNDISCH_TAC `&0 < M` THEN REAL_ARITH_TAC]]]; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]; + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]]; ALL_TAC] THEN - (* h(pi*y/L) = g(y) for |y| <= M *) - SUBGOAL_THEN `!y. abs y <= M ==> h(pi * y / L) = (g:real->real) y` - ASSUME_TAC THENL - [X_GEN_TAC `y:real` THEN DISCH_TAC THEN EXPAND_TAC "h" THEN - SUBGOAL_THEN `L * (pi * y / L) / pi = y` SUBST1_TAC THENL - [MATCH_MP_TAC(REAL_FIELD - `&0 < p /\ &0 < L ==> L * (p * y / L) / p = y`) THEN - ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `abs(pi * y / L) = pi * abs y / L` SUBST1_TAC THENL - [REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs pi = pi` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `abs L = L` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - REFL_TAC; ALL_TAC] THEN - SUBGOAL_THEN `L * (pi - pi * abs y / L) / pi = L - abs y` - SUBST1_TAC THENL - [SUBGOAL_THEN `pi - pi * abs y / L = pi * (&1 - abs y / L)` + SUBGOAL_THEN + `((\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * + std_normal_density y) + has_real_integral (e / &6 + &2 * BB / M pow 2)) (:real)` + (fun th -> REWRITE_TAC[MATCH_MP REAL_INTEGRAL_UNIQUE th; + REAL_LE_REFL]) THEN + SUBGOAL_THEN + `(\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * + std_normal_density y) = + (\y. e / &6 * std_normal_density y + + &2 * BB / M pow 2 * (y pow 2 * std_normal_density y))` SUBST1_TAC THENL - [REWRITE_TAC[REAL_SUB_LDISTRIB; REAL_MUL_RID]; ALL_TAC] THEN - MATCH_MP_TAC(REAL_FIELD - `~(p = &0) /\ ~(q = &0) ==> q * (p * (&1 - y / q)) / p = q - y`) THEN - ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `&1 <= L - abs y` ASSUME_TAC THENL - [EXPAND_TAC "L" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `min (&1) (L - abs y) = &1` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN REAL_ARITH_TAC; + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `e / &6 + &2 * BB / M pow 2 = + e / &6 * &1 + &2 * BB / M pow 2 * &1` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; + MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN + REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]]);; + +let SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN = prove + (`!p:A prob_space (X:num->A->real) (g:real->real). + (!n. simple_rv p (X n)) /\ + (?C. &0 < C /\ !n. simple_expectation p (\x. X n x pow 2) <= C) /\ + (!t. ((\n. simple_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + sequentially) /\ + (!t. ((\n. simple_char_fn_im p (X n) t) ---> &0) sequentially) /\ + (!y. g real_continuous atreal y) /\ + (?B. &0 < B /\ !y. abs(g y) <= B) + ==> ((\n. simple_expectation p (\a:A. g(X n a))) ---> + real_integral (:real) (\y. g y * std_normal_density y)) + sequentially`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `CC:real` STRIP_ASSUME_TAC) MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (X_CHOOSE_THEN `BB:real` STRIP_ASSUME_TAC)) THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + ABBREV_TAC `M = sqrt(&12 * BB * (CC + &1) / e) + &1` THEN + SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN + MATCH_MP_TAC SQRT_POS_LE THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]]; ALL_TAC] THEN + (* Apply BOUNDED_CONTINUOUS_TRIG_APPROX *) + MP_TAC(SPECL [`g:real->real`; `BB:real`; `M:real`; `e / &6`] + BOUNDED_CONTINUOUS_TRIG_APPROX) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` + (X_CHOOSE_THEN `aa:num->real` + (X_CHOOSE_THEN `bb:num->real` + (X_CHOOSE_THEN `ff:num->real` STRIP_ASSUME_TAC)))) THEN + (* Key bound: 2*BB*(CC+1)/M^2 < e/6 *) + SUBGOAL_THEN `&2 * BB * (CC + &1) / M pow 2 < e / &6` ASSUME_TAC THENL + [SUBGOAL_THEN `~(e = &0) /\ ~(BB = &0) /\ ~(CC + &1 = &0)` STRIP_ASSUME_TAC + THENL + [UNDISCH_TAC `&0 < e` THEN UNDISCH_TAC `&0 < BB` THEN + UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &12 * BB * (CC + &1) / e` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_DIV THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC]]; ALL_TAC] THEN + SUBGOAL_THEN `&12 * BB * (CC + &1) / e < M pow 2` ASSUME_TAC THENL + [SUBGOAL_THEN `&0 <= &12 * BB * (CC + &1) / e` ASSUME_TAC THENL + [UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `sqrt(&12 * BB * (CC + &1) / e) pow 2 = + &12 * BB * (CC + &1) / e` (SUBST1_TAC o GSYM) THENL + [ASM_SIMP_TAC[SQRT_POW2]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= sqrt(&12 * BB * (CC + &1) / e)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN + UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN + MATCH_MP_TAC REAL_LT_MUL2 THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `sqrt (&12 * BB * (CC + &1) / e) + &1 = M` THEN + UNDISCH_TAC `&0 <= sqrt(&12 * BB * (CC + &1) / e)` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[real_div] THEN + SUBGOAL_THEN + `e * inv(&6) = &2 * BB * (CC + &1) * inv(&12 * BB * (CC + &1) * inv e)` + SUBST1_TAC THENL + [UNDISCH_TAC `~(e = &0)` THEN UNDISCH_TAC `~(BB = &0)` THEN + UNDISCH_TAC `~(CC + &1 = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_LT_MUL; + REAL_ARITH `&0 < CC ==> &0 < CC + &1`; + REAL_OF_NUM_LT; ARITH] THEN + MATCH_MP_TAC REAL_LT_INV2 THEN + ASM_REWRITE_TAC[GSYM real_div]; + ALL_TAC] THEN + (* Step A: E[T(X_n)] -> L *) + ABBREV_TAC `L = sum(0..nn) + (\k. (aa:num->real) k * exp(--((ff:num->real) k pow 2 / &2)))` THEN + SUBGOAL_THEN + `((\n. simple_expectation (p:A prob_space) + (\x:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n x) + + (bb:num->real) k * sin(ff k * X n x)))) ---> + L) sequentially` + ASSUME_TAC THENL + [EXPAND_TAC "L" THEN + MATCH_MP_TAC SIMPLE_TRIG_POLY_WEAK_CONVERGENCE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Apply WEIERSTRASS_TRIG_POLYNOMIAL with e/2 *) - MP_TAC(SPECL [`h:real->real`; `e / &2`] WEIERSTRASS_TRIG_POLYNOMIAL) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_THEN `N:num` (X_CHOOSE_THEN `aw:num->real` - (X_CHOOSE_THEN `bw:num->real` ASSUME_TAC))) THEN - (* |T(x)| <= B + e/2 on [-pi,pi] *) - SUBGOAL_THEN - `!x. x IN real_interval[--pi,pi] - ==> abs(sum(0..N) (\k. aw k * sin(&k * x) + - bw k * cos(&k * x))) < B + e / &2` - ASSUME_TAC THENL - [X_GEN_TAC `x:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `abs((h:real->real) x) <= B` MP_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN - `abs(h x - sum(0..N) (\k. aw k * sin(&k * x) + - bw k * cos(&k * x))) < e / &2` MP_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - REAL_ARITH_TAC; ALL_TAC] THEN - (* T is 2*pi periodic *) + (* Step B: L = integral of T times density *) SUBGOAL_THEN - `!x. sum(0..N) (\k. aw k * sin(&k * (x + &2 * pi)) + - bw k * cos(&k * (x + &2 * pi))) = - sum(0..N) (\k. aw k * sin(&k * x) + bw k * cos(&k * x))` - ASSUME_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC SUM_EQ THEN - REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN - REWRITE_TAC[REAL_ARITH `k * (x + &2 * p) = k * x + &2 * k * p`] THEN - REWRITE_TAC[SIN_PERIODIC_N; COS_PERIODIC_N]; ALL_TAC] THEN - (* |T(x)| <= B + e/2 on ALL of R (by periodicity) *) + `L = real_integral (:real) + (\y. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * y) + + (bb:num->real) k * sin(ff k * y)) * + std_normal_density y)` + ASSUME_TAC THENL + [EXPAND_TAC "L" THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]; ALL_TAC] THEN + (* Steps C and D: error bounds *) SUBGOAL_THEN - `!x. abs(sum(0..N) (\k. aw k * sin(&k * x) + - bw k * cos(&k * x))) <= B + e / &2` - ASSUME_TAC THENL - [MATCH_MP_TAC PERIODIC_REAL_BOUND THEN CONJ_TAC THENL - [ASM_REWRITE_TAC[]; - X_GEN_TAC `u:real` THEN DISCH_TAC THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_MESON_TAC[]]; ALL_TAC] THEN - (* Scale factor c = B / (B + e/2) *) - ABBREV_TAC `c = B / (B + e / &2)` THEN - SUBGOAL_THEN `&0 < B + e / &2` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `~(B + e / &2 = &0)` ASSUME_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `&0 < c` ASSUME_TAC THENL - [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_LT_DIV]; ALL_TAC] THEN - SUBGOAL_THEN `c < &1` ASSUME_TAC THENL - [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_MUL_LID] THEN - ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `c * (B + e / &2) = B` ASSUME_TAC THENL - [EXPAND_TAC "c" THEN ASM_SIMP_TAC[REAL_DIV_RMUL]; ALL_TAC] THEN - (* Provide witnesses: n=N, a(k)=c*bw(k), b(k)=c*aw(k), f(k)=k*pi/L *) - MAP_EVERY EXISTS_TAC - [`N:num`; `\k:num. (c:real) * (bw:num->real) k`; - `\k:num. (c:real) * (aw:num->real) k`; - `\k:num. &k * pi / (L:real)`] THEN - (* Rewrite the trig polynomial *) + `!n:num. abs(simple_expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) n a)) - + simple_expectation p + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * X n a) + + (bb:num->real) k * sin(ff k * X n a)))) <= + e / &6 + &2 * BB * CC / M pow 2` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`p:A prob_space`; `X:num->A->real`; `g:real->real`; + `\y:real. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * y) + + (bb:num->real) k * sin(ff k * y))`; + `BB:real`; `CC:real`; `e:real`; `M:real`] SIMPLE_STEP_C_BOUND) THEN + BETA_TAC THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN SUBGOAL_THEN - `!y. sum(0..N) (\k. (c * bw k) * cos ((&k * pi / L) * y) + - (c * aw k) * sin ((&k * pi / L) * y)) = - c * sum(0..N) (\k. aw k * sin(&k * (pi * y / L)) + - bw k * cos(&k * (pi * y / L)))` - ASSUME_TAC THENL - [GEN_TAC THEN REWRITE_TAC[GSYM SUM_LMUL] THEN - MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN - REPEAT STRIP_TAC THEN - REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN - REWRITE_TAC[REAL_MUL_AC] THEN REAL_ARITH_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [(* Approximation: |g(y) - c*T(pi*y/L)| < e for |y| <= M *) - X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `pi * y / L IN real_interval[--pi,pi]` ASSUME_TAC THENL - [REWRITE_TAC[IN_REAL_INTERVAL] THEN - SUBGOAL_THEN `abs(pi * y / L) <= pi * M / L` MP_TAC THENL - [REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs pi = pi` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `abs L = L` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_LE_LMUL_EQ]; - SUBGOAL_THEN `pi * M / L < pi` MP_TAC THENL - [REWRITE_TAC[REAL_ARITH `p * M / L < p <=> &0 < p * (&1 - M / L)`] THEN - MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN - EXPAND_TAC "L" THEN - ASM_SIMP_TAC[REAL_SUB_LT; REAL_LT_LDIV_EQ; - REAL_ARITH `&0 < M ==> &0 < M + &1`; - REAL_MUL_LID] THEN ASM_REAL_ARITH_TAC; - REAL_ARITH_TAC]]; ALL_TAC] THEN - (* g(y) = h(pi*y/L), then use WEIERSTRASS and SCALED_APPROX_BOUND *) - SUBGOAL_THEN `(g:real->real) y = h(pi * y / L)` SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN ASM_MESON_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC(REAL_ARITH `x < e / &2 + e / &2 ==> x < (e:real)`) THEN - MATCH_MP_TAC SCALED_APPROX_BOUND THEN - REPEAT CONJ_TAC THENL - [ASM_MESON_TAC[]; - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `(&1 - c) * (B + e / &2)` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[]]; - SUBGOAL_THEN `(&1 - c) * (B + e / &2) = e / &2` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_ARITH `(&1 - c) * x = x - c * x`] THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; REWRITE_TAC[REAL_LE_REFL]]]; - ASM_REAL_ARITH_TAC]; - (* Global bound: |c*T(pi*y/L)| <= B for all y *) - X_GEN_TAC `y:real` THEN REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs c = c` SUBST1_TAC THENL - [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `c * (B + e / &2)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [ASM_REAL_ARITH_TAC; ASM_MESON_TAC[]]; - ASM_REWRITE_TAC[REAL_LE_REFL]]]);; + `abs(L - real_integral (:real) + (\y. (g:real->real) y * std_normal_density y)) <= + e / &6 + &2 * BB / M pow 2` + ASSUME_TAC THENL + [MP_TAC(ISPECL + [`g:real->real`; + `\y:real. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * y) + + (bb:num->real) k * sin(ff k * y))`; + `BB:real`; `e:real`; `M:real`; `L:real`] STEP_D_BOUND) THEN + BETA_TAC THEN ANTS_TAC THENL + [EXPAND_TAC "L" THEN ASM_REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]; + DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Step E: From convergence of E[T(X_n)] to L, get N *) + FIRST_X_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY] o + check (fun th -> free_in `nn:num` (concl th))) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `N:num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (* Step F1: |E[g(X_n)] - E[T(X_n)]| < e/3 *) + SUBGOAL_THEN `abs(simple_expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) n a)) - + simple_expectation p + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * X n a) + + (bb:num->real) k * sin(ff k * X n a)))) < e / &3` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `e / &6 + &2 * BB * CC / M pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `x < e / &6 ==> e / &6 + x < e / &3`) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `&2 * BB * (CC + &1) / M pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POW_LT] THEN + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Step F2: |E[T(X_n)] - L| < e/3 *) + SUBGOAL_THEN `abs(simple_expectation (p:A prob_space) + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n a) + + (bb:num->real) k * sin(ff k * X n a))) - + L) < e / &3` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step F3: |L - int(g*density)| < e/3 *) + SUBGOAL_THEN `abs(L - real_integral (:real) + (\y. (g:real->real) y * std_normal_density y)) < e / &3` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `e / &6 + &2 * BB / M pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `x < e / &6 ==> e / &6 + x < e / &3`) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `&2 * BB * (CC + &1) / M pow 2` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + GEN_REWRITE_TAC (LAND_CONV) [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_SIMP_TAC[REAL_POW_LT]]]]; + ALL_TAC] THEN + ABBREV_TAC `eg = simple_expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) n a))` THEN + ABBREV_TAC `et = simple_expectation (p:A prob_space) + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n a) + + (bb:num->real) k * sin(ff k * X n a)))` THEN + ABBREV_TAC `ig = real_integral (:real) + (\y. (g:real->real) y * std_normal_density y)` THEN + ASM_REAL_ARITH_TAC);; +(* Integral of bounded [0,1]-valued continuous function against std normal + density is bounded by std_normal_cdf *) +let INTEGRAL_BOUNDED_LE_CDF = prove + (`!(g:real->real) b. + (!y. &0 <= g y /\ g y <= &1) /\ (!y. y > b ==> g y = &0) /\ + (!y. g real_continuous atreal y) + ==> real_integral (:real) (\y. g y * std_normal_density y) <= std_normal_cdf b`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\y:real. g y * std_normal_density y) real_integrable_on (:real)` + ASSUME_TAC THENL + [MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN + ASM_REWRITE_TAC[] THEN EXISTS_TAC `&1` THEN + GEN_TAC THEN + UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN + DISCH_THEN(MP_TAC o SPEC `y:real`) THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[std_normal_cdf] THEN + MP_TAC(ISPECL + [`\y:real. g y * std_normal_density y`; + `\y:real. if y IN {t | t <= b} then std_normal_density y else &0`; + `(:real)`; + `real_integral (:real) (\y:real. g y * std_normal_density y)`; + `real_integral (:real) (\y:real. if y IN {t | t <= b} then std_normal_density y else &0)`] + HAS_REAL_INTEGRAL_LE) THEN + BETA_TAC THEN + REWRITE_TAC[REAL_INTEGRAL_RESTRICT_UNIV] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[HAS_REAL_INTEGRAL_RESTRICT_UNIV] THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; + ALL_TAC] THEN + GEN_TAC THEN REWRITE_TAC[IN_UNIV; IN_ELIM_THM] THEN + ASM_CASES_TAC `x <= b` THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 * std_normal_density x` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN + UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]]; + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(g:real->real) x = &0` SUBST1_TAC THENL + [UNDISCH_TAC `!y:real. y > b ==> g y = &0` THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_LZERO; REAL_LE_REFL]]]; + SIMP_TAC[]]);; -(* Expectation of a single trig term a*cos(f*X) + b*sin(f*X) decomposes - into char fn values *) -let SIMPLE_EXPECTATION_TRIG_TERM = prove - (`!p:A prob_space (Y:A->real) a b t. - simple_rv p Y - ==> simple_expectation p (\x. a * cos(t * Y x) + b * sin(t * Y x)) = - a * char_fn_re p Y t + b * char_fn_im p Y t`, +(* std_normal_cdf bounded by integral of bounded [0,1]-valued continuous + function *) +let CDF_LE_INTEGRAL_BOUNDED = prove + (`!(g:real->real) a. + (!y. &0 <= g y /\ g y <= &1) /\ (!y. y <= a ==> g y = &1) /\ + (!y. g real_continuous atreal y) + ==> std_normal_cdf a <= real_integral (:real) (\y. g y * std_normal_density y)`, REPEAT STRIP_TAC THEN - REWRITE_TAC[char_fn_re; char_fn_im] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. cos(t * (Y:A->real) x))` - ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `\y:real. cos(t * y)`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. sin(t * (Y:A->real) x))` + SUBGOAL_THEN `(\y:real. g y * std_normal_density y) real_integrable_on (:real)` ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `\y:real. sin(t * y)`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + [MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN + ASM_REWRITE_TAC[] THEN EXISTS_TAC `&1` THEN + GEN_TAC THEN + UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN + DISCH_THEN(MP_TAC o SPEC `y:real`) THEN REAL_ARITH_TAC; ALL_TAC] THEN - (* E[a*cos + b*sin] = E[a*cos] + E[b*sin] *) - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. a * cos(t * (Y:A->real) x)`; - `\x:A. b * sin(t * (Y:A->real) x)`] - SIMPLE_EXPECTATION_ADD) THEN + REWRITE_TAC[std_normal_cdf] THEN + MP_TAC(ISPECL + [`\y:real. if y IN {t | t <= a} then std_normal_density y else &0`; + `\y:real. g y * std_normal_density y`; + `(:real)`; + `real_integral (:real) (\y:real. if y IN {t | t <= a} then std_normal_density y else &0)`; + `real_integral (:real) (\y:real. g y * std_normal_density y)`] + HAS_REAL_INTEGRAL_LE) THEN BETA_TAC THEN + REWRITE_TAC[REAL_INTEGRAL_RESTRICT_UNIV] THEN ANTS_TAC THENL [CONJ_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. cos(t * (Y:A->real) x)`; `a:real`] - SIMPLE_RV_CMUL) THEN - BETA_TAC THEN ASM_SIMP_TAC[]; - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. sin(t * (Y:A->real) x)`; `b:real`] - SIMPLE_RV_CMUL) THEN - BETA_TAC THEN ASM_SIMP_TAC[]]; - ALL_TAC] THEN - DISCH_THEN SUBST1_TAC THEN - (* E[a*cos] = a * E[cos] *) - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. cos(t * (Y:A->real) x)`; `a:real`] - SIMPLE_EXPECTATION_CMUL) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN - (* E[b*sin] = b * E[sin] *) - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. sin(t * (Y:A->real) x)`; `b:real`] - SIMPLE_EXPECTATION_CMUL) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN - REFL_TAC);; + [REWRITE_TAC[HAS_REAL_INTEGRAL_RESTRICT_UNIV] THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + GEN_TAC THEN REWRITE_TAC[IN_UNIV; IN_ELIM_THM] THEN + ASM_CASES_TAC `x <= a` THENL + [ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!y:real. y <= a ==> g y = &1` THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]; + ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN + MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN + UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REAL_ARITH_TAC]; + SIMP_TAC[]] +);; + + +(* Char fn uniqueness for the standard normal: + If char fns converge to exp(-t^2/2) and CDFs converge at x to l, + then l = std_normal_cdf(x). + + Uses a sandwich argument with piecewise linear test functions. *) +let SIMPLE_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove + (`!p:A prob_space (X:num->A->real) x l. + (!n. simple_rv p (X n)) /\ + (?C. &0 < C /\ !n. simple_expectation p (\x. X n x pow 2) <= C) /\ + (!t. ((\n. simple_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + sequentially) /\ + (!t. ((\n. simple_char_fn_im p (X n) t) ---> &0) sequentially) /\ + ((\n. simple_cdf p (X n) x) ---> l) sequentially + ==> l = std_normal_cdf x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC CONTINUOUS_LIMIT_SANDWICH THEN + REWRITE_TAC[STD_NORMAL_CDF_CONTINUOUS] THEN + X_GEN_TAC `h:real` THEN DISCH_TAC THEN + CONJ_TAC THENL + [(* ---- Lower bound: std_normal_cdf(x - h) <= l ---- *) + ABBREV_TAC + `g_low = \y:real. max (&0) (min (&1) (&1 - (y - (x - h)) / h))` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `real_integral (:real) + (\y:real. g_low y * std_normal_density y)` THEN + CONJ_TAC THENL + [(* Phi(x-h) <= int g_low*density *) + MATCH_MP_TAC CDF_LE_INTEGRAL_BOUNDED THEN + EXPAND_TAC "g_low" THEN CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&1 <= &1 - (y - (x - h)) / h` MP_TAC THENL + [ASM_SIMP_TAC[REAL_ARITH `&1 <= &1 - z <=> z <= &0`; + REAL_LE_LDIV_EQ] THEN + ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + GEN_TAC THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + ASM_REAL_ARITH_TAC]]]]]]; + ALL_TAC] THEN + (* int g_low*density <= l: by limit comparison *) + MP_TAC(ISPECL + [`sequentially`; + `\n:num. simple_expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) n a))`; + `\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; + `real_integral (:real) + (\y:real. (g_low:real->real) y * std_normal_density y)`; + `l:real`] + REALLIM_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [(* E[g_low(X_n)] --> int g_low*density *) + MATCH_MP_TAC SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [(* ?C existential *) + EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* g_low continuous *) + EXPAND_TAC "g_low" THEN GEN_TAC THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + ASM_REAL_ARITH_TAC]]]]]; + (* g_low bounded *) + EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN + GEN_TAC THEN EXPAND_TAC "g_low" THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* E[g_low(X_n)] <= F_n(x) eventually *) + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_LE_CDF THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "g_low" THEN CONJ_TAC THENL + [(* g_low(y) <= 1 for y <= x *) + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; + (* g_low(y) <= 0 for y > x *) + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&1 - (y - (x - h)) / h < &0` MP_TAC THENL + [SUBGOAL_THEN `&1 < (y - (x - h)) / h` + (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN + ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]]; + SIMP_TAC[]]; + + (* ---- Upper bound: l <= std_normal_cdf(x + h) ---- *) + ABBREV_TAC + `g_up = \y:real. max (&0) (min (&1) ((x + h - y) / h))` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `real_integral (:real) + (\y:real. g_up y * std_normal_density y)` THEN + CONJ_TAC THENL + [(* l <= int g_up*density: by limit comparison *) + MP_TAC(ISPECL + [`sequentially`; + `\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; + `\n:num. simple_expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) n a))`; + `l:real`; + `real_integral (:real) + (\y:real. (g_up:real->real) y * std_normal_density y)`] + REALLIM_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [(* E[g_up(X_n)] --> int g_up*density *) + MATCH_MP_TAC SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [(* ?C existential *) + EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* g_up continuous *) + EXPAND_TAC "g_up" THEN GEN_TAC THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_CONST; REAL_CONTINUOUS_AT_ID]]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + ASM_REAL_ARITH_TAC]]]]; + (* g_up bounded *) + EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN + GEN_TAC THEN EXPAND_TAC "g_up" THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* F_n(x) <= E[g_up(X_n)] eventually *) + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC SIMPLE_CDF_LE_EXPECTATION THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "g_up" THEN CONJ_TAC THENL + [(* g_up(y) >= 1 for y <= x *) + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&1 <= (x + h - y) / h` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + (* g_up(y) >= 0 for y > x *) + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + SIMP_TAC[]]; -(* Trig polynomial expectations converge to the Gaussian integral. - Key intermediate lemma for weak convergence. *) -let TRIG_POLY_WEAK_CONVERGENCE = prove - (`!p:A prob_space (X:num->A->real) m (a:num->real) (b:num->real) (freq:num->real). - (!n. simple_rv p (X n)) /\ - (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) - sequentially) /\ - (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) - ==> ((\n. simple_expectation p - (\x. sum(0..m) (\k. a k * cos(freq k * X n x) + - b k * sin(freq k * X n x)))) ---> - sum(0..m) (\k. a k * exp(--(freq k pow 2 / &2)))) - sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Step 1: E[trig_poly(X_n)] = sum of char fn values for each n (admitted) *) + (* int g_up*density <= Phi(x+h) *) + MATCH_MP_TAC INTEGRAL_BOUNDED_LE_CDF THEN + EXPAND_TAC "g_up" THEN CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `(x + h - y) / h < &0` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + GEN_TAC THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_CONST; REAL_CONTINUOUS_AT_ID]]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + ASM_REAL_ARITH_TAC]]]]]]]);; + +(* ========================================================================= *) +(* LEVY CONTINUITY THEOREM (bridge from char fn to distribution) *) +(* ========================================================================= *) + +(* Levy's continuity theorem (one direction, specialized for CLT): + If the characteristic functions converge pointwise to the + characteristic function of N(0,1), and second moments are bounded, + then the CDFs converge to the standard normal CDF. + + The bounded second moment hypothesis gives tightness via + SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS. The CDF convergence step (Step 2) + uses Helly's selection theorem + Fourier uniqueness. *) +let SIMPLE_LEVY_CONTINUITY_CLT = prove + (`!p:A prob_space (X:num->A->real). + (!n. simple_rv p (X n)) /\ + (?C. &0 < C /\ + !n. simple_expectation p (\x. (X:num->A->real) n x pow 2) <= C) /\ + (!t. ((\n. simple_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + sequentially) /\ + (!t. ((\n. simple_char_fn_im p (X n) t) ---> &0) sequentially) + ==> !x. ((\n. simple_cdf p (X n) x) ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `x:real` THEN + (* Step 1: Tightness from bounded second moments *) SUBGOAL_THEN - `!n:num. simple_expectation (p:A prob_space) - (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + - (b:num->real) k * sin(freq k * X n x))) = - sum(0..m) (\k. a k * char_fn_re p (X n) (freq k) + - b k * char_fn_im p (X n) (freq k))` + `!e. &0 < e ==> + ?M. &0 < M /\ + ?N:num. !n. N <= n ==> + prob (p:A prob_space) {a | a IN prob_carrier p /\ + abs((X:num->A->real) n a) >= M} < e` ASSUME_TAC THENL - [GEN_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\k:num. \x:A. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + - (b:num->real) k * sin(freq k * X n x)`; - `m:num`] - SIMPLE_EXPECTATION_SUM_NUMSEG) THEN - BETA_TAC THEN - ANTS_TAC THENL - [X_GEN_TAC `i:num` THEN DISCH_TAC THEN - (* Need: simple_rv p (\x. a i * cos(freq i * X n x) + b i * sin(freq i * X n x)) *) - MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; - `\y:real. cos((freq:num->real) i * y)`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; - `\y:real. sin((freq:num->real) i * y)`] - SIMPLE_RV_REAL_COMPOSE) THEN - ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. cos((freq:num->real) i * (X:num->A->real) n x)`; - `(a:num->real) i`] SIMPLE_RV_CMUL) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. sin((freq:num->real) i * (X:num->A->real) n x)`; - `(b:num->real) i`] SIMPLE_RV_CMUL) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. (a:num->real) i * cos((freq:num->real) i * (X:num->A->real) n x)`; - `\x:A. (b:num->real) i * sin((freq:num->real) i * (X:num->A->real) n x)`] - SIMPLE_RV_ADD) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN ACCEPT_TAC; - ALL_TAC] THEN - DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN - MATCH_MP_TAC SUM_EQ_NUMSEG THEN - X_GEN_TAC `k:num` THEN STRIP_TAC THEN BETA_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; - `(a:num->real) k`; `(b:num->real) k`; `(freq:num->real) k`] - SIMPLE_EXPECTATION_TRIG_TERM) THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Step 2: Rewrite the convergence using the decomposition *) - MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN - EXISTS_TAC `\n:num. sum(0..m) (\k. (a:num->real) k * char_fn_re (p:A prob_space) ((X:num->A->real) n) ((freq:num->real) k) + - (b:num->real) k * char_fn_im p (X n) (freq k))` THEN - CONJ_TAC THENL - [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + [X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `C:real`] + SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[] THEN EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Step 3: Sum of convergent sequences converges *) - MATCH_MP_TAC REALLIM_SUM THEN - REWRITE_TAC[FINITE_NUMSEG] THEN - X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN - BETA_TAC THEN - SUBGOAL_THEN `(a:num->real) k * exp (--((freq:num->real) k pow 2 / &2)) = - a k * exp (--(freq k pow 2 / &2)) + (b:num->real) k * &0` SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; - -(* Gaussian integral of a single trig term: uses forward reasoning with - explicit ISPECL to avoid higher-order matching issues *) -let HAS_INTEGRAL_TRIG_TERM = prove - (`!a b t. - ((\y. (a * cos(t * y) + b * sin(t * y)) * - std_normal_density y) has_real_integral - (a * exp(--(t pow 2 / &2)))) - (:real)`, - REPEAT GEN_TAC THEN - (* Rewrite goal function and value *) - SUBGOAL_THEN - `(\y:real. ((a:real) * cos((t:real) * y) + (b:real) * sin(t * y)) * - std_normal_density y) = - (\y. a * (std_normal_density y * cos(t * y)) + - b * (std_normal_density y * sin(t * y)))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `(a:real) * exp(--((t:real) pow 2 / &2)) = - a * exp(--(t pow 2 / &2)) + (b:real) * &0` - SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - (* Prove a * (density * cos) has integral a * exp *) - SUBGOAL_THEN - `((\y:real. (a:real) * (std_normal_density y * cos((t:real) * y))) - has_real_integral (a * exp(--(t pow 2 / &2)))) (:real)` - ASSUME_TAC THENL - [MP_TAC(ISPECL [`\y:real. std_normal_density y * cos((t:real) * y)`; - `exp(--((t:real) pow 2 / &2))`; - `(:real)`; - `a:real`] HAS_REAL_INTEGRAL_LMUL) THEN - REWRITE_TAC[STD_NORMAL_CHAR_FN_RE] THEN BETA_TAC THEN - DISCH_THEN ACCEPT_TAC; ALL_TAC] THEN - (* Prove b * (density * sin) has integral b * 0 *) - SUBGOAL_THEN - `((\y:real. (b:real) * (std_normal_density y * sin((t:real) * y))) - has_real_integral (b * &0)) (:real)` - ASSUME_TAC THENL - [MP_TAC(ISPECL [`\y:real. std_normal_density y * sin((t:real) * y)`; - `&0`; - `(:real)`; - `b:real`] HAS_REAL_INTEGRAL_LMUL) THEN - REWRITE_TAC[STD_NORMAL_CHAR_FN_IM] THEN BETA_TAC THEN - DISCH_THEN ACCEPT_TAC; ALL_TAC] THEN - (* Combine with HAS_REAL_INTEGRAL_ADD *) + (* Step 2: Apply subsequence convergence principle + By REALLIM_SUBSEQ_SAME_LIMIT, it suffices to show every subsequence + has a sub-subsequence with CDFs converging to std_normal_cdf at x *) + MATCH_MP_TAC(ISPECL + [`\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; + `std_normal_cdf x`; `&1`] REALLIM_SUBSEQ_SAME_LIMIT) THEN + BETA_TAC THEN CONJ_TAC THENL + [(* CDFs are bounded by 1 in absolute value *) + GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN + MATCH_MP_TAC SIMPLE_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* For each subsequence r, find convergent sub-subsequence *) + X_GEN_TAC `r:num->num` THEN DISCH_TAC THEN + (* Step 2a: By Bolzano-Weierstrass, extract convergent sub-subsequence *) MP_TAC(ISPECL - [`\y:real. (a:real) * (std_normal_density y * cos((t:real) * y))`; - `\y:real. (b:real) * (std_normal_density y * sin((t:real) * y))`; - `(a:real) * exp(--((t:real) pow 2 / &2))`; - `(b:real) * &0`; - `(:real)`] HAS_REAL_INTEGRAL_ADD) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN ACCEPT_TAC);; + [`\k:num. simple_cdf (p:A prob_space) ((X:num->A->real) ((r:num->num) k)) x`; + `&1`] BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN + MATCH_MP_TAC SIMPLE_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `l:real` + (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `s:num->num` THEN ASM_REWRITE_TAC[] THEN + (* Step 2b: The subsequential limit must equal std_normal_cdf x. + Apply SIMPLE_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT to the sub-subsequence. *) + SUBGOAL_THEN `l:real = std_normal_cdf x` SUBST_ALL_TAC THENL + [MP_TAC(ISPECL + [`p:A prob_space`; + `\k:num. (X:num->A->real) ((r:num->num) ((s:num->num) k))`; + `x:real`; `l:real`] + SIMPLE_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [(* simple_char_fn_re convergence along r o s *) + X_GEN_TAC `t:real` THEN + MP_TAC(ISPECL + [`\n:num. simple_char_fn_re (p:A prob_space) ((X:num->A->real) n) t`; + `exp(--(t pow 2 / &2))`; + `\k:num. (r:num->num) ((s:num->num) k)`] + REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* simple_char_fn_im convergence along r o s *) + X_GEN_TAC `t:real` THEN + MP_TAC(ISPECL + [`\n:num. simple_char_fn_im (p:A prob_space) ((X:num->A->real) n) t`; + `&0`; + `\k:num. (r:num->num) ((s:num->num) k)`] + REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* CENTRAL LIMIT THEOREM - CONVERGENCE IN DISTRIBUTION *) +(* ========================================================================= *) + +(* Characteristic function scaling under division *) +let SIMPLE_CHAR_FN_RE_DIV = prove + (`!p:A prob_space (X:A->real) c t. + simple_char_fn_re p (\x. X x / c) t = simple_char_fn_re p X (t / c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_char_fn_re; real_div] THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; -(* Full trig polynomial Gaussian integral - uses HAS_INTEGRAL_TRIG_TERM *) -let GAUSSIAN_INTEGRAL_TRIG_POLY = prove - (`!m:num (a:num->real) (b:num->real) (freq:num->real). - ((\y. sum(0..m) (\k. a k * cos(freq k * y) + - b k * sin(freq k * y)) * - std_normal_density y) has_real_integral - sum(0..m) (\k. a k * exp(--(freq k pow 2 / &2)))) - (:real)`, - REPEAT GEN_TAC THEN - SUBGOAL_THEN - `(\y:real. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * y) + - (b:num->real) k * sin(freq k * y)) * - std_normal_density y) = - (\y. sum(0..m) (\k. (a k * cos(freq k * y) + - b k * sin(freq k * y)) * - std_normal_density y))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN - REWRITE_TAC[GSYM SUM_RMUL]; ALL_TAC] THEN - MP_TAC(INST - [`\k:num. (a:num->real) k * exp(--((freq:num->real) k pow 2 / &2))`, - `i:num->real`] - (ISPECL - [`\k:num. \y:real. ((a:num->real) k * cos((freq:num->real) k * y) + - (b:num->real) k * sin(freq k * y)) * - std_normal_density y`; - `(:real)`; - `0..m`] - HAS_REAL_INTEGRAL_SUM)) THEN +let SIMPLE_CHAR_FN_IM_DIV = prove + (`!p:A prob_space (X:A->real) c t. + simple_char_fn_im p (\x. X x / c) t = simple_char_fn_im p X (t / c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_char_fn_im; real_div] THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; + +(* Simple RV closure under division *) +let SIMPLE_RV_DIV = prove + (`!p:A prob_space X c. + simple_rv p X ==> simple_rv p (\x. X x / c)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. (X:A->real) x / c) = (\x. inv(c) * X x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]]);; + +let SIMPLE_RV_SUM_DIV = prove + (`!p:A prob_space (X:num->A->real) n c. + (!k. simple_rv p (X k)) + ==> simple_rv p (\a. sum(0..n) (\i. X i a) / c)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_RV_DIV THEN + MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_REWRITE_TAC[]);; + +(* CLT: The standardized sum of IID random variables with mean 0 and + finite variance converges in distribution to the standard normal. + This combines CLT_VARIANCE_FORM with SIMPLE_LEVY_CONTINUITY_CLT. *) +let CLT_CONVERGENCE_IN_DISTRIBUTION = prove + (`!p:A prob_space (X:num->A->real). + (!n. simple_rv p (X n)) /\ + (!i. simple_expectation p (X i) = &0) /\ + &0 < simple_variance p (X 0) /\ + (!i. simple_variance p (X i) = simple_variance p (X 0)) /\ + (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!i t. simple_char_fn_re p (X i) t = simple_char_fn_re p (X 0) t /\ + simple_char_fn_im p (X i) t = simple_char_fn_im p (X 0) t) /\ + (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) + ==> !x. ((\n. simple_cdf p + (\a. sum(0..n) (\i. X i a) / + (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n)))) x) + ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\n:num. \a:A. sum(0..n) (\i. (X:num->A->real) i a) / + (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n)))`] + SIMPLE_LEVY_CONTINUITY_CLT) THEN BETA_TAC THEN - REWRITE_TAC[FINITE_NUMSEG] THEN ANTS_TAC THENL - [REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN - REWRITE_TAC[HAS_INTEGRAL_TRIG_TERM]; - DISCH_THEN ACCEPT_TAC]);; + [FIRST_X_ASSUM(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN + ABBREV_TAC `sigma2 = simple_variance (p:A prob_space) ((X:num->A->real) 0)` THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_SUM_DIV THEN ASM_REWRITE_TAC[]; -(* Helper lemma for Step C of WEAK_CONVERGENCE_FROM_CHAR_FN: - Pointwise trig approximation bound + second moment bound - implies expectation error bound *) -let STEP_C_BOUND = prove - (`!p:A prob_space (X:num->A->real) (g:real->real) (T':real->real) BB CC e M. - (!n. simple_rv p (X n)) /\ - &0 < CC /\ - (!n. simple_expectation p (\x. X n x pow 2) <= CC) /\ - (!y. abs(g y) <= BB) /\ - (!y. abs(T' y) <= BB) /\ - &0 < BB /\ &0 < e /\ &0 < M /\ - (!y. abs y <= M ==> abs(g y - T' y) < e / &6) - ==> !n:num. abs(simple_expectation p (\a. g(X n a)) - - simple_expectation p (\a. T'(X n a))) <= - e / &6 + &2 * BB * CC / M pow 2`, - REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `n:num` THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (g:real->real)((X:num->A->real) n a))` ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `g:real->real`] SIMPLE_RV_REAL_COMPOSE) THEN - REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (T':real->real)((X:num->A->real) n a))` ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `T':real->real`] SIMPLE_RV_REAL_COMPOSE) THEN - REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\a:A. (X:num->A->real) n a pow 2)` ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `\y:real. y pow 2`] SIMPLE_RV_REAL_COMPOSE) THEN - BETA_TAC THEN REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN - `simple_expectation (p:A prob_space) (\a:A. (g:real->real)((X:num->A->real) n a)) - - simple_expectation p (\a. (T':real->real)(X n a)) = - simple_expectation p (\a. g(X n a) - T'(X n a))` - (fun th -> REWRITE_TAC[th]) THENL - [CONV_TAC SYM_CONV THEN - MATCH_MP_TAC SIMPLE_EXPECTATION_SUB THEN ASM_REWRITE_TAC[]; + (* Bounded second moments for standardized sums: E[S_n^2] <= 2 *) + EXISTS_TAC `&2` THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `n:num` THEN + SUBGOAL_THEN `&0 < sigma2` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < sqrt sigma2` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < sqrt(&(SUC n))` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LT THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN `~(sqrt sigma2 * sqrt(&(SUC n)) = &0)` ASSUME_TAC THENL + [MATCH_MP_TAC (REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN + MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_rv (p:A prob_space) (\a:A. sum(0..n) (\i. (X:num->A->real) i a))` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\a:A. sum(0..n) (\i. (X:num->A->real) i a)`; + `sqrt sigma2 * sqrt(&(SUC n))`] + SIMPLE_EXPECTATION_POW2_DIV) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\a:A. sum(0..n) (\i. (X:num->A->real) i a)) = &0` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`] + SIMPLE_EXPECTATION_SUM_ZERO) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. (sum(0..n) (\i. (X:num->A->real) i x)) pow 2) = + simple_variance p (\a. sum(0..n) (\i. X i a))` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SIMPLE_VARIANCE_MEAN_ZERO THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_variance (p:A prob_space) + (\a:A. sum(0..n) (\i. (X:num->A->real) i a)) = &(SUC n) * sigma2` + SUBST1_TAC THENL + [EXPAND_TAC "sigma2" THEN + MATCH_MP_TAC SIMPLE_VARIANCE_SUM_IID THEN + REPEAT CONJ_TAC THENL + [ASM_MESON_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_COVARIANCE_INDEP THEN + ASM_MESON_TAC[]; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `(sqrt sigma2 * sqrt (&(SUC n))) pow 2 = sigma2 * &(SUC n)` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_MUL] THEN + SUBGOAL_THEN `sqrt sigma2 pow 2 = sigma2` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sqrt (&(SUC n)) pow 2 = &(SUC n)` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < sigma2 * &(SUC n)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + SUBGOAL_THEN `&(SUC n) * sigma2 = sigma2 * &(SUC n)` SUBST1_TAC THENL + [MESON_TAC[REAL_MUL_SYM]; ALL_TAC] THEN + MATCH_MP_TAC (REAL_ARITH `&0 <= x ==> x <= &2 * x`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; REWRITE_TAC[REAL_POS]]; + + X_GEN_TAC `t:real` THEN EXPAND_TAC "sigma2" THEN + REWRITE_TAC[SIMPLE_CHAR_FN_RE_DIV] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t:real`] + CLT_VARIANCE_FORM) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; MESON_TAC[]]; + X_GEN_TAC `t:real` THEN EXPAND_TAC "sigma2" THEN + REWRITE_TAC[SIMPLE_CHAR_FN_IM_DIV] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t:real`] + CLT_VARIANCE_FORM) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; MESON_TAC[]]]; + SIMP_TAC[]]);; + + +(* ------------------------------------------------------------------------- *) +(* Agreement theorems: definitions equal simple_ definitions for simple RVs *) +(* ------------------------------------------------------------------------- *) + +let CDF_SIMPLE_AGREE = prove + (`!p:A prob_space X x. cdf p X x = simple_cdf p X x`, + REWRITE_TAC[cdf; simple_cdf]);; + +(* Agreement: char_fn_re = simple_char_fn_re for simple RVs *) +let CHAR_FN_RE_SIMPLE = prove + (`!p:A prob_space X t. simple_rv p X ==> char_fn_re p X t = simple_char_fn_re p X t`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re; simple_char_fn_re] THEN + MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN + MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]);; + +(* Agreement: char_fn_im = simple_char_fn_im for simple RVs *) +let CHAR_FN_IM_SIMPLE = prove + (`!p:A prob_space X t. simple_rv p X ==> char_fn_im p X t = simple_char_fn_im p X t`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_im; simple_char_fn_im] THEN + MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN + MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]);; + +(* CLT: stated with general definitions, reduces to simple CLT *) +let GENERAL_CLT = prove + (`!p:A prob_space (X:num->A->real). + (!n. simple_rv p (X n)) /\ + (!i. expectation p (X i) = &0) /\ + &0 < variance p (X 0) /\ + (!i. variance p (X i) = variance p (X 0)) /\ + (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ + (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) + ==> !x. ((\n. cdf p + (\a. sum(0..n) (\i. X i a) / + (sqrt(variance p (X 0)) * sqrt(&(SUC n)))) x) + ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Rewrite cdf to simple_cdf *) + REWRITE_TAC[CDF_SIMPLE_AGREE] THEN + (* Rewrite variance to simple_variance *) + SUBGOAL_THEN `variance (p:A prob_space) ((X:num->A->real) 0) = + simple_variance p (X 0)` SUBST1_TAC THENL + [MATCH_MP_TAC VARIANCE_SIMPLE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Apply the simple CLT *) + MATCH_MP_TAC CLT_CONVERGENCE_IN_DISTRIBUTION THEN + (* Establish intermediate agreement facts *) + SUBGOAL_THEN `!i:num. simple_expectation (p:A prob_space) + ((X:num->A->real) i) = expectation p (X i)` ASSUME_TAC THENL + [GEN_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `simple_expectation (p:A prob_space) - (\a:A. abs((g:real->real)((X:num->A->real) n a) - (T':real->real)(X n a)))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_EXPECTATION_ABS_LE THEN - MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `!i:num. simple_variance (p:A prob_space) + ((X:num->A->real) i) = variance p (X i)` ASSUME_TAC THENL + [GEN_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC VARIANCE_SIMPLE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `simple_expectation (p:A prob_space) - (\a:A. e / &6 + &2 * BB * (X:num->A->real) n a pow 2 / M pow 2)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN - CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_ABS THEN MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN + SUBGOAL_THEN `!i:num t:real. + simple_char_fn_re (p:A prob_space) ((X:num->A->real) i) t = + char_fn_re p (X i) t /\ + simple_char_fn_im p (X i) t = char_fn_im p (X i) t` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN CONJ_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC CHAR_FN_RE_SIMPLE THEN + ASM_REWRITE_TAC[]; + CONV_TAC SYM_CONV THEN MATCH_MP_TAC CHAR_FN_IM_SIMPLE THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + GEN_TAC THEN ASM_MESON_TAC[]; + ASM_MESON_TAC[]; + GEN_TAC THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]);; + +(* ================================================================== *) +(* Bridge lemmas: mutually_indep_rv ==> indep_rv *) +(* ================================================================== *) + +(* CDF set decomposition for simple random variables *) +let SIMPLE_RV_CDF_DECOMPOSE = prove + (`!p:A prob_space X a. + simple_rv p X + ==> {x | x IN prob_carrier p /\ X x <= a} = + UNIONS (IMAGE (\v. {x | x IN prob_carrier p /\ X x = v}) + {v | v IN IMAGE X (prob_carrier p) /\ v <= a})`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[UNIONS_IMAGE; EXTENSION] THEN + X_GEN_TAC `z:A` THEN REWRITE_TAC[IN_ELIM_THM] THEN + EQ_TAC THENL + [STRIP_TAC THEN EXISTS_TAC `(X:A->real) z` THEN + ASM_REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]);; + +(* CDF probability as sum over level sets *) +let SIMPLE_RV_CDF_AS_SUM = prove + (`!p:A prob_space X a. + simple_rv p X + ==> prob p {x | x IN prob_carrier p /\ X x <= a} = + sum {v | v IN IMAGE X (prob_carrier p) /\ v <= a} + (\v. prob p {x | x IN prob_carrier p /\ X x = v})`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(fun th -> REWRITE_TAC[MATCH_MP SIMPLE_RV_CDF_DECOMPOSE th]) THEN + MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE ((X:A->real)) (prob_carrier p)` THEN CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[SIMPLE_RV_CONST]; ALL_TAC] THEN - MATCH_MP_TAC SIMPLE_RV_CMUL THEN - SUBGOAL_THEN `(\a:A. BB * (X:num->A->real) n a pow 2 / M pow 2) = - (\a. (\y:real. BB * y pow 2 / M pow 2) (X n a))` SUBST1_TAC THENL - [REWRITE_TAC[]; ALL_TAC] THEN - MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; - `\y:real. BB * y pow 2 / M pow 2`] SIMPLE_RV_REAL_COMPOSE) THEN - BETA_TAC THEN REWRITE_TAC[ETA_AX] THEN - DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - X_GEN_TAC `a:A` THEN DISCH_TAC THEN BETA_TAC THEN - ASM_CASES_TAC `abs((X:num->A->real) n (a:A)) <= M` THENL - [MATCH_MP_TAC(REAL_ARITH `x < ep /\ &0 <= r ==> x <= ep + r`) THEN - CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_DIV THEN - REWRITE_TAC[REAL_LE_POW_2] THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_SIMP_TAC[REAL_POW_LT]]]; - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `&2 * BB * (X:num->A->real) n (a:A) pow 2 / M pow 2` THEN + [UNDISCH_TAC `simple_rv p (X:A->real)` THEN + REWRITE_TAC[simple_rv; GSYM SIMPLE_IMAGE] THEN + SIMP_TAC[FINITE_IMAGE]; + SET_TAC[]]; + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN + UNDISCH_TAC `simple_rv p (X:A->real)` THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + REPEAT GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; DISJOINT] THEN + STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_INTER; NOT_IN_EMPTY; + IN_ELIM_THM] THEN + ASM_MESON_TAC[]]);; + +(* Joint CDF as double sum for simple RVs *) +let SIMPLE_RV_JOINT_CDF_AS_DOUBLE_SUM = prove + (`!p:A prob_space X Y a b. + simple_rv p X /\ simple_rv p Y + ==> prob p {x | x IN prob_carrier p /\ X x <= a /\ Y x <= b} = + sum {v | v IN IMAGE X (prob_carrier p) /\ v <= a} + (\v. sum {w | w IN IMAGE Y (prob_carrier p) /\ w <= b} + (\w. prob p {x | x IN prob_carrier p /\ X x = v /\ Y x = w}))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:A->real) x <= a /\ (Y:A->real) x <= b} = + UNIONS (IMAGE (\v. {x | x IN prob_carrier p /\ X x = v /\ Y x <= b}) + {v | v IN IMAGE X (prob_carrier p) /\ v <= a})` + SUBST1_TAC THENL + [REWRITE_TAC[UNIONS_IMAGE; EXTENSION] THEN + X_GEN_TAC `z:A` THEN REWRITE_TAC[IN_ELIM_THM] THEN + EQ_TAC THENL + [STRIP_TAC THEN EXISTS_TAC `(X:A->real) z` THEN + ASM_REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob p (UNIONS (IMAGE (\v. {x:A | x IN prob_carrier p /\ + (X:A->real) x = v /\ (Y:A->real) x <= b}) + {v | v IN IMAGE X (prob_carrier p) /\ v <= a})) = + sum {v | v IN IMAGE X (prob_carrier p) /\ v <= a} + (\v. prob p {x | x IN prob_carrier p /\ X x = v /\ Y x <= b})` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE ((X:A->real)) (prob_carrier p)` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * BB` THEN CONJ_TAC THENL - [MATCH_MP_TAC(REAL_ARITH - `abs x <= B /\ abs y <= B ==> abs(x - y) <= &2 * B`) THEN - ASM_REWRITE_TAC[]; - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_POW_LT] THEN - REWRITE_TAC[REAL_MUL_LID; GSYM REAL_LE_SQUARE_ABS] THEN - UNDISCH_TAC `~(abs((X:num->A->real) n (a:A)) <= M)` THEN - UNDISCH_TAC `&0 < M` THEN REAL_ARITH_TAC]]]; - UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]; + [UNDISCH_TAC `simple_rv p (X:A->real)` THEN + REWRITE_TAC[simple_rv; GSYM SIMPLE_IMAGE] THEN SIMP_TAC[FINITE_IMAGE]; + SET_TAC[]]; + X_GEN_TAC `v:real` THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:A->real) x = v /\ + (Y:A->real) x <= b} = + {x | x IN prob_carrier p /\ X x = v} INTER + {x | x IN prob_carrier p /\ Y x <= b}` + SUBST1_TAC THENL [SET_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN + UNDISCH_TAC `simple_rv p (X:A->real)` THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + UNDISCH_TAC `simple_rv p (Y:A->real)` THEN + REWRITE_TAC[simple_rv; random_variable] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `b:real`) THEN REWRITE_TAC[]]; + REPEAT GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; DISJOINT] THEN + STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_INTER; NOT_IN_EMPTY; + IN_ELIM_THM] THEN + ASM_MESON_TAC[]]; ALL_TAC] THEN - (* E[e/6 + 2*BB*X^2/M^2] = e/6 + 2*BB*E[X^2]/M^2 *) + MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `v:real` THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN REWRITE_TAC[] THEN SUBGOAL_THEN - `simple_expectation (p:A prob_space) - (\a:A. e / &6 + &2 * BB * (X:num->A->real) n a pow 2 / M pow 2) = - e / &6 + &2 * BB * simple_expectation p (\a. X n a pow 2) / M pow 2` + `{x:A | x IN prob_carrier p /\ (X:A->real) x = v /\ (Y:A->real) x <= b} = + UNIONS (IMAGE (\w. {x | x IN prob_carrier p /\ X x = v /\ Y x = w}) + {w | w IN IMAGE Y (prob_carrier p) /\ w <= b})` SUBST1_TAC THENL - [REWRITE_TAC[real_div] THEN - SUBGOAL_THEN `(\a:A. e * inv(&6) + &2 * BB * (X:num->A->real) n a pow 2 * inv(M pow 2)) = - (\a. e * inv(&6) + &2 * BB * (inv(M pow 2) * X n a pow 2))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN - AP_TERM_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + [REWRITE_TAC[UNIONS_IMAGE; EXTENSION] THEN + X_GEN_TAC `z:A` THEN REWRITE_TAC[IN_ELIM_THM] THEN + EQ_TAC THENL + [STRIP_TAC THEN EXISTS_TAC `(Y:A->real) z` THEN + ASM_REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE ((Y:A->real)) (prob_carrier p)` THEN + CONJ_TAC THENL + [UNDISCH_TAC `simple_rv p (Y:A->real)` THEN + REWRITE_TAC[simple_rv; GSYM SIMPLE_IMAGE] THEN SIMP_TAC[FINITE_IMAGE]; + SET_TAC[]]; + X_GEN_TAC `w:real` THEN REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MATCH_MP_TAC SIMPLE_RV_LEVEL_SET_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM; DISJOINT] THEN + STRIP_TAC THEN REWRITE_TAC[EXTENSION; IN_INTER; NOT_IN_EMPTY; + IN_ELIM_THM] THEN + ASM_MESON_TAC[]]);; + +(* Pairwise bridge: mutually_indep_rv ==> pairwise indep_rv *) +let MUTUALLY_INDEP_RV_IMP_INDEP_RV = prove + (`!p:A prob_space X n i j. + mutually_indep_rv p X n /\ + simple_rv p (X i) /\ simple_rv p (X j) /\ + i <= n /\ j <= n /\ ~(i = j) + ==> indep_rv p (X i) (X j)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[indep_rv] THEN + SUBGOAL_THEN `random_variable p ((X:num->A->real) i)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_rv p ((X:num->A->real) i)` THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable p ((X:num->A->real) j)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_rv p ((X:num->A->real) j)` THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) i)` (fun th -> + REWRITE_TAC[MATCH_MP SIMPLE_RV_CDF_AS_SUM th]) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) j)` (fun th -> + REWRITE_TAC[MATCH_MP SIMPLE_RV_CDF_AS_SUM th]) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) i) /\ + simple_rv p ((X:num->A->real) j)` (fun th -> + REWRITE_TAC[MATCH_MP SIMPLE_RV_JOINT_CDF_AS_DOUBLE_SUM th]) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!v w. prob p {x:A | x IN prob_carrier p /\ + (X:num->A->real) i x = v /\ X j x = w} = + prob p {x | x IN prob_carrier p /\ X i x = v} * + prob p {x | x IN prob_carrier p /\ X j x = w}` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(MP_TAC o SPECL [`{i:num,j}`; `\m:num. if m = i then v else w:real`]) THEN + REWRITE_TAC[FINITE_INSERT; FINITE_EMPTY; NOT_INSERT_EMPTY] THEN + ANTS_TAC THENL + [REWRITE_TAC[SUBSET; IN_INSERT; NOT_IN_EMPTY; IN_NUMSEG] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) - (\a:A. inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) - (\a:A. BB * inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) - (\a:A. &2 * BB * inv(M pow 2) * (X:num->A->real) n a pow 2)` ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\a:A. e * inv(&6)`; - `\a:A. &2 * BB * inv(M pow 2) * (X:num->A->real) n a pow 2`] - SIMPLE_EXPECTATION_ADD) THEN - ASM_REWRITE_TAC[SIMPLE_RV_CONST] THEN BETA_TAC THEN - DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN - REWRITE_TAC[SIMPLE_EXPECTATION_CONST] THEN - AP_TERM_TAC THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_CMUL] THEN - REAL_ARITH_TAC; + REWRITE_TAC[INTERS_2; IMAGE_CLAUSES] THEN + SIMP_TAC[PRODUCT_CLAUSES; FINITE_INSERT; FINITE_EMPTY] THEN + ASM_REWRITE_TAC[NOT_IN_EMPTY; IN_INSERT; PRODUCT_CLAUSES; REAL_MUL_RID] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + AP_TERM_TAC THEN REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN + GEN_TAC THEN ASM_MESON_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC(REAL_ARITH `x <= y ==> a + x <= a + y`) THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; ALL_TAC] THEN - ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POW_LT]);; - -(* Helper lemma for Step D of WEAK_CONVERGENCE_FROM_CHAR_FN: - Pointwise trig approximation bound implies integral error bound - against standard normal density *) -let STEP_D_BOUND = prove - (`!g:real->real (T':real->real) BB e M L. - (!y. g real_continuous atreal y) /\ - (!y. abs(g y) <= BB) /\ - (!y. abs(T' y) <= BB) /\ - &0 < BB /\ &0 < e /\ &0 < M /\ - (!y. abs y <= M ==> abs(g y - T' y) < e / &6) /\ - ((\y. T' y * std_normal_density y) has_real_integral L) (:real) - ==> abs(L - real_integral (:real) (\y. g y * std_normal_density y)) <= - e / &6 + &2 * BB / M pow 2`, + ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUM_LMUL] THEN + REWRITE_TAC[SUM_RMUL]);; + +(* Atom-level point mass factorization *) +let RV_SIGMA_ATOM_INDEP_POINT_MASS = prove + (`!p:A prob_space X n k x w. + mutually_indep_rv p X n /\ + (!m. m <= n ==> simple_rv p (X m)) /\ + SUC k <= n /\ x IN prob_carrier p + ==> prob p (rv_sigma_atom p X (SUC k) x INTER + {y | y IN prob_carrier p /\ X (SUC k) y = w}) = + prob p (rv_sigma_atom p X (SUC k) x) * + prob p {y | y IN prob_carrier p /\ X (SUC k) y = w}`, REPEAT GEN_TAC THEN STRIP_TAC THEN - SUBGOAL_THEN - `(\y. (g:real->real) y * std_normal_density y) real_integrable_on (:real)` + SUBGOAL_THEN `rv_sigma_atom p (X:num->A->real) (SUC k) x = + INTERS (IMAGE (\m. {y:A | y IN prob_carrier p /\ X m y = X m x}) + {m | m < SUC k})` ASSUME_TAC THENL - [MATCH_MP_TAC ABSOLUTELY_REAL_INTEGRABLE_IMP_INTEGRABLE THEN - MATCH_MP_TAC ABSOLUTELY_REAL_INTEGRABLE_BOUNDED_MEASURABLE_PRODUCT THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_IMP_REAL_MEASURABLE_ON_CLOSED_SUBSET THEN - REWRITE_TAC[REAL_CLOSED_UNIV] THEN - ASM_SIMP_TAC[REAL_CONTINUOUS_ON_EQ_REAL_CONTINUOUS_AT; - REAL_OPEN_UNIV; IN_UNIV]; ALL_TAC] THEN - CONJ_TAC THENL - [REWRITE_TAC[real_bounded; IN_IMAGE; IN_UNIV] THEN - EXISTS_TAC `BB:real` THEN ASM_MESON_TAC[]; ALL_TAC] THEN - REWRITE_TAC[absolutely_real_integrable_on] THEN CONJ_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; - SUBGOAL_THEN `(\x:real. abs(std_normal_density x)) = std_normal_density` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]; - MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]]]; + [REWRITE_TAC[rv_sigma_atom; EXTENSION; IN_INTERS; IN_IMAGE; + IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN X_GEN_TAC `s:A->bool` THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + ASM_REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) 0 y = X 0 x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN REWRITE_TAC[IN_ELIM_THM] THEN ARITH_TAC; + SIMP_TAC[IN_ELIM_THM]]; + X_GEN_TAC `m:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) m y = X m x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `m:num` THEN ASM_REWRITE_TAC[IN_ELIM_THM]; + SIMP_TAC[IN_ELIM_THM]]]]; + ALL_TAC] THEN + ABBREV_TAC `g = \m:num. if m < SUC k then (X:num->A->real) m x else w` THEN + SUBGOAL_THEN `!m:num. m < SUC k ==> (g:num->real) m = (X:num->A->real) m x` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `L = real_integral (:real) - (\y. (T':real->real) y * std_normal_density y)` SUBST1_TAC THENL - [MATCH_MP_TAC(GSYM REAL_INTEGRAL_UNIQUE) THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(g:num->real) (SUC k) = w` ASSUME_TAC THENL + [EXPAND_TAC "g" THEN REWRITE_TAC[LT_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `{m:num | m <= SUC k} = {m | m < SUC k} UNION {SUC k}` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_INSERT; NOT_IN_EMPTY; + IN_ELIM_THM] THEN ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `(\y. (T':real->real) y * std_normal_density y) - real_integrable_on (:real)` ASSUME_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `L:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN SUBGOAL_THEN - `real_integral (:real) (\y. (T':real->real) y * std_normal_density y) - - real_integral (:real) (\y. (g:real->real) y * std_normal_density y) = - real_integral (:real) (\y. T' y * std_normal_density y - - g y * std_normal_density y)` - SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_INTEGRAL_SUB THEN - ASM_REWRITE_TAC[]; ALL_TAC] THEN + `IMAGE (\m. {y:A | y IN prob_carrier p /\ (X:num->A->real) m y = g m}) + {m | m <= SUC k} = + IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) {m | m < SUC k} UNION + IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) {SUC k:num}` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[IMAGE_UNION]; ALL_TAC] THEN SUBGOAL_THEN - `(\y:real. (T':real->real) y * std_normal_density y - - (g:real->real) y * std_normal_density y) = - (\y. (T' y - g y) * std_normal_density y)` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; - ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `real_integral (:real) - (\y. (e / &6 + &2 * BB * y pow 2 / M pow 2) * - std_normal_density y)` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRAL_ABS_BOUND_INTEGRAL THEN CONJ_TAC THENL - [SUBGOAL_THEN - `(\y:real. ((T':real->real) y - (g:real->real) y) * - std_normal_density y) = - (\y. T' y * std_normal_density y - g y * std_normal_density y)` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - CONJ_TAC THENL - [SUBGOAL_THEN - `(\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * - std_normal_density y) = - (\y. e / &6 * std_normal_density y + - &2 * BB / M pow 2 * (y pow 2 * std_normal_density y))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_INTEGRABLE_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - MATCH_MP_TAC REAL_INTEGRABLE_LMUL THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN - EXISTS_TAC `&1` THEN REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]]]; - ALL_TAC] THEN - REWRITE_TAC[IN_UNIV] THEN X_GEN_TAC `y:real` THEN BETA_TAC THEN - REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `abs(std_normal_density y) = std_normal_density y` - SUBST1_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [ASM_CASES_TAC `abs(y:real) <= M` THENL - [MATCH_MP_TAC(REAL_ARITH `x < ep /\ &0 <= r ==> x <= ep + r`) THEN - CONJ_TAC THENL - [ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN ASM_SIMP_TAC[]; - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_DIV THEN - REWRITE_TAC[REAL_LE_POW_2] THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_SIMP_TAC[REAL_POW_LT]]]]; - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `&2 * BB * y pow 2 / M pow 2` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&2 * BB` THEN - CONJ_TAC THENL - [MATCH_MP_TAC(REAL_ARITH - `abs x <= B /\ abs y <= B ==> abs(x - y) <= &2 * B`) THEN - ASM_REWRITE_TAC[]; - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_RID] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_POW_LT] THEN - REWRITE_TAC[REAL_MUL_LID; GSYM REAL_LE_SQUARE_ABS] THEN - UNDISCH_TAC `~(abs(y:real) <= M)` THEN - UNDISCH_TAC `&0 < M` THEN REAL_ARITH_TAC]]]; - UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]; - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG]]; + `IMAGE (\m. {y:A | y IN prob_carrier p /\ (X:num->A->real) m y = g m}) + {SUC k:num} = + {{y | y IN prob_carrier p /\ X (SUC k) y = g (SUC k)}}` + ASSUME_TAC THENL + [REWRITE_TAC[IMAGE_CLAUSES; UNION_EMPTY]; ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\m. {y:A | y IN prob_carrier p /\ + (X:num->A->real) m y = g m}) {m | m <= SUC k}) = + INTERS (IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) + {m | m < SUC k}) INTER + INTERS (IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) + {SUC k:num})` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[INTERS_UNION]; ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\m. {y:A | y IN prob_carrier p /\ + (X:num->A->real) m y = g m}) {SUC k:num}) = + {y | y IN prob_carrier p /\ X (SUC k) y = w}` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[INTERS_1]; ALL_TAC] THEN + SUBGOAL_THEN + `!m:num. m < SUC k ==> + {y:A | y IN prob_carrier p /\ (X:num->A->real) m y = g m} = + {y | y IN prob_carrier p /\ X m y = X m x}` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + AP_TERM_TAC THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\m. {y:A | y IN prob_carrier p /\ (X:num->A->real) m y = g m}) + {m | m < SUC k} = + IMAGE (\m. {y | y IN prob_carrier p /\ X m y = X m x}) + {m | m < SUC k}` + ASSUME_TAC THENL + [MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `m:num` THEN ASM_SIMP_TAC[]; ALL_TAC] THEN SUBGOAL_THEN - `((\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * - std_normal_density y) - has_real_integral (e / &6 + &2 * BB / M pow 2)) (:real)` - (fun th -> REWRITE_TAC[MATCH_MP REAL_INTEGRAL_UNIQUE th; - REAL_LE_REFL]) THEN + `rv_sigma_atom p (X:num->A->real) (SUC k) x INTER + {y:A | y IN prob_carrier p /\ X (SUC k) y = w} = + INTERS (IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) + {m | m <= SUC k})` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `{m:num | m <= SUC k} SUBSET 0..n` ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ASM_ARITH_TAC; + ALL_TAC] THEN SUBGOAL_THEN - `(\y:real. (e / &6 + &2 * BB * y pow 2 / M pow 2) * - std_normal_density y) = - (\y. e / &6 * std_normal_density y + - &2 * BB / M pow 2 * (y pow 2 * std_normal_density y))` + `prob p (INTERS (IMAGE (\m. {y:A | y IN prob_carrier p /\ + (X:num->A->real) m y = g m}) {m | m <= SUC k})) = + product {m | m <= SUC k} + (\m. prob p {y | y IN prob_carrier p /\ X m y = g m})` + SUBST1_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(MP_TAC o SPECL [`{m:num | m <= SUC k}`; `g:num->real`]) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [REWRITE_TAC[FINITE_NUMSEG_LE]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `0` THEN ARITH_TAC; + REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `{m:num | m <= SUC k} = (SUC k) INSERT {m | m < SUC k}` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + [REWRITE_TAC[EXTENSION; IN_INSERT; IN_ELIM_THM] THEN ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `e / &6 + &2 * BB / M pow 2 = - e / &6 * &1 + &2 * BB / M pow 2 * &1` - SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRAL]; - MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN - MATCH_MP_TAC HAS_REAL_INTEGRAL_LMUL THEN - REWRITE_TAC[STD_NORMAL_SECOND_MOMENT]]);; - -let WEAK_CONVERGENCE_FROM_CHAR_FN = prove - (`!p:A prob_space (X:num->A->real) (g:real->real). - (!n. simple_rv p (X n)) /\ - (?C. &0 < C /\ !n. simple_expectation p (\x. X n x pow 2) <= C) /\ - (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) - sequentially) /\ - (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) /\ - (!y. g real_continuous atreal y) /\ - (?B. &0 < B /\ !y. abs(g y) <= B) - ==> ((\n. simple_expectation p (\a:A. g(X n a))) ---> - real_integral (:real) (\y. g y * std_normal_density y)) - sequentially`, - REPEAT GEN_TAC THEN - DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN - DISCH_THEN(CONJUNCTS_THEN2 - (X_CHOOSE_THEN `CC:real` STRIP_ASSUME_TAC) MP_TAC) THEN - DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + SIMP_TAC[PRODUCT_CLAUSES; FINITE_NUMSEG_LT] THEN + SUBGOAL_THEN `~(SUC k IN {m:num | m < SUC k})` ASSUME_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_MUL_SYM] THEN AP_TERM_TAC THEN + SUBGOAL_THEN + `INTERS (IMAGE (\m. {y:A | y IN prob_carrier p /\ + (X:num->A->real) m y = X m x}) {m | m < SUC k}) = + INTERS (IMAGE (\m. {y | y IN prob_carrier p /\ X m y = g m}) + {m | m < SUC k})` + SUBST1_TAC THENL + [AP_TERM_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN - DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC - (X_CHOOSE_THEN `BB:real` STRIP_ASSUME_TAC)) THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - ABBREV_TAC `M = sqrt(&12 * BB * (CC + &1) / e) + &1` THEN - SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL - [EXPAND_TAC "M" THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN - MATCH_MP_TAC SQRT_POS_LE THEN - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; - UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]]; ALL_TAC] THEN - (* Apply BOUNDED_CONTINUOUS_TRIG_APPROX *) - MP_TAC(SPECL [`g:real->real`; `BB:real`; `M:real`; `e / &6`] - BOUNDED_CONTINUOUS_TRIG_APPROX) THEN + DISCH_THEN(MP_TAC o SPECL [`{m:num | m < SUC k}`; `g:num->real`]) THEN ANTS_TAC THENL - [ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; - ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `nn:num` - (X_CHOOSE_THEN `aa:num->real` - (X_CHOOSE_THEN `bb:num->real` - (X_CHOOSE_THEN `ff:num->real` STRIP_ASSUME_TAC)))) THEN - (* Key bound: 2*BB*(CC+1)/M^2 < e/6 *) - SUBGOAL_THEN `&2 * BB * (CC + &1) / M pow 2 < e / &6` ASSUME_TAC THENL - [SUBGOAL_THEN `~(e = &0) /\ ~(BB = &0) /\ ~(CC + &1 = &0)` STRIP_ASSUME_TAC - THENL - [UNDISCH_TAC `&0 < e` THEN UNDISCH_TAC `&0 < BB` THEN - UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `&0 < &12 * BB * (CC + &1) / e` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LT_DIV THEN - ASM_REWRITE_TAC[] THEN - UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC]]; ALL_TAC] THEN - SUBGOAL_THEN `&12 * BB * (CC + &1) / e < M pow 2` ASSUME_TAC THENL - [SUBGOAL_THEN `&0 <= &12 * BB * (CC + &1) / e` ASSUME_TAC THENL - [UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; - ALL_TAC] THEN - SUBGOAL_THEN `sqrt(&12 * BB * (CC + &1) / e) pow 2 = - &12 * BB * (CC + &1) / e` (SUBST1_TAC o GSYM) THENL - [ASM_SIMP_TAC[SQRT_POW2]; ALL_TAC] THEN - SUBGOAL_THEN `&0 <= sqrt(&12 * BB * (CC + &1) / e)` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LE THEN - UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; - ALL_TAC] THEN - REWRITE_TAC[REAL_POW_2] THEN - MATCH_MP_TAC REAL_LT_MUL2 THEN ASM_REWRITE_TAC[] THEN - UNDISCH_TAC `sqrt (&12 * BB * (CC + &1) / e) + &1 = M` THEN - UNDISCH_TAC `&0 <= sqrt(&12 * BB * (CC + &1) / e)` THEN - REAL_ARITH_TAC; - ALL_TAC] THEN - REWRITE_TAC[real_div] THEN - SUBGOAL_THEN - `e * inv(&6) = &2 * BB * (CC + &1) * inv(&12 * BB * (CC + &1) * inv e)` - SUBST1_TAC THENL - [UNDISCH_TAC `~(e = &0)` THEN UNDISCH_TAC `~(BB = &0)` THEN - UNDISCH_TAC `~(CC + &1 = &0)` THEN CONV_TAC REAL_FIELD; + [CONJ_TAC THENL [REWRITE_TAC[FINITE_NUMSEG_LT]; ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ASM_ARITH_TAC; ALL_TAC] THEN - ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_LT_MUL; - REAL_ARITH `&0 < CC ==> &0 < CC + &1`; - REAL_OF_NUM_LT; ARITH] THEN - MATCH_MP_TAC REAL_LT_INV2 THEN - ASM_REWRITE_TAC[GSYM real_div]; - ALL_TAC] THEN - (* Step A: E[T(X_n)] -> L *) - ABBREV_TAC `L = sum(0..nn) - (\k. (aa:num->real) k * exp(--((ff:num->real) k pow 2 / &2)))` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `0` THEN ARITH_TAC; + REWRITE_TAC[]]);; + +(* Atom-CDF factorization *) +let RV_SIGMA_ATOM_INDEP_CDF = prove + (`!p:A prob_space X n k x b. + mutually_indep_rv p X n /\ + (!m. m <= n ==> simple_rv p (X m)) /\ + SUC k <= n /\ x IN prob_carrier p + ==> prob p (rv_sigma_atom p X (SUC k) x INTER + {y | y IN prob_carrier p /\ X (SUC k) y <= b}) = + prob p (rv_sigma_atom p X (SUC k) x) * + prob p {y | y IN prob_carrier p /\ X (SUC k) y <= b}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) (SUC k))` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN SUBGOAL_THEN - `((\n. simple_expectation (p:A prob_space) - (\x:A. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n x) + - (bb:num->real) k * sin(ff k * X n x)))) ---> - L) sequentially` + `{y:A | y IN prob_carrier p /\ (X:num->A->real) (SUC k) y <= b} = + UNIONS (IMAGE (\v. {y:A | y IN prob_carrier p /\ + (X:num->A->real) (SUC k) y = v}) + {v | v IN IMAGE (X (SUC k)) (prob_carrier p) /\ v <= b})` ASSUME_TAC THENL - [EXPAND_TAC "L" THEN - MATCH_MP_TAC TRIG_POLY_WEAK_CONVERGENCE THEN ASM_REWRITE_TAC[]; + [MATCH_MP_TAC SIMPLE_RV_CDF_DECOMPOSE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ABBREV_TAC `R = {v:real | v IN IMAGE ((X:num->A->real) (SUC k)) + (prob_carrier p) /\ v <= b}` THEN + SUBGOAL_THEN + `rv_sigma_atom p (X:num->A->real) (SUC k) x INTER + {y:A | y IN prob_carrier p /\ X (SUC k) y <= b} = + UNIONS (IMAGE (\v. rv_sigma_atom p X (SUC k) x INTER + {y | y IN prob_carrier p /\ X (SUC k) y = v}) R)` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `FINITE (R:real->bool)` ASSUME_TAC THENL + [EXPAND_TAC "R" THEN MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE ((X:num->A->real) (SUC k)) (prob_carrier p)` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_rv]) THEN + SIMP_TAC[GSYM SIMPLE_IMAGE; FINITE_IMAGE]; + SET_TAC[]]; ALL_TAC] THEN - (* Step B: L = integral of T times density *) SUBGOAL_THEN - `L = real_integral (:real) - (\y. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * y) + - (bb:num->real) k * sin(ff k * y)) * - std_normal_density y)` - ASSUME_TAC THENL - [EXPAND_TAC "L" THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN - REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]; ALL_TAC] THEN - (* Steps C and D: error bounds *) + `prob p (UNIONS (IMAGE (\v. rv_sigma_atom p (X:num->A->real) (SUC k) x INTER + {y:A | y IN prob_carrier p /\ X (SUC k) y = v}) R)) = + sum R (\v. prob p (rv_sigma_atom p X (SUC k) x INTER + {y | y IN prob_carrier p /\ X (SUC k) y = v}))` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `v:real` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [MATCH_MP_TAC RV_SIGMA_ATOM_IN_EVENTS THEN + CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_ARITH_TAC; + ASM_REWRITE_TAC[]]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC k)`; `v:real`] + RANDOM_VARIABLE_LEVEL_SET) THEN + ANTS_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[]]]; + REPEAT STRIP_TAC THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_ELIM_THM] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_MESON_TAC[]]; + ALL_TAC] THEN SUBGOAL_THEN - `!n:num. abs(simple_expectation (p:A prob_space) - (\a:A. (g:real->real)((X:num->A->real) n a)) - - simple_expectation p - (\a:A. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * X n a) + - (bb:num->real) k * sin(ff k * X n a)))) <= - e / &6 + &2 * BB * CC / M pow 2` - ASSUME_TAC THENL - [MP_TAC(ISPECL - [`p:A prob_space`; `X:num->A->real`; `g:real->real`; - `\y:real. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * y) + - (bb:num->real) k * sin(ff k * y))`; - `BB:real`; `CC:real`; `e:real`; `M:real`] STEP_C_BOUND) THEN - BETA_TAC THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN - DISCH_THEN ACCEPT_TAC; + `!v:real. prob p (rv_sigma_atom p (X:num->A->real) (SUC k) x INTER + {y:A | y IN prob_carrier p /\ X (SUC k) y = v}) = + prob p (rv_sigma_atom p X (SUC k) x) * + prob p {y | y IN prob_carrier p /\ X (SUC k) y = v}` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC RV_SIGMA_ATOM_INDEP_POINT_MASS THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN EXPAND_TAC "R" THEN + MATCH_MP_TAC SIMPLE_RV_CDF_AS_SUM THEN ASM_REWRITE_TAC[]);; + +(* Partial-sum independence from mutual independence *) +let MUTUALLY_INDEP_RV_SUM_INDEP_RV = prove + (`!p:A prob_space X n k. + mutually_indep_rv p X n /\ + (!m. m <= n ==> simple_rv p (X m)) /\ + k < n + ==> indep_rv p (\x. sum (0..k) (\i. X i x)) (X (SUC k))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[indep_rv] THEN + SUBGOAL_THEN `SUC k <= n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `random_variable p (\x:A. sum (0..k) + (\i. (X:num->A->real) i x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable p ((X:num->A->real) (SUC k))` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN SUBGOAL_THEN - `abs(L - real_integral (:real) - (\y. (g:real->real) y * std_normal_density y)) <= - e / &6 + &2 * BB / M pow 2` + `{x:A | x IN prob_carrier p /\ sum (0..k) + (\i. (X:num->A->real) i x) <= a} IN rv_sigma p X (SUC k)` ASSUME_TAC THENL - [MP_TAC(ISPECL - [`g:real->real`; - `\y:real. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * y) + - (bb:num->real) k * sin(ff k * y))`; - `BB:real`; `e:real`; `M:real`; `L:real`] STEP_D_BOUND) THEN - BETA_TAC THEN ANTS_TAC THENL - [EXPAND_TAC "L" THEN ASM_REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]; - DISCH_THEN ACCEPT_TAC]; + [REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN CONJ_TAC THENL + [SET_TAC[]; + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]]; + ALL_TAC] THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ sum (0..k) + (\i. (X:num->A->real) i x) <= a}` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ sum (0..k) (\i. (X:num->A->real) i x) <= a + /\ X (SUC k) x <= b} = + A INTER {x | x IN prob_carrier p /\ X (SUC k) x <= b}` + SUBST1_TAC THENL + [EXPAND_TAC "A" THEN SET_TAC[]; ALL_TAC] THEN + ABBREV_TAC `B = {x:A | x IN prob_carrier p /\ + (X:num->A->real) (SUC k) x <= b}` THEN + SUBGOAL_THEN + `(A:A->bool) = UNIONS {rv_sigma_atom p (X:num->A->real) (SUC k) x | + x | x IN A}` ASSUME_TAC THENL + [MATCH_MP_TAC RV_SIGMA_UNION_OF_ATOMS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ABBREV_TAC `atoms = {rv_sigma_atom p (X:num->A->real) (SUC k) z | + z | z IN (A:A->bool)}` THEN + SUBGOAL_THEN `FINITE (atoms:(A->bool)->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{rv_sigma_atom p (X:num->A->real) (SUC k) x | + x | x IN prob_carrier p}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA_ATOMS THEN + GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + EXPAND_TAC "atoms" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MESON_TAC[]]; ALL_TAC] THEN - (* Step E: From convergence of E[T(X_n)] to L, get N *) - FIRST_X_ASSUM(MP_TAC o - GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY] o - check (fun th -> free_in `nn:num` (concl th))) THEN - DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `N:num` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - (* Step F1: |E[g(X_n)] - E[T(X_n)]| < e/3 *) - SUBGOAL_THEN `abs(simple_expectation (p:A prob_space) - (\a:A. (g:real->real)((X:num->A->real) n a)) - - simple_expectation p - (\a:A. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * X n a) + - (bb:num->real) k * sin(ff k * X n a)))) < e / &3` + SUBGOAL_THEN `pairwise DISJOINT (atoms:(A->bool)->bool)` ASSUME_TAC THENL + [EXPAND_TAC "atoms" THEN + REWRITE_TAC[pairwise; IN_ELIM_THM; DISJOINT; EXTENSION; IN_INTER; + NOT_IN_EMPTY; rv_sigma_atom; IN_ELIM_THM] THEN + MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!z:A. z IN A ==> + rv_sigma_atom p (X:num->A->real) (SUC k) z IN prob_events p` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `e / &6 + &2 * BB * CC / M pow 2` THEN + [GEN_TAC THEN EXPAND_TAC "A" THEN REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN MATCH_MP_TAC RV_SIGMA_ATOM_IN_EVENTS THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `x < e / &6 ==> e / &6 + x < e / &3`) THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `&2 * BB * (CC + &1) / M pow 2` THEN + GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN + UNDISCH_TAC `random_variable p (\x:A. sum (0..k) + (\i. (X:num->A->real) i x))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN REWRITE_TAC[]; + ALL_TAC] THEN + CONV_TAC(LAND_CONV(RAND_CONV(LAND_CONV(ONCE_REWRITE_CONV + [ASSUME `(A:A->bool) = UNIONS atoms`])))) THEN + REWRITE_TAC[INTER_UNIONS] THEN + SUBGOAL_THEN + `{s INTER (B:A->bool) | s | s IN atoms} = + IMAGE (\s:A->bool. s INTER B) atoms` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob p (UNIONS (IMAGE (\s:A->bool. s INTER B) atoms)) = + sum atoms (\s. prob p (s INTER B))` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "B" THEN + UNDISCH_TAC `random_variable p ((X:num->A->real) (SUC k))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `b:real`) THEN REWRITE_TAC[]]; + X_GEN_TAC `s1:A->bool` THEN X_GEN_TAC `s2:A->bool` THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [pairwise]) THEN + DISCH_THEN(MP_TAC o SPECL [`s1:A->bool`; `s2:A->bool`]) THEN + ASM_REWRITE_TAC[] THEN SET_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `!s:A->bool. s IN atoms ==> + prob p (s INTER B) = prob p s * prob p B` ASSUME_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `z:A` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN EXPAND_TAC "B" THEN + MATCH_MP_TAC RV_SIGMA_ATOM_INDEP_CDF THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(z:A) IN A` THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `sum atoms (\s:A->bool. prob p (s INTER B)) = + sum atoms (\s. prob p s * prob p B)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_RMUL] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN ONCE_ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `UNIONS (atoms:(A->bool)->bool) = UNIONS (IMAGE (\s:A->bool. s) atoms)` + SUBST1_TAC THENL + [REWRITE_TAC[IMAGE_ID]; ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN STRIP_TAC THEN + UNDISCH_TAC `pairwise DISJOINT (atoms:(A->bool)->bool)` THEN + REWRITE_TAC[pairwise] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* CLT with mutual independence hypothesis *) +let GENERAL_CLT_MUTUAL = prove + (`!p:A prob_space (X:num->A->real). + (!n. simple_rv p (X n)) /\ + (!i. expectation p (X i) = &0) /\ + &0 < variance p (X 0) /\ + (!i. variance p (X i) = variance p (X 0)) /\ + (!n. mutually_indep_rv p X n) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) + ==> !x. ((\n. cdf p + (\a. sum(0..n) (\i. X i a) / + (sqrt(variance p (X 0)) * sqrt(&(SUC n)))) x) + ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC GENERAL_CLT THEN + REPEAT CONJ_TAC THEN TRY(FIRST_ASSUM MATCH_ACCEPT_TAC) THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC MUTUALLY_INDEP_RV_IMP_INDEP_RV THEN + EXISTS_TAC `MAX i j` THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POW_LT] THEN - REAL_ARITH_TAC]]; + REWRITE_TAC[ARITH_RULE `i <= MAX i j /\ j <= MAX i j`]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC MUTUALLY_INDEP_RV_SUM_INDEP_RV THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Generalized atom independence: atom at level m is independent of X j + for any j >= m (generalizes RV_SIGMA_ATOM_INDEP_POINT_MASS) *) +let RV_SIGMA_ATOM_INDEP_POINT_MASS_GEN = prove + (`!p:A prob_space X n m j x w. + mutually_indep_rv p X n /\ + (!k. k <= n ==> simple_rv p (X k)) /\ + 1 <= m /\ m <= j /\ j <= n /\ x IN prob_carrier p + ==> prob p (rv_sigma_atom p X m x INTER + {y | y IN prob_carrier p /\ X j y = w}) = + prob p (rv_sigma_atom p X m x) * + prob p {y | y IN prob_carrier p /\ X j y = w}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `g = \k:num. if k < m then (X:num->A->real) k x else w` THEN + SUBGOAL_THEN `!k:num. k < m ==> (g:num->real) k = (X:num->A->real) k x` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `~((j:num) < m)` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(g:num->real) j = w` ASSUME_TAC THENL + [EXPAND_TAC "g" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `IMAGE (\k. {y:A | y IN prob_carrier p /\ + (X:num->A->real) k y = g k}) {k | k < m} = + IMAGE (\k. {y | y IN prob_carrier p /\ X k y = X k x}) + {k | k < m}` ASSUME_TAC THENL + [MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `k:num` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* atom INTER {X j = w} = INTERS over {k < m} UNION {j} with g *) + SUBGOAL_THEN + `rv_sigma_atom p (X:num->A->real) m x INTER + {y:A | y IN prob_carrier p /\ X j y = w} = + INTERS (IMAGE (\k. {y | y IN prob_carrier p /\ X k y = g k}) + ({k:num | k < m} UNION {j}))` + SUBST1_TAC THENL + [REWRITE_TAC[IMAGE_UNION; INTERS_UNION] THEN + REWRITE_TAC[IMAGE_CLAUSES; UNION_EMPTY; INTERS_1] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[rv_sigma_atom] THEN + REWRITE_TAC[EXTENSION; IN_INTER; IN_INTERS; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN CONJ_TAC THENL + [X_GEN_TAC `s:A->bool` THEN STRIP_TAC THEN + ASM_REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[IN_ELIM_THM]]; + STRIP_TAC THEN CONJ_TAC THENL + [CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) 0 y = X 0 x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + SIMP_TAC[IN_ELIM_THM]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) k y = X k x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[IN_ELIM_THM]; + SIMP_TAC[IN_ELIM_THM]]]; + ASM_MESON_TAC[]]]; + ALL_TAC] THEN + (* Apply mutually_indep_rv to {k | k < m} UNION {j} *) + SUBGOAL_THEN + `prob p (INTERS (IMAGE (\k. {y:A | y IN prob_carrier p /\ + (X:num->A->real) k y = g k}) ({k:num | k < m} UNION {j}))) = + product ({k | k < m} UNION {j}) + (\k. prob p {y | y IN prob_carrier p /\ X k y = g k})` + SUBST1_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(MP_TAC o SPECL [`{k:num | k < m} UNION {j}`; `g:num->real`]) THEN + REWRITE_TAC[FINITE_UNION; FINITE_NUMSEG_LT; FINITE_SING] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_UNION; IN_ELIM_THM; IN_INSERT; NOT_IN_EMPTY; + IN_NUMSEG] THEN ASM_ARITH_TAC; + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN EXISTS_TAC `0` THEN + REWRITE_TAC[IN_UNION; IN_ELIM_THM] THEN + UNDISCH_TAC `1 <= m` THEN ARITH_TAC]; + REWRITE_TAC[]]; + ALL_TAC] THEN + (* Split product over disjoint union {k < m} and {j} *) + MP_TAC(ISPECL + [`\k:num. prob p {y:A | y IN prob_carrier p /\ (X:num->A->real) k y = g k}`; + `{k:num | k < m}`; `{j:num}`] PRODUCT_UNION) THEN + REWRITE_TAC[FINITE_NUMSEG_LT; FINITE_SING] THEN + ANTS_TAC THENL + [REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_ELIM_THM; + IN_INSERT; NOT_IN_EMPTY] THEN ASM_ARITH_TAC; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[PRODUCT_SING]] THEN + ASM_REWRITE_TAC[] THEN AP_THM_TAC THEN AP_TERM_TAC THEN + (* product {k < m} = P(atom): replace g with X k x, then use mutually_indep_rv *) + SUBGOAL_THEN + `product {k:num | k < m} + (\k. prob p {y:A | y IN prob_carrier p /\ (X:num->A->real) k y = g k}) = + product {k | k < m} + (\k. prob p {y | y IN prob_carrier p /\ X k y = X k x})` + SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `k:num` THEN + REWRITE_TAC[IN_ELIM_THM] THEN DISCH_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN `rv_sigma_atom p (X:num->A->real) m x = + INTERS (IMAGE (\k. {y:A | y IN prob_carrier p /\ X k y = X k x}) + {k | k < m})` + SUBST1_TAC THENL + [REWRITE_TAC[rv_sigma_atom; EXTENSION; IN_INTERS; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN X_GEN_TAC `s:A->bool` THEN REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) 0 y = X 0 x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + SIMP_TAC[IN_ELIM_THM]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{y:A | y IN prob_carrier p /\ (X:num->A->real) k y = X k x}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[IN_ELIM_THM]; + SIMP_TAC[IN_ELIM_THM]]]]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(MP_TAC o SPECL [`{k:num | k < m}`; + `\k:num. (X:num->A->real) k x`]) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [REWRITE_TAC[FINITE_NUMSEG_LT]; ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `0` THEN UNDISCH_TAC `1 <= m` THEN ARITH_TAC; + REWRITE_TAC[]]);; + +(* Independence of rv_sigma events and point mass events *) +let INDEP_RV_SIGMA_EVENT_POINT_MASS = prove + (`!p:A prob_space X n m j w. + mutually_indep_rv p X n /\ + (!k. k <= n ==> simple_rv p (X k)) /\ + 1 <= m /\ m <= j /\ j <= n /\ + A IN rv_sigma p X m + ==> prob p (A INTER {y | y IN prob_carrier p /\ X j y = w}) = + prob p A * prob p {y | y IN prob_carrier p /\ X j y = w}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(A:A->bool) SUBSET prob_carrier p` ASSUME_TAC THENL + [UNDISCH_TAC `A IN rv_sigma (p:A prob_space) (X:num->A->real) m` THEN + REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + ABBREV_TAC `atoms = {rv_sigma_atom p (X:num->A->real) m z | + z | z IN (A:A->bool)}` THEN + SUBGOAL_THEN `(A:A->bool) = UNIONS atoms` ASSUME_TAC THENL + [EXPAND_TAC "atoms" THEN + MATCH_MP_TAC RV_SIGMA_UNION_OF_ATOMS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `FINITE (atoms:(A->bool)->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{rv_sigma_atom p (X:num->A->real) m z | + z | z IN prob_carrier p}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_RV_SIGMA_ATOMS THEN + GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + EXPAND_TAC "atoms" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + ASM_MESON_TAC[SUBSET]]; + ALL_TAC] THEN + SUBGOAL_THEN `pairwise DISJOINT (atoms:(A->bool)->bool)` ASSUME_TAC THENL + [EXPAND_TAC "atoms" THEN + REWRITE_TAC[pairwise; IN_ELIM_THM; DISJOINT; EXTENSION; IN_INTER; + NOT_IN_EMPTY; rv_sigma_atom; IN_ELIM_THM] THEN + MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!z:A. z IN A ==> + rv_sigma_atom p (X:num->A->real) m z IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC RV_SIGMA_ATOM_IN_EVENTS THEN + CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ASM_MESON_TAC[SUBSET]]; + ALL_TAC] THEN + ABBREV_TAC `B = {y:A | y IN prob_carrier p /\ + (X:num->A->real) j y = w}` THEN + (* P(A INTER B) = P(UNIONS atoms INTER B) = sum_atoms P(atom INTER B) *) + CONV_TAC(LAND_CONV(RAND_CONV(LAND_CONV(ONCE_REWRITE_CONV + [ASSUME `(A:A->bool) = UNIONS atoms`])))) THEN + REWRITE_TAC[INTER_UNIONS] THEN + SUBGOAL_THEN + `{s INTER (B:A->bool) | s | s IN atoms} = + IMAGE (\s:A->bool. s INTER B) atoms` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `B:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) j`; `w:real`] + RANDOM_VARIABLE_LEVEL_SET) THEN + ANTS_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[]; + REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob p (UNIONS (IMAGE (\s:A->bool. s INTER B) atoms)) = + sum atoms (\s. prob p (s INTER B))` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `s1:A->bool` THEN X_GEN_TAC `s2:A->bool` THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [pairwise]) THEN + DISCH_THEN(MP_TAC o SPECL [`s1:A->bool`; `s2:A->bool`]) THEN + ASM_REWRITE_TAC[] THEN SET_TAC[]]; + ALL_TAC] THEN + (* For each atom, use RV_SIGMA_ATOM_INDEP_POINT_MASS_GEN *) + SUBGOAL_THEN `!s:A->bool. s IN atoms ==> + prob p (s INTER B) = prob p s * prob p B` ASSUME_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `z:A` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN EXPAND_TAC "B" THEN + MATCH_MP_TAC RV_SIGMA_ATOM_INDEP_POINT_MASS_GEN THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[SUBSET]; + ALL_TAC] THEN + SUBGOAL_THEN `sum atoms (\s:A->bool. prob p (s INTER B)) = + sum atoms (\s. prob p s * prob p B)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_RMUL] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN ONCE_ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `UNIONS (atoms:(A->bool)->bool) = UNIONS (IMAGE (\s:A->bool. s) atoms)` + SUBST1_TAC THENL + [REWRITE_TAC[IMAGE_ID]; ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `s:A->bool` THEN DISCH_TAC THEN + UNDISCH_TAC `(s:A->bool) IN atoms` THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN STRIP_TAC THEN + UNDISCH_TAC `pairwise DISJOINT (atoms:(A->bool)->bool)` THEN + REWRITE_TAC[pairwise] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Independence of rv_sigma events and CDF events *) +let INDEP_RV_SIGMA_EVENT_CDF = prove + (`!p:A prob_space X n m j b. + mutually_indep_rv p X n /\ + (!k. k <= n ==> simple_rv p (X k)) /\ + 1 <= m /\ m <= j /\ j <= n /\ + A IN rv_sigma p X m + ==> prob p (A INTER {y | y IN prob_carrier p /\ X j y <= b}) = + prob p A * prob p {y | y IN prob_carrier p /\ X j y <= b}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_rv p ((X:num->A->real) j)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{y:A | y IN prob_carrier p /\ (X:num->A->real) j y <= b} = + UNIONS (IMAGE (\v. {y | y IN prob_carrier p /\ X j y = v}) + {v | v IN IMAGE (X j) (prob_carrier p) /\ v <= b})` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CDF_DECOMPOSE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ABBREV_TAC `R = {v:real | v IN IMAGE ((X:num->A->real) j) + (prob_carrier p) /\ v <= b}` THEN + SUBGOAL_THEN `FINITE (R:real->bool)` ASSUME_TAC THENL + [EXPAND_TAC "R" THEN MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE ((X:num->A->real) j) (prob_carrier p)` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_rv]) THEN + SIMP_TAC[GSYM SIMPLE_IMAGE; FINITE_IMAGE]; + SET_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN + `A INTER {y:A | y IN prob_carrier p /\ (X:num->A->real) j y <= b} = + UNIONS (IMAGE (\v. A INTER {y | y IN prob_carrier p /\ X j y = v}) R)` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC RV_SIGMA_IN_EVENTS THEN EXISTS_TAC `(X:num->A->real)` THEN + EXISTS_TAC `m:num` THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN - (* Step F2: |E[T(X_n)] - L| < e/3 *) - SUBGOAL_THEN `abs(simple_expectation (p:A prob_space) - (\a:A. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n a) + - (bb:num->real) k * sin(ff k * X n a))) - - L) < e / &3` + SUBGOAL_THEN `random_variable p ((X:num->A->real) j)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN + SUBGOAL_THEN + `prob p (UNIONS (IMAGE (\v. (A:A->bool) INTER + {y:A | y IN prob_carrier p /\ (X:num->A->real) j y = v}) R)) = + sum R (\v. prob p (A INTER {y | y IN prob_carrier p /\ X j y = v}))` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_FINITE_ADDITIVE_IMAGE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `v:real` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) j`; `v:real`] + RANDOM_VARIABLE_LEVEL_SET) THEN + ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_ELIM_THM] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!v:real. prob p ((A:A->bool) INTER + {y:A | y IN prob_carrier p /\ (X:num->A->real) j y = v}) = + prob p A * prob p {y | y IN prob_carrier p /\ X j y = v}` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC INDEP_RV_SIGMA_EVENT_POINT_MASS THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `m:num` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN EXPAND_TAC "R" THEN + MATCH_MP_TAC SIMPLE_RV_CDF_AS_SUM THEN ASM_REWRITE_TAC[]);; + +(* Independence of simple RV determined by X_0,...,X_{m-1} from X_j (j >= m) *) +let INDEP_RV_RV_SIGMA_SIMPLE = prove + (`!p:A prob_space X n m j f. + mutually_indep_rv p X n /\ + (!k. k <= n ==> simple_rv p (X k)) /\ + simple_rv p f /\ + (!x y. x IN prob_carrier p /\ y IN prob_carrier p /\ + (!k. k < m ==> X k x = X k y) ==> f x = f y) /\ + 1 <= m /\ m <= j /\ j <= n + ==> indep_rv p f (X j)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[indep_rv] THEN + SUBGOAL_THEN `random_variable p (f:A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN + SUBGOAL_THEN `random_variable p ((X:num->A->real) j)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (f:A->real) x <= a} IN + rv_sigma p X m` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN - ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; + [REWRITE_TAC[rv_sigma; IN_ELIM_THM] THEN CONJ_TAC THENL + [SET_TAC[]; + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(f:A->real) x = f y` (fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN - (* Step F3: |L - int(g*density)| < e/3 *) - SUBGOAL_THEN `abs(L - real_integral (:real) - (\y. (g:real->real) y * std_normal_density y)) < e / &3` + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (f:A->real) x <= a /\ + (X:num->A->real) j x <= b} = + {x | x IN prob_carrier p /\ f x <= a} INTER + {x | x IN prob_carrier p /\ X j x <= b}` + SUBST1_TAC THENL + [SET_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC INDEP_RV_SIGMA_EVENT_CDF THEN + MAP_EVERY EXISTS_TAC [`n:num`; `m:num`] THEN + ASM_REWRITE_TAC[]);; + +(* Cross-term vanishing for mutually independent mean-zero simple RVs *) +let KOLMOGOROV_CROSS_TERM_VANISH = prove + (`!p:A prob_space X n k t. + mutually_indep_rv p X n /\ + (!i. i <= n ==> simple_rv p (X i)) /\ + (!i. i <= n ==> expectation p (X i) = &0) /\ + k < n /\ &0 < t + ==> expectation p (\x. sum(0..k) (\i. X i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn {y:A | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. X i y)) < t) /\ + abs(sum(0..k) (\i. X i y)) >= t} x) = &0`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `S = {y:A | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. (X:num->A->real) i y)) < t) /\ + abs(sum(0..k) (\i. X i y)) >= t}` THEN + SUBGOAL_THEN `SUC k <= n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(S:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "S" THEN + MATCH_MP_TAC FIRST_CROSSING_EVENTS_MEASURABLE THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..k) (\i. (X:num->A->real) i x)`; + `indicator_fn (S:A->bool)`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_SUM THEN + GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ABBREV_TAC `Y = \x:A. sum(0..k) (\i. (X:num->A->real) i x) * + indicator_fn S x` THEN + DISCH_TAC THEN + (* Rewrite integrand as Y * sum(SUC k..n) *) + SUBGOAL_THEN + `(\x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn S x) = + (\x. Y x * sum(SUC k..n) (\i. X i x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + EXPAND_TAC "Y" THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Distribute Y over sum *) + SUBGOAL_THEN + `(\x:A. (Y:A->real) x * sum(SUC k..n) (\i. (X:num->A->real) i x)) = + (\x. sum(SUC k..n) (\i. Y x * X i x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + REWRITE_TAC[GSYM SUM_LMUL]; + ALL_TAC] THEN + (* Y depends on X_0,...,X_k *) + SUBGOAL_THEN + `!x y':A. x IN prob_carrier p /\ y' IN prob_carrier p /\ + (!i. i < SUC k ==> (X:num->A->real) i x = X i y') + ==> (Y:A->real) x = Y y'` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `e / &6 + &2 * BB / M pow 2` THEN - ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `x < e / &6 ==> e / &6 + x < e / &3`) THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `&2 * BB * (CC + &1) / M pow 2` THEN - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_div] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; - GEN_REWRITE_TAC (LAND_CONV) [GSYM REAL_MUL_LID] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_INV THEN - MATCH_MP_TAC REAL_LT_IMP_LE THEN - ASM_SIMP_TAC[REAL_POW_LT]]]]; + [EXPAND_TAC "Y" THEN REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!jj. jj <= k ==> sum(0..jj) (\i. (X:num->A->real) i x) = + sum(0..jj) (\i. X i y')` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(x:A) IN S <=> y' IN S` ASSUME_TAC THENL + [EXPAND_TAC "S" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(!j'. j' < k ==> + abs(sum(0..j') (\i. (X:num->A->real) i x)) < t) <=> + (!j'. j' < k ==> + abs(sum(0..j') (\i. X i y')) < t)` SUBST1_TAC THENL + [EQ_TAC THEN DISCH_TAC THEN X_GEN_TAC `j':num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j':num`) THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `sum(0..j') (\i. (X:num->A->real) i x) = + sum(0..j') (\i. X i y')` + (fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ASM_SIMP_TAC[LE_REFL]]; + ALL_TAC] THEN + ASM_SIMP_TAC[LE_REFL] THEN + REWRITE_TAC[indicator_fn] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Each Y*X_i is simple *) + SUBGOAL_THEN `!i. i IN (SUC k..n) ==> + simple_rv p (\x:A. (Y:A->real) x * (X:num->A->real) i x)` ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; + `(X:num->A->real) i`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p (\x:A. sum(SUC k..n) + (\i. (Y:A->real) x * (X:num->A->real) i x))` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_SUM_FINITE THEN ASM_REWRITE_TAC[FINITE_NUMSEG]; + ALL_TAC] THEN + (* Convert to simple_expectation and apply linearity *) + SUBGOAL_THEN + `expectation p (\x:A. sum(SUC k..n) + (\i. (Y:A->real) x * (X:num->A->real) i x)) = + simple_expectation p (\x. sum(SUC k..n) (\i. Y x * X i x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - ABBREV_TAC `eg = simple_expectation (p:A prob_space) - (\a:A. (g:real->real)((X:num->A->real) n a))` THEN - ABBREV_TAC `et = simple_expectation (p:A prob_space) - (\a:A. sum(0..nn) - (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n a) + - (bb:num->real) k * sin(ff k * X n a)))` THEN - ABBREV_TAC `ig = real_integral (:real) - (\y. (g:real->real) y * std_normal_density y)` THEN - ASM_REAL_ARITH_TAC);; + SUBGOAL_THEN + `simple_expectation p (\x:A. sum(SUC k..n) + (\i. (Y:A->real) x * (X:num->A->real) i x)) = + sum(SUC k..n) (\i. simple_expectation p (\x. Y x * X i x))` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\i:num. \x:A. (Y:A->real) x * (X:num->A->real) i x`; + `SUC k..n`] SIMPLE_EXPECTATION_SUM_FINITE) THEN + REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Each term is 0 by independence and mean-zero *) + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN + X_GEN_TAC `j:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + SUBGOAL_THEN `indep_rv p (Y:A->real) ((X:num->A->real) j)` ASSUME_TAC THENL + [MATCH_MP_TAC INDEP_RV_RV_SIGMA_SIMPLE THEN + MAP_EVERY EXISTS_TAC [`n:num`; `SUC k`] THEN + ASM_REWRITE_TAC[ARITH_RULE `1 <= SUC k`]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation p (\x:A. (Y:A->real) x * + (X:num->A->real) j x) = + simple_expectation p Y * simple_expectation p (X j)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_PRODUCT_INDEP THEN + ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation p ((X:num->A->real) j) = &0` + SUBST1_TAC THENL + [SUBGOAL_THEN `simple_expectation p ((X:num->A->real) j) = + expectation p (X j)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + REAL_ARITH_TAC]);; -(* Integral of bounded [0,1]-valued continuous function against std normal - density is bounded by std_normal_cdf *) -let INTEGRAL_BOUNDED_LE_CDF = prove - (`!(g:real->real) b. - (!y. &0 <= g y /\ g y <= &1) /\ (!y. y > b ==> g y = &0) /\ - (!y. g real_continuous atreal y) - ==> real_integral (:real) (\y. g y * std_normal_density y) <= std_normal_cdf b`, +(* Kolmogorov maximal inequality under mutual independence *) +let KOLMOGOROV_MAXIMAL_INEQ_INDEP = prove + (`!p:A prob_space X n t. + mutually_indep_rv p X n /\ + (!i. i <= n ==> simple_rv p (X i)) /\ + (!i. i <= n ==> expectation p (X i) = &0) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + ?k. k <= n /\ abs(sum(0..k) (\i. X i x)) >= t} + <= sum(0..n) (\i. variance p (X i)) / t pow 2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC KOLMOGOROV_MAXIMAL_INEQ THEN + REPEAT CONJ_TAC THEN TRY(FIRST_ASSUM MATCH_ACCEPT_TAC) THENL + [(* integrable *) + GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* squared integrability *) + GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN + MATCH_MP_TAC SIMPLE_RV_SQUARE THEN REWRITE_TAC[ETA_AX] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* covariance zero *) + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC COVARIANCE_INDEP_SIMPLE THEN + ASM_SIMP_TAC[] THEN + MATCH_MP_TAC MUTUALLY_INDEP_RV_IMP_INDEP_RV THEN + EXISTS_TAC `MAX i j` THEN ASM_SIMP_TAC[] THEN + REWRITE_TAC[ARITH_RULE `i <= MAX i j /\ j <= MAX i j`] THEN + SUBGOAL_THEN `mutually_indep_rv (p:A prob_space) X (MAX i j)` ASSUME_TAC + THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv]) THEN + REWRITE_TAC[mutually_indep_rv] THEN STRIP_TAC THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REPEAT GEN_TAC THEN STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP + (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN + REWRITE_TAC[SUBSET_NUMSEG] THEN ASM_ARITH_TAC]; + ASM_REWRITE_TAC[]]; + (* cross-term *) + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC KOLMOGOROV_CROSS_TERM_VANISH THEN + ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* HELLY'S SELECTION THEOREM AND FORWARD PROHOROV *) +(* Gap 4 from the analysis document. Tightness => relative compactness *) +(* in the space of probability measures on R. *) +(* ========================================================================= *) + +(* Composition of strictly increasing functions is strictly increasing *) +let STRICTLY_INCREASING_COMPOSE = prove + (`!(r:num->num) (s:num->num). + (!m n. m < n ==> r m < r n) /\ (!m n. m < n ==> s m < s n) + ==> !m n. m < n ==> r(s m) < r(s n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);; + +(* Diagonal argument: from a doubly-indexed bounded sequence, extract a + single subsequence converging simultaneously on all row indices. + This is the core tool for Helly's selection theorem. *) +let DIAGONAL_BOUNDED_CONVERGENCE = prove + (`!f:num->num->real B. + (!i n. abs(f i n) <= B) + ==> ?r:num->num. (!m n. m < n ==> r m < r n) /\ + (!i. ?l. ((\k. f i (r k)) ---> l) sequentially)`, REPEAT STRIP_TAC THEN - SUBGOAL_THEN `(\y:real. g y * std_normal_density y) real_integrable_on (:real)` - ASSUME_TAC THENL - [MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN - ASM_REWRITE_TAC[] THEN EXISTS_TAC `&1` THEN - GEN_TAC THEN - UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN - DISCH_THEN(MP_TAC o SPEC `y:real`) THEN REAL_ARITH_TAC; + (* Step 1: Build nested subsequences R : num -> (num -> num) via num_RECURSION. + R(0) makes f(0) converge. R(SUC j) = R(j) o s_j where s_j makes + f(SUC j) converge along R(j). *) + MP_TAC(SPECL [`(f:num->num->real) 0`; `B:real`] + BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `l0:real` + (X_CHOOSE_THEN `r0:num->num` STRIP_ASSUME_TAC)) THEN + (* For each strictly increasing g with bounded values, we can extract a + sub-subsequence making any given f(i) converge *) + SUBGOAL_THEN + `!g:num->num i:num. (!m n. m < n ==> g m < g n) /\ + (!j n. abs((f:num->num->real) j (g n)) <= B) + ==> ?h:num->num. (!m n. m < n ==> h m < h n) /\ + (?l. ((\k. f i (g(h k))) ---> l) sequentially) /\ + (!j n. abs(f j (g(h n))) <= B)` + (LABEL_TAC "REFINE") THENL + [REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`\n:num. (f:num->num->real) i ((g:num->num) n)`; `B:real`] + BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `l:real` + (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `s:num->num` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [EXISTS_TAC `l:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[std_normal_cdf] THEN + (* Define abbreviation for the select operator that picks a refining subseq *) + ABBREV_TAC + `SEL = \(prev:num->num) (j:num). + @s:num->num. (!m n. m < n ==> s m < s n) /\ + (?l. ((\k. (f:num->num->real) (SUC j) (prev(s k))) ---> l) sequentially) /\ + (!i n. abs(f i (prev(s n))) <= B)` THEN + (* Build R by num_RECURSION *) MP_TAC(ISPECL - [`\y:real. g y * std_normal_density y`; - `\y:real. if y IN {t | t <= b} then std_normal_density y else &0`; - `(:real)`; - `real_integral (:real) (\y:real. g y * std_normal_density y)`; - `real_integral (:real) (\y:real. if y IN {t | t <= b} then std_normal_density y else &0)`] - HAS_REAL_INTEGRAL_LE) THEN - BETA_TAC THEN - REWRITE_TAC[REAL_INTEGRAL_RESTRICT_UNIV] THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; + [`r0:num->num`; + `\(prev:num->num) (j:num). prev o (SEL:(num->num)->num->(num->num)) prev j`] + num_RECURSION) THEN + DISCH_THEN(X_CHOOSE_THEN `R:num->(num->num)` STRIP_ASSUME_TAC) THEN + (* Step 2: Prove key properties of R by induction. + Property: R(j) is strictly increasing, values are bounded, and the + select at each step is well-behaved. *) + SUBGOAL_THEN + `!j:num. (!m n. m < n ==> (R:num->(num->num)) j m < R j n) /\ + (!i n. abs((f:num->num->real) i (R j n)) <= B) /\ + (!m n. m < n ==> + (SEL:(num->num)->num->(num->num)) (R j) j m < + SEL (R j) j n) /\ + (?l. ((\k. (f:num->num->real) (SUC j) (R j (SEL (R j) j k))) ---> l) + sequentially) /\ + (!i n. abs((f:num->num->real) i (R j (SEL (R j) j n))) <= B)` + (LABEL_TAC "R_PROPS") THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN + (* After ASM_REWRITE_TAC, conjuncts 1,2,5 solved; 3,4 remain *) + USE_THEN "REFINE" (MP_TAC o SPECL [`r0:num->num`; `SUC 0`]) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `h0:num->num` STRIP_ASSUME_TAC) THEN + (* SELECT_AX: the @ picks a valid witness since one exists *) + SUBGOAL_THEN + `(!m n. m < n ==> + (SEL:(num->num)->num->(num->num)) r0 0 m < SEL r0 0 n) /\ + (?l. ((\k. (f:num->num->real) (SUC 0) ((r0:num->num)(SEL r0 0 k))) ---> l) + sequentially) /\ + (!i n. abs(f i (r0(SEL r0 0 n))) <= B)` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "SEL" THEN BETA_TAC THEN + MP_TAC(ISPEC + `\s:num->num. (!m n. m < n ==> s m < s n) /\ + (?l. ((\k. (f:num->num->real) (SUC 0) ((r0:num->num)(s k))) ---> l) + sequentially) /\ + (!i n. abs(f i (r0(s n))) <= B)` SELECT_AX) THEN + DISCH_THEN(MP_TAC o SPEC `h0:num->num`) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + EXISTS_TAC `l:real` THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ASM_MESON_TAC[]]; ALL_TAC] THEN - CONJ_TAC THENL - [REWRITE_TAC[HAS_REAL_INTEGRAL_RESTRICT_UNIV] THEN - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; + (* Inductive step: SUC j *) + FIRST_X_ASSUM(CONJUNCTS_THEN2 (LABEL_TAC "Rj_incr") + (CONJUNCTS_THEN2 (LABEL_TAC "Rj_bnd") + (CONJUNCTS_THEN2 (LABEL_TAC "Sj_incr") + (CONJUNCTS_THEN2 (LABEL_TAC "Sj_conv") (LABEL_TAC "Sj_bnd"))))) THEN + (* R(SUC j) = R(j) o SEL(R(j),j) *) + SUBGOAL_THEN `!k. (R:num->(num->num)) (SUC j) k = + R j ((SEL:(num->num)->num->(num->num)) (R j) j k)` ASSUME_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[o_THM]; ALL_TAC] THEN + (* R(SUC j) is strictly increasing *) + SUBGOAL_THEN `!m n. m < n ==> (R:num->(num->num)) (SUC j) m < R (SUC j) n` + (LABEL_TAC "RSj_incr") THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + USE_THEN "Rj_incr" MATCH_MP_TAC THEN + USE_THEN "Sj_incr" MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - GEN_TAC THEN REWRITE_TAC[IN_UNIV; IN_ELIM_THM] THEN - ASM_CASES_TAC `x <= b` THENL - [ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 * std_normal_density x` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN - UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REAL_ARITH_TAC; - REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]]; + (* Values along R(SUC j) are bounded *) + SUBGOAL_THEN `!i n. abs((f:num->num->real) i ((R:num->(num->num)) (SUC j) n)) <= B` + (LABEL_TAC "RSj_bnd") THENL + [REPEAT GEN_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Prove conjuncts 1,2 without ASM_REWRITE_TAC to avoid R(SUC j) expansion *) + CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Need SEL(R(SUC j), SUC j) properties *) + REMOVE_THEN "REFINE" (MP_TAC o SPECL + [`(R:num->(num->num)) (SUC j)`; `SUC(SUC j)`]) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `hj:num->num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `(!m n. m < n ==> + (SEL:(num->num)->num->(num->num)) ((R:num->(num->num)) (SUC j)) (SUC j) m < + SEL (R (SUC j)) (SUC j) n) /\ + (?l. ((\k. (f:num->num->real) (SUC(SUC j)) + ((R:num->(num->num)) (SUC j) (SEL (R (SUC j)) (SUC j) k))) ---> l) + sequentially) /\ + (!i n. abs(f i (R (SUC j) (SEL (R (SUC j)) (SUC j) n))) <= B)` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "SEL" THEN BETA_TAC THEN + MP_TAC(ISPEC + `\s:num->num. (!m n. m < n ==> s m < s n) /\ + (?l. ((\k. (f:num->num->real) (SUC(SUC j)) + ((R:num->(num->num)) (SUC j) (s k))) ---> l) sequentially) /\ + (!i n. abs(f i (R (SUC j) (s n))) <= B)` SELECT_AX) THEN + DISCH_THEN(MP_TAC o SPEC `hj:num->num`) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + EXISTS_TAC `l:real` THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Step 3: Extract the key sub-subsequence property *) + SUBGOAL_THEN `!j k:num. (R:num->(num->num)) (SUC j) k = + R j ((SEL:(num->num)->num->(num->num)) (R j) j k)` (LABEL_TAC "R_STEP") THENL + [REPEAT GEN_TAC THEN ASM_REWRITE_TAC[o_THM]; ALL_TAC] THEN + (* SEL(R j, j) is strictly increasing *) + SUBGOAL_THEN `!j:num. !m n. m < n ==> + (SEL:(num->num)->num->(num->num)) ((R:num->(num->num)) j) j m < + SEL (R j) j n` (LABEL_TAC "SEL_INCR") THENL + [GEN_TAC THEN USE_THEN "R_PROPS" (fun th -> + ACCEPT_TAC(CONJUNCT1(CONJUNCT2(CONJUNCT2(SPEC `j:num` th))))); + ALL_TAC] THEN + (* SEL(R j, j)(k) >= k *) + SUBGOAL_THEN `!j k:num. k <= (SEL:(num->num)->num->(num->num)) + ((R:num->(num->num)) j) j k` (LABEL_TAC "SEL_GE") THENL + [GEN_TAC THEN MATCH_MP_TAC STRICTLY_INCREASING_GE THEN + USE_THEN "SEL_INCR" (ACCEPT_TAC o SPEC `j:num`); ALL_TAC] THEN + (* Clean up: remove the ABBREV_TAC equation containing the large @-term + AND the function-level num_RECURSION equation R(SUC n) = ... o ... + All needed properties are in labeled assumptions R_PROPS, R_STEP, + SEL_INCR, SEL_GE. Without this cleanup: + - ASM_MESON_TAC decomposes the @-term causing exponential blowup + - ASM_REWRITE_TAC uses the function-level equation producing + (R j o SEL(R j) j) instead of the pointwise form R j (SEL(R j) j k) *) + FIRST_X_ASSUM(K ALL_TAC o check (fun th -> + is_eq(concl th) && + (let _,r = dest_eq(concl th) in + r = `SEL:(num->num)->num->(num->num)`))) THEN + FIRST_X_ASSUM(K ALL_TAC o check (fun th -> + let c = concl th in + is_forall c && + (let _,body = dest_forall c in is_eq body))) THEN + (* Step 4: f(j) converges along R(j) for all j *) + SUBGOAL_THEN + `!j:num. ?l. ((\k. (f:num->num->real) j ((R:num->(num->num)) j k)) ---> l) + sequentially` + (LABEL_TAC "FJ_CONV") THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN EXISTS_TAC `l0:real` THEN + FIRST_ASSUM ACCEPT_TAC; + (* Inductive step: f(SUC j) converges along R(SUC j). + Use R_STEP for pointwise rewrite R(SUC j) k = R j (SEL(R j) j k), + NOT ASM_REWRITE_TAC which uses the function-level equation from + num_RECURSION producing (R j o SEL(R j) j) k with unreduced o. *) + USE_THEN "R_STEP" (fun th -> REWRITE_TAC[th]) THEN + USE_THEN "R_PROPS" (fun th -> + ACCEPT_TAC(CONJUNCT1(CONJUNCT2(CONJUNCT2(CONJUNCT2 + (SPEC `j:num` th))))))]; + ALL_TAC] THEN + (* Step 5: For i < j, f(i) also converges along R(j). + Key: R(j) is a sub-subsequence of R(i), and f(i) converges along R(i). *) + SUBGOAL_THEN + `!i j:num. i <= j ==> ?l. ((\k. (f:num->num->real) i ((R:num->(num->num)) j k)) + ---> l) sequentially` + (LABEL_TAC "FI_CONV_RJ") THENL + [GEN_TAC THEN INDUCT_TAC THENL + [DISCH_TAC THEN SUBGOAL_THEN `i = 0` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + USE_THEN "FJ_CONV" (ACCEPT_TAC o SPEC `0`); + DISCH_TAC THEN ASM_CASES_TAC `i = SUC j` THENL + [FIRST_X_ASSUM SUBST_ALL_TAC THEN + USE_THEN "FJ_CONV" (ACCEPT_TAC o SPEC `SUC j`); ALL_TAC] THEN + SUBGOAL_THEN `i:num <= j` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + (* By induction, f(i) converges along R(j). R(SUC j) = R(j) o s_j, + so f(i, R(SUC j)(k)) = f(i, R(j)(s_j(k))) is a subsequence of the + convergent f(i, R(j)(k)). *) + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN ASM_REWRITE_TAC[] THEN - SUBGOAL_THEN `(g:real->real) x = &0` SUBST1_TAC THENL - [UNDISCH_TAC `!y:real. y > b ==> g y = &0` THEN - DISCH_THEN MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; - REWRITE_TAC[REAL_MUL_LZERO; REAL_LE_REFL]]]; - SIMP_TAC[]]);; + DISCH_THEN(X_CHOOSE_THEN `l:real` ASSUME_TAC) THEN + EXISTS_TAC `l:real` THEN + USE_THEN "R_STEP" (fun th -> REWRITE_TAC[th]) THEN + MP_TAC(ISPECL [`\n:num. (f:num->num->real) i ((R:num->(num->num)) j n)`; + `l:real`; + `(SEL:(num->num)->num->(num->num)) ((R:num->(num->num)) j) j`] + REALLIM_SUBSEQUENCE) THEN + REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [FIRST_ASSUM ACCEPT_TAC; + USE_THEN "SEL_INCR" (ACCEPT_TAC o SPEC `j:num`)]]; + ALL_TAC] THEN + (* Step 6: For i <= k, R(k)(k) = R(i)(m) for some m >= k. + More precisely: for any k >= i, there exists m >= k such that + R(k)(k) is of the form R(i)(m). *) + SUBGOAL_THEN + `!i j:num. i <= j ==> + ?t:num->num. (!m n. m < n ==> t m < t n) /\ + (!k. (R:num->(num->num)) j k = R i (t k))` + (LABEL_TAC "R_COMPOSE") THENL + [GEN_TAC THEN INDUCT_TAC THENL + [DISCH_TAC THEN SUBGOAL_THEN `i = 0` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + EXISTS_TAC `\k:num. k` THEN REWRITE_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_CASES_TAC `i = SUC j` THENL + [ASM_REWRITE_TAC[] THEN EXISTS_TAC `\k:num. k` THEN REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `i:num <= j` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `t0:num->num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `\k:num. (t0:num->num) + ((SEL:(num->num)->num->(num->num)) ((R:num->(num->num)) j) j k)` THEN + BETA_TAC THEN CONJ_TAC THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + USE_THEN "SEL_INCR" (MP_TAC o SPEC `j:num`) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 7: Define the diagonal d(k) = R(k)(k) and prove properties *) + EXISTS_TAC `\k:num. (R:num->(num->num)) k k` THEN + BETA_TAC THEN CONJ_TAC THENL + [(* d is strictly increasing: d(k+1) > d(k) *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + (* First: R(SUC m)(n) > R(m)(m) *) + SUBGOAL_THEN `(R:num->(num->num)) m m < R (SUC m) n` ASSUME_TAC THENL + [USE_THEN "R_STEP" (fun th -> REWRITE_TAC[th]) THEN + USE_THEN "R_PROPS" (MP_TAC o SPEC `m:num`) THEN + STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + MATCH_MP_TAC LTE_TRANS THEN EXISTS_TAC `n:num` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + USE_THEN "SEL_GE" (ACCEPT_TAC o SPECL [`m:num`; `n:num`])]; + ALL_TAC] THEN + (* Case n = SUC m: trivial *) + ASM_CASES_TAC `n:num = SUC m` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Case n > SUC m: use R_COMPOSE and transitivity *) + MATCH_MP_TAC LTE_TRANS THEN + EXISTS_TAC `(R:num->(num->num)) (SUC m) n` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC m <= n` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + USE_THEN "R_COMPOSE" (MP_TAC o SPECL [`SUC m`; `n:num`]) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `t:num->num` STRIP_ASSUME_TAC) THEN + ONCE_REWRITE_TAC[ASSUME + `!k. (R:num->(num->num)) n k = R (SUC m) ((t:num->num) k)`] THEN + USE_THEN "R_STEP" (fun th -> REWRITE_TAC[th]) THEN + SUBGOAL_THEN `n:num <= (t:num->num) n` ASSUME_TAC THENL + [MP_TAC(ISPEC `t:num->num` STRICTLY_INCREASING_GE) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(ACCEPT_TAC o SPEC `n:num`); + ALL_TAC] THEN + ASM_CASES_TAC `(t:num->num) n = n` THENL + [ASM_REWRITE_TAC[LE_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `n < (t:num->num) n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC LT_IMP_LE THEN + USE_THEN "R_PROPS" (MP_TAC o SPEC `m:num`) THEN + STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + USE_THEN "SEL_INCR" (MP_TAC o SPEC `m:num`) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* f(i) converges along the diagonal *) + X_GEN_TAC `i:num` THEN + USE_THEN "FJ_CONV" (MP_TAC o SPEC `i:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `L:real` (LABEL_TAC "fi_conv")) THEN + EXISTS_TAC `L:real` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + USE_THEN "fi_conv" (MP_TAC o REWRITE_RULE[REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `MAX i N` THEN REPEAT STRIP_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `i:num <= n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + USE_THEN "R_COMPOSE" (MP_TAC o SPECL [`i:num`; `n:num`]) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `t:num->num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(R:num->(num->num)) n n = R i ((t:num->num) n)` + SUBST1_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MP_TAC(ISPEC `t:num->num` STRICTLY_INCREASING_GE) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN ASM_ARITH_TAC]);; -(* std_normal_cdf bounded by integral of bounded [0,1]-valued continuous - function *) -let CDF_LE_INTEGRAL_BOUNDED = prove - (`!(g:real->real) a. - (!y. &0 <= g y /\ g y <= &1) /\ (!y. y <= a ==> g y = &1) /\ - (!y. g real_continuous atreal y) - ==> std_normal_cdf a <= real_integral (:real) (\y. g y * std_normal_density y)`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `(\y:real. g y * std_normal_density y) real_integrable_on (:real)` - ASSUME_TAC THENL - [MATCH_MP_TAC BOUNDED_CONT_TIMES_DENSITY_INTEGRABLE THEN - ASM_REWRITE_TAC[] THEN EXISTS_TAC `&1` THEN - GEN_TAC THEN - UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN - DISCH_THEN(MP_TAC o SPEC `y:real`) THEN REAL_ARITH_TAC; +(* ========================================================================= *) +(* SECTION 3: HELLY'S SELECTION THEOREM *) +(* ========================================================================= *) + +let dist_fn_seq = new_definition + `dist_fn_seq (f:num->real->real) <=> + (!n x y. x <= y ==> f n x <= f n y) /\ + (!n x. &0 <= f n x /\ f n x <= &1)`;; + +(* Convergence along rationals via diagonal argument *) +let HELLY_RATIONAL_CONVERGENCE = prove + (`!f:num->real->real. dist_fn_seq f + ==> ?r G. (!m n. m < n ==> r m < r n) /\ + (!q. rational q ==> ((\k. f (r k) q) ---> G q) sequentially) /\ + (!q. rational q ==> &0 <= G q /\ G q <= &1) /\ + (!q1 q2. rational q1 /\ rational q2 /\ q1 <= q2 + ==> G q1 <= G q2)`, + GEN_TAC THEN REWRITE_TAC[dist_fn_seq] THEN STRIP_TAC THEN + MP_TAC RATIONAL_ENUMERATION THEN + DISCH_THEN(X_CHOOSE_TAC `g:num->real`) THEN + MP_TAC(SPECL [`\i n. (f:num->real->real) n ((g:num->real) i)`; `&1`] + DIAGONAL_BOUNDED_CONVERGENCE) THEN + ANTS_TAC THENL + [REPEAT GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &1 ==> abs x <= &1`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[std_normal_cdf] THEN - MP_TAC(ISPECL - [`\y:real. if y IN {t | t <= a} then std_normal_density y else &0`; - `\y:real. g y * std_normal_density y`; - `(:real)`; - `real_integral (:real) (\y:real. if y IN {t | t <= a} then std_normal_density y else &0)`; - `real_integral (:real) (\y:real. g y * std_normal_density y)`] - HAS_REAL_INTEGRAL_LE) THEN BETA_TAC THEN - REWRITE_TAC[REAL_INTEGRAL_RESTRICT_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `r:num->num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `r:num->num` THEN + EXISTS_TAC `\q. if rational q + then @l. ((\k. (f:num->real->real) ((r:num->num) k) q) ---> l) sequentially + else &0` THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `!q:real. rational q + ==> ((\k. (f:num->real->real) ((r:num->num) k) q) ---> + (@l. ((\k. f (r k) q) ---> l) sequentially)) sequentially` + ASSUME_TAC THENL + [X_GEN_TAC `q:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `q IN IMAGE (g:num->real) (:num)` MP_TAC THENL + [ASM_MESON_TAC[IN]; ALL_TAC] THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `i:num` SUBST1_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `l:real`) THEN + SUBGOAL_THEN + `(@l. ((\k. (f:num->real->real) ((r:num->num) k) + ((g:num->real) i)) ---> l) sequentially) = l` + SUBST1_TAC THENL + [MATCH_MP_TAC SELECT_UNIQUE THEN X_GEN_TAC `l':real` THEN EQ_TAC THENL + [REWRITE_TAC[BETA_THM] THEN DISCH_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) ((g:num->real) i)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY]; + REWRITE_TAC[BETA_THM] THEN DISCH_THEN SUBST1_TAC THEN + ASM_REWRITE_TAC[]]; + FIRST_ASSUM ACCEPT_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!q:real. IMAGE (g:num->real) (:num) q <=> rational q` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_MESON_TAC[IN]; ALL_TAC] THEN + SIMP_TAC[] THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + (* Bounds [0,1] *) + X_GEN_TAC `q:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `q:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; + (* Monotonicity *) + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q1` THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q2` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]]);; + +(* Right-continuous regularization *) +let helly_limit = new_definition + `helly_limit (G:real->real) x = inf {G q | rational q /\ x < q}`;; + +(* The infimum set is nonempty and bounded below *) +let HELLY_LIMIT_SET_PROPS = prove + (`!G x. (!q. rational q ==> &0 <= G q) + ==> ~({G q | rational q /\ x < q} = {}) /\ + (?b. !y. y IN {G q | rational q /\ x < q} ==> b <= y)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + MP_TAC(SPECL [`x:real`; `x + &1`] RATIONAL_BETWEEN) THEN + REWRITE_TAC[REAL_ARITH `x < x + &1`] THEN + DISCH_THEN(X_CHOOSE_THEN `q:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(G:real->real) q` THEN + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `q:real` THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]]);; + +(* Bounds on helly_limit *) +let HELLY_LIMIT_BOUNDS = prove + (`!G x. (!q. rational q ==> &0 <= G q /\ G q <= &1) + ==> &0 <= helly_limit G x /\ helly_limit G x <= &1`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[helly_limit] THEN + SUBGOAL_THEN `!q:real. rational q ==> &0 <= (G:real->real) q` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MP_TAC(SPECL [`G:real->real`; `x:real`] HELLY_LIMIT_SET_PROPS) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_INF_BOUNDS THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_SIMP_TAC[]);; + +(* Monotonicity of helly_limit *) +let HELLY_LIMIT_MONO = prove + (`!G x y. (!q. rational q ==> &0 <= G q) /\ + (!q1 q2. rational q1 /\ rational q2 /\ q1 <= q2 + ==> G q1 <= G q2) /\ + x <= y + ==> helly_limit G x <= helly_limit G y`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[helly_limit] THEN + MATCH_MP_TAC REAL_LE_INF_SUBSET THEN + MP_TAC(SPECL [`G:real->real`; `y:real`] HELLY_LIMIT_SET_PROPS) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN EXISTS_TAC `q:real` THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]]);; + +(* Infimum approach: for any eps > 0, find rational close to infimum *) +let HELLY_LIMIT_APPROACH = prove + (`!G x e. (!q. rational q ==> &0 <= G q) /\ &0 < e + ==> ?r. rational r /\ x < r /\ G r < helly_limit G x + e`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[helly_limit] THEN + MP_TAC(SPECL [`G:real->real`; `x:real`] HELLY_LIMIT_SET_PROPS) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MP_TAC(SPECL [`{(G:real->real) q | rational q /\ x < q}`; + `inf {(G:real->real) q | rational q /\ x < q} + e`] + INF_APPROACH) THEN + ASM_REWRITE_TAC[REAL_ARITH `x < x + e <=> &0 < e`] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ANTS_TAC THENL - [CONJ_TAC THENL - [REWRITE_TAC[HAS_REAL_INTEGRAL_RESTRICT_UNIV] THEN - MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE_HALFLINE]; - ALL_TAC] THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - GEN_TAC THEN REWRITE_TAC[IN_UNIV; IN_ELIM_THM] THEN - ASM_CASES_TAC `x <= a` THENL - [ASM_REWRITE_TAC[] THEN - UNDISCH_TAC `!y:real. y <= a ==> g y = &1` THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]; - ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN - MATCH_MP_TAC REAL_LE_MUL THEN - REWRITE_TAC[STD_NORMAL_DENSITY_NONNEG] THEN - UNDISCH_TAC `!y:real. &0 <= g y /\ g y <= &1` THEN - DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REAL_ARITH_TAC]; - SIMP_TAC[]] -);; + [EXISTS_TAC `&0` THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `y:real` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `q:real` STRIP_ASSUME_TAC) ASSUME_TAC) THEN + EXISTS_TAC `q:real` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `y = (G:real->real) q` (SUBST_ALL_TAC) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]);; +(* For rational q > x, helly_limit G x <= G q *) +let HELLY_LIMIT_LE_RATIONAL = prove + (`!G x q. (!r. rational r ==> &0 <= G r) /\ + rational q /\ x < q + ==> helly_limit G x <= G q`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[helly_limit] THEN + MP_TAC(SPECL [`G:real->real`; `x:real`] HELLY_LIMIT_SET_PROPS) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MP_TAC(ISPECL [`{(G:real->real) r | rational r /\ x < r}`; + `&0`; + `(G:real->real) q`; + `(G:real->real) q`] REAL_INF_LE) THEN + REWRITE_TAC[REAL_LE_REFL] THEN + DISCH_THEN MATCH_MP_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL + [EXISTS_TAC `q:real` THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]]);; + +(* ---- Main theorem ---- *) +let HELLY_SELECTION_THEOREM = prove + (`!f:num->real->real. dist_fn_seq f + ==> ?r H. (!m n. m < n ==> r m < r n) /\ + (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!x. H real_continuous (atreal x) + ==> ((\k. f (r k) x) ---> H x) sequentially)`, + GEN_TAC THEN DISCH_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP HELLY_RATIONAL_CONVERGENCE) THEN + DISCH_THEN(X_CHOOSE_THEN `r:num->num` + (X_CHOOSE_THEN `G:real->real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `r:num->num` THEN + EXISTS_TAC `helly_limit (G:real->real)` THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + GEN_TAC THEN MATCH_MP_TAC HELLY_LIMIT_BOUNDS THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC HELLY_LIMIT_MONO THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Convergence at continuity points *) + X_GEN_TAC `x:real` THEN + REWRITE_TAC[real_continuous_atreal] THEN DISCH_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN + (* Pick q2 > x with G(q2) < H(x) + e/3 *) + MP_TAC(SPECL [`G:real->real`; `x:real`; `e / &3`] HELLY_LIMIT_APPROACH) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q2:real` STRIP_ASSUME_TAC) THEN + (* Pick q1 rational in (x - d/2, x) *) + SUBGOAL_THEN `x - d / &2 < x` + (fun th -> MP_TAC(MATCH_MP RATIONAL_BETWEEN th)) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q1:real` STRIP_ASSUME_TAC) THEN + (* Key lower bound: H(x-d/2) <= G(q1) and H(x) - e/3 < H(x-d/2) *) + SUBGOAL_THEN `helly_limit (G:real->real) (x - d / &2) <= G q1` + ASSUME_TAC THENL + [MATCH_MP_TAC HELLY_LIMIT_LE_RATIONAL THEN ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `helly_limit (G:real->real) x - e / &3 < helly_limit G (x - d / &2)` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `x - d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Get convergence at q1 and q2 *) + UNDISCH_THEN + `!q:real. rational q + ==> ((\k. (f:num->real->real) ((r:num->num) k) q) ---> G q) + sequentially` + (fun th -> MP_TAC(SPEC `q1:real` th) THEN MP_TAC(SPEC `q2:real` th)) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + (* Squeeze argument *) + EXISTS_TAC `MAX N1 N2` THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `!n:num x y. x <= y ==> (f:num->real->real) n x <= f n y` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [dist_fn_seq]) THEN + MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(f:num->real->real) ((r:num->num) n) q1 <= f (r n) x` + ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(f:num->real->real) ((r:num->num) n) x <= f (r n) q2` + ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs ((f:num->real->real) ((r:num->num) n) q1 - G q1) < e / &3` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o check (is_forall o concl)) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs ((f:num->real->real) ((r:num->num) n) q2 - G q2) < e / &3` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o check (is_forall o concl)) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; -(* Char fn uniqueness for the standard normal: - If char fns converge to exp(-t^2/2) and CDFs converge at x to l, - then l = std_normal_cdf(x). +(* ======================================================================== *) +(* Section 4: Tightness and Forward Prohorov *) +(* ======================================================================== *) - Uses a sandwich argument with piecewise linear test functions. *) -let CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove - (`!p:A prob_space (X:num->A->real) x l. - (!n. simple_rv p (X n)) /\ - (?C. &0 < C /\ !n. simple_expectation p (\x. X n x pow 2) <= C) /\ - (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) - sequentially) /\ - (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) /\ - ((\n. simple_cdf p (X n) x) ---> l) sequentially - ==> l = std_normal_cdf x`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - MATCH_MP_TAC CONTINUOUS_LIMIT_SANDWICH THEN - REWRITE_TAC[STD_NORMAL_CDF_CONTINUOUS] THEN - X_GEN_TAC `h:real` THEN DISCH_TAC THEN - CONJ_TAC THENL - [(* ---- Lower bound: std_normal_cdf(x - h) <= l ---- *) - ABBREV_TAC - `g_low = \y:real. max (&0) (min (&1) (&1 - (y - (x - h)) / h))` THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC - `real_integral (:real) - (\y:real. g_low y * std_normal_density y)` THEN - CONJ_TAC THENL - [(* Phi(x-h) <= int g_low*density *) - MATCH_MP_TAC CDF_LE_INTEGRAL_BOUNDED THEN - EXPAND_TAC "g_low" THEN CONJ_TAC THENL - [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - CONJ_TAC THENL - [X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&1 <= &1 - (y - (x - h)) / h` MP_TAC THENL - [ASM_SIMP_TAC[REAL_ARITH `&1 <= &1 - z <=> z <= &0`; - REAL_LE_LDIV_EQ] THEN - ASM_REAL_ARITH_TAC; - REAL_ARITH_TAC]; - GEN_TAC THEN - MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN - REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; - CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - ASM_REAL_ARITH_TAC]]]]]]; - ALL_TAC] THEN - (* int g_low*density <= l: by limit comparison *) - MP_TAC(ISPECL - [`sequentially`; - `\n:num. simple_expectation (p:A prob_space) - (\a:A. (g_low:real->real) ((X:num->A->real) n a))`; - `\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; - `real_integral (:real) - (\y:real. (g_low:real->real) y * std_normal_density y)`; - `l:real`] - REALLIM_LE) THEN +let tight_sequence = new_definition + `tight_sequence (f:num->real->real) <=> + dist_fn_seq f /\ + !e. &0 < e ==> + ?M. &0 < M /\ !n. f n (--M) < e /\ &1 - e < f n M`;; + +let TIGHT_HELLY_LIMIT_PROPER = prove + (`!f:num->real->real. tight_sequence f + ==> ?r H. (!m n. m < n ==> r m < r n) /\ + (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!x. H real_continuous (atreal x) + ==> ((\k. f (r k) x) ---> H x) sequentially) /\ + (!e. &0 < e ==> ?M. &0 < M /\ H(--M) < e /\ &1 - e < H M)`, + GEN_TAC THEN REWRITE_TAC[tight_sequence] THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP HELLY_RATIONAL_CONVERGENCE) THEN + DISCH_THEN(X_CHOOSE_THEN `r:num->num` + (X_CHOOSE_THEN `G:real->real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `r:num->num` THEN + EXISTS_TAC `helly_limit (G:real->real)` THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + GEN_TAC THEN MATCH_MP_TAC HELLY_LIMIT_BOUNDS THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC HELLY_LIMIT_MONO THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + (* Convergence at continuity points *) + X_GEN_TAC `x:real` THEN + REWRITE_TAC[real_continuous_atreal] THEN DISCH_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `d:real` STRIP_ASSUME_TAC) THEN + MP_TAC(SPECL [`G:real->real`; `x:real`; `e / &3`] + HELLY_LIMIT_APPROACH) THEN ANTS_TAC THENL - [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN - CONJ_TAC THENL - [(* E[g_low(X_n)] --> int g_low*density *) - MATCH_MP_TAC WEAK_CONVERGENCE_FROM_CHAR_FN THEN - ASM_REWRITE_TAC[] THEN + [ASM_MESON_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q2:real` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `x - d / &2 < x` + (fun th -> MP_TAC(MATCH_MP RATIONAL_BETWEEN th)) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q1:real` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `helly_limit (G:real->real) (x - d / &2) <= G q1` + ASSUME_TAC THENL + [MATCH_MP_TAC HELLY_LIMIT_LE_RATIONAL THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `helly_limit (G:real->real) x - e / &3 < helly_limit G (x - d / &2)` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `x - d / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + UNDISCH_THEN + `!q:real. rational q + ==> ((\k. (f:num->real->real) ((r:num->num) k) q) ---> G q) + sequentially` + (fun th -> MP_TAC(SPEC `q1:real` th) THEN + MP_TAC(SPEC `q2:real` th)) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + EXISTS_TAC `MAX N1 N2` THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `!n:num x y. x <= y ==> (f:num->real->real) n x <= f n y` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [dist_fn_seq]) THEN + MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(f:num->real->real) ((r:num->num) n) q1 <= f (r n) x` + ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(f:num->real->real) ((r:num->num) n) x <= f (r n) q2` + ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs ((f:num->real->real) ((r:num->num) n) q1 - G q1) < e / &3` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o check (is_forall o concl)) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs ((f:num->real->real) ((r:num->num) n) q2 - G q2) < e / &3` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o check (is_forall o concl)) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + (* Tightness transfers to the limit *) + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + UNDISCH_THEN `!e. &0 < e + ==> (?M. &0 < M /\ + (!n:num. (f:num->real->real) n (--M) < e /\ &1 - e < f n M))` + (MP_TAC o SPEC `e / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `M:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `M + &1` THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [(* Lower tail: helly_limit G (-(M+1)) < e *) + SUBGOAL_THEN `--(M + &1) < --M` + (fun th -> MP_TAC(MATCH_MP RATIONAL_BETWEEN th)) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `q0:real` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(G:real->real) q0 <= e / &2` ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q0` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(f:num->real->real) ((r:num->num) n) (--M)` THEN CONJ_TAC THENL - [(* ?C existential *) - EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN + [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [dist_fn_seq]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPECL + [`(r:num->num) n`; `q0:real`; `--M:real`]) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; SIMP_TAC[]]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MP_TAC(SPEC `(r:num->num) n` (ASSUME + `!n. (f:num->real->real) n (--M) < e / &2 /\ + &1 - e / &2 < f n M`)) THEN + SIMP_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(G:real->real) q0` THEN CONJ_TAC THENL + [MATCH_MP_TAC HELLY_LIMIT_LE_RATIONAL THEN ASM_MESON_TAC[]; + ASM_REAL_ARITH_TAC]; + (* Upper tail: 1 - e < helly_limit G (M+1) *) + SUBGOAL_THEN + `!q. rational q /\ M < q ==> &1 - e / &2 <= (G:real->real) q` + ASSUME_TAC THENL + [X_GEN_TAC `q:real` THEN STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\k. (f:num->real->real) ((r:num->num) k) q` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(f:num->real->real) ((r:num->num) n) M` THEN CONJ_TAC THENL - [(* g_low continuous *) - EXPAND_TAC "g_low" THEN GEN_TAC THEN - MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN - REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; - CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - ASM_REAL_ARITH_TAC]]]]]; - (* g_low bounded *) - EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN - GEN_TAC THEN EXPAND_TAC "g_low" THEN REAL_ARITH_TAC]; + [MATCH_MP_TAC REAL_LT_IMP_LE THEN + MP_TAC(SPEC `(r:num->num) n` (ASSUME + `!n. (f:num->real->real) n (--M) < e / &2 /\ + &1 - e / &2 < f n M`)) THEN + SIMP_TAC[]; + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [dist_fn_seq]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPECL + [`(r:num->num) n`; `M:real`; `q:real`]) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; SIMP_TAC[]]]; ALL_TAC] THEN - (* E[g_low(X_n)] <= F_n(x) eventually *) - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - MATCH_MP_TAC EXPECTATION_LE_CDF THEN ASM_REWRITE_TAC[] THEN - EXPAND_TAC "g_low" THEN CONJ_TAC THENL - [(* g_low(y) <= 1 for y <= x *) - GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; - (* g_low(y) <= 0 for y > x *) - X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&1 - (y - (x - h)) / h < &0` MP_TAC THENL - [SUBGOAL_THEN `&1 < (y - (x - h)) / h` - (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN - ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; - REAL_ARITH_TAC]]; - SIMP_TAC[]]; - - (* ---- Upper bound: l <= std_normal_cdf(x + h) ---- *) - ABBREV_TAC - `g_up = \y:real. max (&0) (min (&1) ((x + h - y) / h))` THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC - `real_integral (:real) - (\y:real. g_up y * std_normal_density y)` THEN - CONJ_TAC THENL - [(* l <= int g_up*density: by limit comparison *) - MP_TAC(ISPECL - [`sequentially`; - `\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; - `\n:num. simple_expectation (p:A prob_space) - (\a:A. (g_up:real->real) ((X:num->A->real) n a))`; - `l:real`; - `real_integral (:real) - (\y:real. (g_up:real->real) y * std_normal_density y)`] - REALLIM_LE) THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `&1 - e / &2` THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[helly_limit] THEN + MP_TAC(SPEC `&1 - e / &2` + (INST [`{(G:real->real) q | rational q /\ M + &1 < q}`, + `s:real->bool`] + REAL_LE_INF)) THEN ANTS_TAC THENL - [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN - CONJ_TAC THENL - [(* E[g_up(X_n)] --> int g_up*density *) - MATCH_MP_TAC WEAK_CONVERGENCE_FROM_CHAR_FN THEN - ASM_REWRITE_TAC[] THEN - CONJ_TAC THENL - [(* ?C existential *) - EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - CONJ_TAC THENL - [(* g_up continuous *) - EXPAND_TAC "g_up" THEN GEN_TAC THEN - MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN - REWRITE_TAC[REAL_CONTINUOUS_CONST; REAL_CONTINUOUS_AT_ID]]; - CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - ASM_REAL_ARITH_TAC]]]]; - (* g_up bounded *) - EXISTS_TAC `&1` THEN REWRITE_TAC[REAL_LT_01] THEN - GEN_TAC THEN EXPAND_TAC "g_up" THEN REAL_ARITH_TAC]; - ALL_TAC] THEN - (* F_n(x) <= E[g_up(X_n)] eventually *) - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - MATCH_MP_TAC CDF_LE_EXPECTATION THEN ASM_REWRITE_TAC[] THEN - EXPAND_TAC "g_up" THEN CONJ_TAC THENL - [(* g_up(y) >= 1 for y <= x *) - X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `&1 <= (x + h - y) / h` MP_TAC THENL - [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; - REAL_ARITH_TAC]; - (* g_up(y) >= 0 for y > x *) - GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; - SIMP_TAC[]]; - - (* int g_up*density <= Phi(x+h) *) - MATCH_MP_TAC INTEGRAL_BOUNDED_LE_CDF THEN - EXPAND_TAC "g_up" THEN CONJ_TAC THENL - [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - CONJ_TAC THENL - [X_GEN_TAC `y:real` THEN DISCH_TAC THEN - SUBGOAL_THEN `(x + h - y) / h < &0` MP_TAC THENL - [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; - REAL_ARITH_TAC]; - GEN_TAC THEN - MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_CONTINUOUS_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN - REWRITE_TAC[REAL_CONTINUOUS_CONST; REAL_CONTINUOUS_AT_ID]]; - CONJ_TAC THENL - [REWRITE_TAC[REAL_CONTINUOUS_CONST]; - ASM_REAL_ARITH_TAC]]]]]]]);; - -(* ========================================================================= *) -(* LEVY CONTINUITY THEOREM (bridge from char fn to distribution) *) -(* ========================================================================= *) - -(* Levy's continuity theorem (one direction, specialized for CLT): - If the characteristic functions converge pointwise to the - characteristic function of N(0,1), and second moments are bounded, - then the CDFs converge to the standard normal CDF. + [CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + MP_TAC(SPECL [`M + &1`; `M + &2`] RATIONAL_BETWEEN) THEN + ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN EXISTS_TAC `(G:real->real) q` THEN + EXISTS_TAC `q:real` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `b:real` THEN + DISCH_THEN(X_CHOOSE_THEN `q:real` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + SIMP_TAC[]]]]);; + +(* ======================================================================== *) +(* Section 5: Bridge to probability spaces *) +(* ======================================================================== *) + +(* Helper for bridge proofs: show abs(X) >= M is an event and derive CDF + bounds from P(abs(X) >= M) < e *) +let CDF_BOUNDS_FROM_TIGHTNESS = prove + (`!p:A prob_space (X:A->real) M e. + random_variable p X /\ + {a | a IN prob_carrier p /\ abs(X a) >= M} IN prob_events p /\ + prob p {a | a IN prob_carrier p /\ abs(X a) >= M} < e + ==> distribution_fn p X (--M) < e /\ &1 - e < distribution_fn p X M`, + REPEAT GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL + [(* Lower tail: P(X <= -M) <= P(|X| >= M) < e *) + REWRITE_TAC[distribution_fn] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + {a | a IN prob_carrier p /\ abs((X:A->real) a) >= M}` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC DIST_FN_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + (* Upper tail: 1 - P(X <= M) = P(X > M) <= P(|X| >= M) < e *) + REWRITE_TAC[distribution_fn] THEN + MATCH_MP_TAC(REAL_ARITH `&1 - x < e ==> &1 - e < x`) THEN + SUBGOAL_THEN `&1 - prob (p:A prob_space) + {x | x IN prob_carrier p /\ (X:A->real) x <= M} = + prob p (prob_carrier p DIFF {x | x IN prob_carrier p /\ X x <= M})` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC PROB_COMPL THEN + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC DIST_FN_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + {a | a IN prob_carrier p /\ abs((X:A->real) a) >= M}` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC DIST_FN_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_DIFF; IN_ELIM_THM] THEN + GEN_TAC THEN STRIP_TAC THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o check (fun th -> + is_neg(concl th))) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]]);; - The bounded second moment hypothesis gives tightness via - SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS. The CDF convergence step (Step 2) - uses Helly's selection theorem + Fourier uniqueness. *) -let SIMPLE_LEVY_CONTINUITY_CLT = prove - (`!p:A prob_space (X:num->A->real). - (!n. simple_rv p (X n)) /\ - (?C. &0 < C /\ - !n. simple_expectation p (\x. (X:num->A->real) n x pow 2) <= C) /\ - (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) - sequentially) /\ - (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) - ==> !x. ((\n. simple_cdf p (X n) x) ---> std_normal_cdf x) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `x:real` THEN - (* Step 1: Tightness from bounded second moments *) +let ABS_GE_IN_EVENTS = prove + (`!p:A prob_space (X:A->real) M. + random_variable p X + ==> {a | a IN prob_carrier p /\ abs(X a) >= M} IN prob_events p`, + REPEAT STRIP_TAC THEN SUBGOAL_THEN - `!e. &0 < e ==> - ?M. &0 < M /\ - ?N:num. !n. N <= n ==> - prob (p:A prob_space) {a | a IN prob_carrier p /\ - abs((X:num->A->real) n a) >= M} < e` + `{a:A | a IN prob_carrier p /\ abs((X:A->real) a) >= M} = + {a | a IN prob_carrier p /\ X a >= M} UNION + {a | a IN prob_carrier p /\ X a <= --M}` + SUBST1_TAC THENL + [SET_TAC[REAL_ARITH + `!x M:real. abs x >= M <=> x >= M \/ x <= --M`]; + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_GE THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC DIST_FN_IN_EVENTS THEN + ASM_REWRITE_TAC[]]]);; + +let PROHOROV_FORWARD_SIMPLE = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. simple_rv p (X n)) /\ + &0 < C /\ + (!n. simple_expectation p (\x. (X n x) pow 2) <= C) + ==> ?r H. (!m n. m < n ==> r m < r n) /\ + (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!x. H real_continuous (atreal x) + ==> ((\k. distribution_fn p (X (r k)) x) ---> H x) + sequentially) /\ + (!e. &0 < e ==> ?M. &0 < M /\ H(--M) < e /\ &1 - e < H M)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n:num. random_variable (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL - [X_GEN_TAC `e:real` THEN DISCH_TAC THEN + [GEN_TAC THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) ((X:num->A->real) n)` MP_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[simple_rv] THEN SIMP_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC TIGHT_HELLY_LIMIT_PROPER THEN + REWRITE_TAC[tight_sequence] THEN CONJ_TAC THENL + [(* dist_fn_seq *) + REWRITE_TAC[dist_fn_seq] THEN BETA_TAC THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC DIST_FN_MONO THEN + ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC DIST_FN_NONNEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC DIST_FN_LE_1 THEN ASM_REWRITE_TAC[]]]; + (* tightness bounds *) + X_GEN_TAC `e:real` THEN DISCH_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `C:real`] SIMPLE_TIGHTNESS_FROM_SECOND_MOMENTS) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - STRIP_TAC THEN EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[] THEN - EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + DISCH_THEN(X_CHOOSE_THEN `M:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `n:num` THEN + MATCH_MP_TAC CDF_BOUNDS_FROM_TIGHTNESS THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC ABS_GE_IN_EVENTS THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]);; + +(* PROHOROV_FORWARD is in clt.ml since it depends on + TIGHTNESS_FROM_SECOND_MOMENTS which is defined there *) + +(* ======================================================================== *) +(* Monotone functions have continuity points in every interval *) +(* ======================================================================== *) + +let SUM_TELESCOPE_ALT = prove + (`!(f:num->real) n. 1 <= n + ==> sum(1..n) (\k. f k - f(k - 1)) = f n - f 0`, + GEN_TAC THEN INDUCT_TAC THEN REWRITE_TAC[ARITH_RULE `~(1 <= 0)`] THEN + DISCH_TAC THEN ASM_CASES_TAC `n = 0` THENL + [ASM_REWRITE_TAC[ARITH_RULE `SUC 0 = 1`; SUM_SING_NUMSEG] THEN + BETA_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN REAL_ARITH_TAC; + MP_TAC(ISPECL [`\k:num. (f:num->real) k - f(k - 1)`; + `1`; `SUC n`] SUM_CLAUSES_RIGHT) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUC_SUB1] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `1 <= n` (fun th -> FIRST_X_ASSUM(MP_TAC o C MATCH_MP th)) + THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN BETA_TAC THEN + REWRITE_TAC[SUC_SUB1] THEN REAL_ARITH_TAC]);; + +(* Generalized pigeonhole: any interval (p0,q0) contains a subinterval + with arbitrarily small oscillation for a bounded monotone function. *) +let MONOTONE_SMALL_OSC_SUBINTERVAL = prove + (`!f p0 q0 n. + (!x y:real. x <= y ==> f x <= f y) /\ + (!x. &0 <= f x /\ f x <= &1) /\ + p0 < q0 + ==> ?p q. p0 < p /\ q < q0 /\ p < q /\ + (f:real->real) q - f p < inv(&(SUC n))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `N = n + 2` THEN + SUBGOAL_THEN `~(&N = &0)` ASSUME_TAC THENL + [EXPAND_TAC "N" THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN - (* Step 2: Apply subsequence convergence principle - By REALLIM_SUBSEQ_SAME_LIMIT, it suffices to show every subsequence - has a sub-subsequence with CDFs converging to std_normal_cdf at x *) - MATCH_MP_TAC(ISPECL - [`\n:num. simple_cdf (p:A prob_space) ((X:num->A->real) n) x`; - `std_normal_cdf x`; `&1`] REALLIM_SUBSEQ_SAME_LIMIT) THEN - BETA_TAC THEN CONJ_TAC THENL - [(* CDFs are bounded by 1 in absolute value *) - GEN_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN - MATCH_MP_TAC SIMPLE_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&0 < &N` ASSUME_TAC THENL + [EXPAND_TAC "N" THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC; ALL_TAC] THEN - (* For each subsequence r, find convergent sub-subsequence *) - X_GEN_TAC `r:num->num` THEN DISCH_TAC THEN - (* Step 2a: By Bolzano-Weierstrass, extract convergent sub-subsequence *) + SUBGOAL_THEN `1 <= N` ASSUME_TAC THENL + [EXPAND_TAC "N" THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `sum(1..N) (\k. (f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k-1) * (q0 - p0) / &N)) = f q0 - f p0` + ASSUME_TAC THENL + [SUBGOAL_THEN + `sum(1..N) (\k. (f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k - 1) * (q0 - p0) / &N)) = + f(p0 + &N * (q0 - p0) / &N) - f(p0 + &0 * (q0 - p0) / &N)` + SUBST1_TAC THENL + [MP_TAC(BETA_RULE(SPECL + [`\j:num. (f:real->real)(p0 + &j * (q0 - p0) / &N)`; `N:num`] + SUM_TELESCOPE_ALT)) THEN + ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&N * (q0 - p0) / &N = q0 - p0` ASSUME_TAC THENL + [UNDISCH_TAC `~(&N = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO; REAL_ADD_RID; + REAL_ARITH `a + (b - a):real = b`]]; + ALL_TAC] THEN + SUBGOAL_THEN `?k. k IN 1..N /\ + (f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k - 1) * (q0 - p0) / &N) <= inv(&N)` MP_TAC THENL + [ASM_CASES_TAC + `!k. k IN 1..N ==> inv(&N) < + (f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k - 1) * (q0 - p0) / &N)` THENL + [SUBGOAL_THEN `&1 < sum(1..N) + (\k. (f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k - 1) * (q0 - p0) / &N))` MP_TAC THENL + [SUBGOAL_THEN `&1 = sum(1..N) (\k:num. inv(&N))` SUBST1_TAC THENL + [REWRITE_TAC[SUM_CONST_NUMSEG; ADD_SUB] THEN + CONV_TAC SYM_CONV THEN + ASM_SIMP_TAC[REAL_MUL_RINV; REAL_OF_NUM_EQ; + ARITH_RULE `1 <= N ==> ~(N = 0)`]; + MATCH_MP_TAC SUM_LT_ALL THEN + REWRITE_TAC[FINITE_NUMSEG; NUMSEG_EMPTY; NOT_LT; LE_REFL] THEN + CONJ_TAC THENL + [EXPAND_TAC "N" THEN ARITH_TAC; + X_GEN_TAC `j:num` THEN DISCH_TAC THEN BETA_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]]; + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(fun th -> MP_TAC(SPEC `p0:real` th) THEN + MP_TAC(SPEC `q0:real` th)) THEN + REAL_ARITH_TAC]; + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN + REWRITE_TAC[NOT_IMP; REAL_NOT_LT] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[IN_NUMSEG] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC)] THEN + EXISTS_TAC `p0 + &(k - 1) * (q0 - p0) / &N + (q0 - p0) / (&N * &4)` THEN + EXISTS_TAC `p0 + &k * (q0 - p0) / &N - (q0 - p0) / (&N * &4)` THEN + SUBGOAL_THEN `&0 < (q0 - p0) / &N` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < (q0 - p0) / (&N * &4)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_MUL THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ &0 < y ==> a < a + x + y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_POS]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `&k * (q0 - p0) / &N - (q0 - p0) / (&N * &4) < + &k * (q0 - p0) / &N` MP_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&k * (q0 - p0) / &N <= &N * (q0 - p0) / &N` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THEN + TRY ASM_REAL_ARITH_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `&N * (q0 - p0) / &N = q0 - p0` ASSUME_TAC THENL + [UNDISCH_TAC `~(&N = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + MP_TAC(SPECL [`1`; `k:num`] REAL_OF_NUM_SUB) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + SUBGOAL_THEN `(q0 - p0) / (&N * &4) = (q0 - p0) / &N / &4` + SUBST1_TAC THENL + [UNDISCH_TAC `~(&N = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN + UNDISCH_TAC `&0 < (q0 - p0) / &N` THEN + SPEC_TAC(`(q0 - p0) / &N`, `d:real`) THEN + GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(f:real->real)(p0 + &k * (q0 - p0) / &N) - + f(p0 + &(k - 1) * (q0 - p0) / &N)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `(f:real->real)(p0 + &(k - 1) * (q0 - p0) / &N) <= + f(p0 + &(k - 1) * (q0 - p0) / &N + (q0 - p0) / (&N * &4))` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(f:real->real)(p0 + &k * (q0 - p0) / &N - (q0 - p0) / (&N * &4)) <= + f(p0 + &k * (q0 - p0) / &N)` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(&N)` THEN + CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN + EXPAND_TAC "N" THEN ARITH_TAC]]]);; + +(* Every open interval contains a continuity point of a bounded monotone + function. Proof by nested intervals: at each step, pick a subinterval + with smaller oscillation. The nested intersection is a single point + where f is continuous. *) +let MONOTONE_CONTINUITY_DENSE = prove + (`!f a b. (!x y:real. x <= y ==> f x <= f y) /\ + (!x. &0 <= f x /\ f x <= &1) /\ + a < b + ==> ?c. a < c /\ c < b /\ f real_continuous atreal c`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Work inside a sub-interval (a', b') strictly inside (a, b) *) + ABBREV_TAC `a' = (&2 * a + b) / &3` THEN + ABBREV_TAC `b' = (a + &2 * b) / &3` THEN + SUBGOAL_THEN `a < a' /\ a' < b' /\ b' < b` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "a'" THEN EXPAND_TAC "b'" THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Build nested intervals via num_RECURSION *) MP_TAC(ISPECL - [`\k:num. simple_cdf (p:A prob_space) ((X:num->A->real) ((r:num->num) k)) x`; - `&1`] BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN - BETA_TAC THEN ANTS_TAC THENL - [GEN_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN - MATCH_MP_TAC SIMPLE_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + [`@w:real#real. a' < FST w /\ SND w < b' /\ FST w < SND w /\ + (f:real->real)(SND w) - f(FST w) < inv(&(SUC 0))`; + `\w:real#real m:num. + @v:real#real. FST w < FST v /\ SND v < SND w /\ + FST v < SND v /\ + (f:real->real)(SND v) - f(FST v) < inv(&(SUC(SUC m)))`] + num_RECURSION) THEN + DISCH_THEN(X_CHOOSE_TAC `G:num->real#real`) THEN + ABBREV_TAC `P = \n:num. FST((G:num->real#real) n)` THEN + ABBREV_TAC `Q = \n:num. SND((G:num->real#real) n)` THEN + (* Key properties: SELECT_RULE extracts from @ *) + SUBGOAL_THEN + `(!n. a' < (P:num->real) n /\ (Q:num->real) n < b' /\ + P n < Q n /\ (f:real->real)(Q n) - f(P n) < inv(&(SUC n))) /\ + (!n. (P:num->real) n < P(SUC n) /\ (Q:num->real)(SUC n) < Q n)` + STRIP_ASSUME_TAC THENL + [SUBGOAL_THEN + `!n. a' < (P:num->real) n /\ (Q:num->real) n < b' /\ + P n < Q n /\ (f:real->real)(Q n) - f(P n) < inv(&(SUC n)) /\ + (0 < n ==> P(n - 1) < P n /\ Q n < Q(n - 1))` + (fun th -> CONJ_TAC THENL + [GEN_TAC THEN + MP_TAC(SPEC `n:num` th) THEN SIMP_TAC[]; + GEN_TAC THEN + MP_TAC(SPEC `SUC n` th) THEN + REWRITE_TAC[LT_0; SUC_SUB1] THEN SIMP_TAC[]]) THENL + [INDUCT_TAC THENL + [(* Base case: properties of G 0 *) + SUBGOAL_THEN + `a' < FST((G:num->real#real) 0) /\ SND(G 0) < b' /\ + FST(G 0) < SND(G 0) /\ + (f:real->real)(SND(G 0)) - f(FST(G 0)) < inv(&(SUC 0))` + MP_TAC THENL + [SUBGOAL_THEN + `?w:real#real. a' < FST w /\ SND w < b' /\ FST w < SND w /\ + (f:real->real)(SND w) - f(FST w) < inv(&(SUC 0))` + (fun th -> MP_TAC(SELECT_RULE th)) THENL + [MP_TAC(ISPECL [`f:real->real`; `a':real`; `b':real`; `0`] + MONOTONE_SMALL_OSC_SUBINTERVAL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `p:real` + (X_CHOOSE_THEN `q:real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `(p:real,q:real)` THEN ASM_REWRITE_TAC[FST; SND]; + FIRST_X_ASSUM(fun th -> REWRITE_TAC[GSYM(CONJUNCT1 th)])]; + EXPAND_TAC "P" THEN EXPAND_TAC "Q" THEN + REWRITE_TAC[LT_REFL] THEN SIMP_TAC[]]; + (* Inductive step: properties of G(SUC n) *) + SUBGOAL_THEN + `FST((G:num->real#real) n) < FST(G(SUC n)) /\ + SND(G(SUC n)) < SND(G n) /\ + FST(G(SUC n)) < SND(G(SUC n)) /\ + (f:real->real)(SND(G(SUC n))) - f(FST(G(SUC n))) < + inv(&(SUC(SUC n)))` + MP_TAC THENL + [SUBGOAL_THEN + `?v:real#real. FST((G:num->real#real) n) < FST v /\ + SND v < SND(G n) /\ FST v < SND v /\ + (f:real->real)(SND v) - f(FST v) < + inv(&(SUC(SUC n)))` + (fun th -> MP_TAC(SELECT_RULE th)) THENL + [MP_TAC(ISPECL [`f:real->real`; + `FST((G:num->real#real) n)`; + `SND((G:num->real#real) n)`; + `SUC n`] MONOTONE_SMALL_OSC_SUBINTERVAL) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [EXPAND_TAC "P" THEN EXPAND_TAC "Q" THEN REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + DISCH_THEN(X_CHOOSE_THEN `p:real` + (X_CHOOSE_THEN `q:real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `(p:real,q:real)` THEN ASM_REWRITE_TAC[FST; SND]]; + FIRST_X_ASSUM(fun th -> + REWRITE_TAC[GSYM(BETA_RULE(SPEC `n:num` (CONJUNCT2 th)))])]; + EXPAND_TAC "P" THEN EXPAND_TAC "Q" THEN REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[LT_0; SUC_SUB1] THEN + ASM_MESON_TAC[REAL_LT_TRANS]]]]; + ALL_TAC] THEN + (* P is increasing and bounded => converges *) + MP_TAC(SPEC `P:num->real` CONVERGENT_REAL_BOUNDED_MONOTONE) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[real_bounded; FORALL_IN_IMAGE; IN_UNIV] THEN + EXISTS_TAC `abs(a') + abs(b') + &1` THEN + GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH + `a' < x /\ x < b' ==> abs(x) <= abs(a') + abs(b') + &1`) THEN + MP_TAC(SPEC `x:num` + (ASSUME `!n. a' < (P:num->real) n /\ (Q:num->real) n < b' /\ + P n < Q n /\ (f:real->real)(Q n) - f(P n) < inv(&(SUC n))`)) THEN + REAL_ARITH_TAC; + DISJ1_TAC THEN GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `c:real`) THEN + EXISTS_TAC `c:real` THEN + (* P m <= P n when m <= n, via TRANSITIVE_STEPWISE_LE *) + SUBGOAL_THEN `!m n. m <= n ==> (P:num->real) m <= P n` ASSUME_TAC THENL + [MATCH_MP_TAC(BETA_RULE(ISPEC `\m n. (P:num->real) m <= P n` + TRANSITIVE_STEPWISE_LE)) THEN + REWRITE_TAC[REAL_LE_REFL] THEN CONJ_TAC THENL + [MESON_TAC[REAL_LE_TRANS]; + GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* P n <= c for all n (increasing seq bounded by limit) *) + SUBGOAL_THEN `!n. (P:num->real) n <= c` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\k:num. (P:num->real)(n + k)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\k. (P:num->real)(n + k)) = (\k. P(k + n))` SUBST1_TAC + THENL [REWRITE_TAC[FUN_EQ_THM; ADD_SYM]; ALL_TAC] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_SEQ_OFFSET) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REWRITE_TAC[LE_0] THEN GEN_TAC THEN + FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC]; + ALL_TAC] THEN + (* Q n <= Q m when m <= n, via TRANSITIVE_STEPWISE_LE *) + SUBGOAL_THEN `!m n. m <= n ==> (Q:num->real) n <= Q m` ASSUME_TAC THENL + [MATCH_MP_TAC(BETA_RULE(ISPEC `\m n. (Q:num->real) n <= Q m` + TRANSITIVE_STEPWISE_LE)) THEN + REWRITE_TAC[REAL_LE_REFL] THEN CONJ_TAC THENL + [MESON_TAC[REAL_LE_TRANS]; + GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* c <= Q n for all n, using REALLIM_UBOUND *) + SUBGOAL_THEN `!n. c <= (Q:num->real) n` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `P:num->real` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `n:num` THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(Q:num->real) k` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]; + FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN - DISCH_THEN(X_CHOOSE_THEN `l:real` - (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN - EXISTS_TAC `s:num->num` THEN ASM_REWRITE_TAC[] THEN - (* Step 2b: The subsequential limit must equal std_normal_cdf x. - Apply CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT to the sub-subsequence. *) - SUBGOAL_THEN `l:real = std_normal_cdf x` SUBST_ALL_TAC THENL - [MP_TAC(ISPECL - [`p:A prob_space`; - `\k:num. (X:num->A->real) ((r:num->num) ((s:num->num) k))`; - `x:real`; `l:real`] - CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT) THEN - BETA_TAC THEN ANTS_TAC THENL - [CONJ_TAC THENL - [GEN_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - CONJ_TAC THENL - [EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - CONJ_TAC THENL - [(* char_fn_re convergence along r o s *) - X_GEN_TAC `t:real` THEN - MP_TAC(ISPECL - [`\n:num. char_fn_re (p:A prob_space) ((X:num->A->real) n) t`; - `exp(--(t pow 2 / &2))`; - `\k:num. (r:num->num) ((s:num->num) k)`] - REALLIM_SUBSEQUENCE) THEN - BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN - ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN - FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN - FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN + (* P n < c (strictly) *) + SUBGOAL_THEN `!n. (P:num->real) n < c` ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[REAL_LT_LE] THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `(P:num->real)(SUC n) <= c` MP_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_MESON_TAC[REAL_NOT_LE]]; + ALL_TAC] THEN + (* c < Q n (strictly) *) + SUBGOAL_THEN `!n. c < (Q:num->real) n` ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[REAL_LT_LE] THEN + ASM_REWRITE_TAC[EQ_SYM_EQ] THEN DISCH_TAC THEN + SUBGOAL_THEN `c <= (Q:num->real)(SUC n)` MP_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_MESON_TAC[REAL_NOT_LE]]; + ALL_TAC] THEN + (* a < c < b *) + SUBGOAL_THEN `a < c /\ c < b` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `a':real` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `(P:num->real) 0` THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]; + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `b':real` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `(Q:num->real) 0` THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* f continuous at c: eps-delta using nested intervals *) + REWRITE_TAC[real_continuous_atreal] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e:real` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `min (c - (P:num->real) N) ((Q:num->real) N - c)` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LT_MIN] THEN + MP_TAC(SPEC `N:num` (ASSUME `!n. (P:num->real) n < c`)) THEN + MP_TAC(SPEC `N:num` (ASSUME `!n. c < (Q:num->real) n`)) THEN + REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `x':real` THEN DISCH_TAC THEN + (* x' is between P N and Q N *) + SUBGOAL_THEN `(P:num->real) N <= x' /\ x' <= (Q:num->real) N` ASSUME_TAC + THENL + [MP_TAC(SPEC `N:num` + (ASSUME `!n. (P:num->real) n < c`)) THEN + MP_TAC(SPEC `N:num` + (ASSUME `!n. c < (Q:num->real) n`)) THEN + UNDISCH_TAC `abs(x' - c) < min (c - (P:num->real) N) (Q N - c)` THEN + REAL_ARITH_TAC; ALL_TAC] THEN + (* f(P N) <= f(x'), f(x') <= f(Q N), f(P N) <= f(c), f(c) <= f(Q N) *) + SUBGOAL_THEN + `(f:real->real)((P:num->real) N) <= f x' /\ f x' <= f((Q:num->real) N) /\ + f((P:num->real) N) <= f c /\ f c <= f((Q:num->real) N)` + STRIP_ASSUME_TAC THENL + [REPEAT CONJ_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[REAL_LT_IMP_LE]; + ALL_TAC] THEN + (* f(Q N) - f(P N) < e via chain *) + SUBGOAL_THEN `(f:real->real)((Q:num->real) N) - f((P:num->real) N) < e` + MP_TAC THENL + [MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&N)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&(SUC N))` THEN CONJ_TAC THENL - [(* char_fn_im convergence along r o s *) - X_GEN_TAC `t:real` THEN - MP_TAC(ISPECL - [`\n:num. char_fn_im (p:A prob_space) ((X:num->A->real) n) t`; - `&0`; - `\k:num. (r:num->num) ((s:num->num) k)`] - REALLIM_SUBSEQUENCE) THEN - BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN - ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN - FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN - FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_REWRITE_TAC[]; - DISCH_TAC THEN ASM_REWRITE_TAC[]]; - ASM_REWRITE_TAC[]]);; + [ASM_MESON_TAC[]; + MATCH_MP_TAC REAL_LT_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC]; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* |f(x') - f(c)| < e from bounds *) + POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN + POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN + REAL_ARITH_TAC);; -(* ========================================================================= *) -(* CENTRAL LIMIT THEOREM - CONVERGENCE IN DISTRIBUTION *) -(* ========================================================================= *) +(* ======================================================================== *) +(* Convergence in distribution *) +(* ======================================================================== *) + +let converges_in_distribution = new_definition + `converges_in_distribution (p:A prob_space) (X:num->A->real) (H:real->real) <=> + (!x. H real_continuous atreal x + ==> ((\n. cdf p (X n) x) ---> H x) sequentially)`;; + +(* IN_PROB_IMP_IN_DIST: convergence in probability implies convergence *) +(* in distribution. Proved at beginning of clt.ml to avoid Camlp5 type *) +(* variable state issue in this 15000+ line file. *) + +(* ======================================================================== *) +(* Sinc function properties (Berry-Esseen Phase 2) *) +(* ======================================================================== *) + +(* The sinc function with removable singularity at 0 *) +(* sinc(t) = if t = 0 then 1 else sin(t)/t *) + +(* Continuity of sinc on any set *) +let SINC_CONTINUOUS = prove + (`!s. (\t. if t = &0 then &1 else sin t / t) real_continuous_on s`, + GEN_TAC THEN REWRITE_TAC[REAL_CONTINUOUS_ON_EQ_CONTINUOUS_WITHIN] THEN + X_GEN_TAC `a:real` THEN DISCH_TAC THEN + ASM_CASES_TAC `a = &0` THENL + [ASM_REWRITE_TAC[REAL_CONTINUOUS_WITHINREAL; REALLIM_WITHINREAL] THEN + MP_TAC REALLIM_SIN_OVER_X THEN REWRITE_TAC[REALLIM_ATREAL] THEN + MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `e:real` THEN + MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN + MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `d:real` THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:real` THEN STRIP_TAC THEN + SUBGOAL_THEN `~(x = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_SIMP_TAC[]]; + MATCH_MP_TAC(ISPEC `(\t. sin t / t)` + REAL_CONTINUOUS_TRANSFORM_WITHINREAL) THEN + EXISTS_TAC `abs(a:real)` THEN + ASM_REWRITE_TAC[REAL_ABS_POS; GSYM REAL_ABS_NZ] THEN CONJ_TAC THENL + [X_GEN_TAC `x:real` THEN STRIP_TAC THEN + COND_CASES_TAC THENL [ASM_REAL_ARITH_TAC; REFL_TAC]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_WITHINREAL THEN + REWRITE_TAC[REAL_CONTINUOUS_WITHIN_SIN; + REAL_CONTINUOUS_WITHIN_ID] THEN + ASM_REWRITE_TAC[]]]);; + +(* Pointwise bound: |sinc(t)| <= 1 *) +let SINC_BOUND = prove + (`!t. abs(if t = &0 then &1 else sin t / t) <= &1`, + GEN_TAC THEN COND_CASES_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_DIV] THEN + SUBGOAL_THEN `&0 < abs t` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + REWRITE_TAC[REAL_MUL_LID; REAL_ABS_SIN_BOUND_LE]);; -(* Characteristic function scaling under division *) -let CHAR_FN_RE_DIV = prove - (`!p:A prob_space (X:A->real) c t. - char_fn_re p (\x. X x / c) t = char_fn_re p X (t / c)`, - REPEAT GEN_TAC THEN REWRITE_TAC[char_fn_re; real_div] THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN - GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; +(* Integrability of sinc on [0, u] *) +let SINC_INTEGRABLE = prove + (`!u. &0 <= u ==> + (\t. if t = &0 then &1 else sin t / t) + real_integrable_on real_interval[&0, u]`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_SUBSET THEN + EXISTS_TAC `(:real)` THEN + REWRITE_TAC[SUBSET_UNIV; SINC_CONTINUOUS]);; -let CHAR_FN_IM_DIV = prove - (`!p:A prob_space (X:A->real) c t. - char_fn_im p (\x. X x / c) t = char_fn_im p X (t / c)`, - REPEAT GEN_TAC THEN REWRITE_TAC[char_fn_im; real_div] THEN - AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN - GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; +(* Integral of 1/t on [1, u] equals log(u) *) +let INTEGRAL_INV_1_T = prove + (`!u. &1 <= u ==> + ((\t. inv t) has_real_integral (log u)) (real_interval[&1, u])`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `log u = log u - log(&1)` SUBST1_TAC THENL + [REWRITE_TAC[LOG_1; REAL_SUB_RZERO]; ALL_TAC] THEN + MATCH_MP_TAC REAL_FUNDAMENTAL_THEOREM_OF_CALCULUS THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:real` THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN + STRIP_TAC THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_ATREAL_WITHIN THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_LOG THEN ASM_REAL_ARITH_TAC);; -(* Simple RV closure under division *) -let SIMPLE_RV_DIV = prove - (`!p:A prob_space X c. - simple_rv p X ==> simple_rv p (\x. X x / c)`, +(* Logarithmic bound on integral of |sinc| *) +let SINC_ABS_INTEGRAL_BOUND_LOG = prove + (`!u. &1 <= u ==> + real_integral (real_interval[&0, u]) + (\t. abs(if t = &0 then &1 else sin t / t)) <= &1 + log u`, REPEAT STRIP_TAC THEN - SUBGOAL_THEN `(\x:A. (X:A->real) x / c) = (\x. inv(c) * X x)` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN REAL_ARITH_TAC; - MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]]);; + ABBREV_TAC `sinc = \t. abs(if t = &0 then &1 else sin t / t)` THEN + SUBGOAL_THEN `sinc real_continuous_on (:real)` ASSUME_TAC THENL + [EXPAND_TAC "sinc" THEN MATCH_MP_TAC REAL_CONTINUOUS_ON_ABS THEN + REWRITE_TAC[SINC_CONTINUOUS]; ALL_TAC] THEN + SUBGOAL_THEN `sinc real_integrable_on real_interval[&0,u]` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + ASM_MESON_TAC[REAL_CONTINUOUS_ON_SUBSET; SUBSET_UNIV]; ALL_TAC] THEN + SUBGOAL_THEN `real_integral (real_interval[&0,u]) sinc = + real_integral (real_interval[&0,&1]) sinc + + real_integral (real_interval[&1,u]) sinc` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM REAL_INTEGRAL_COMBINE) THEN + ASM_REWRITE_TAC[REAL_LE_01]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [(* Bound on [0,1]: sinc <= 1, length 1 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_integral (real_interval[&0,&1]) (\t:real. &1)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_LE THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + ASM_MESON_TAC[REAL_CONTINUOUS_ON_SUBSET; SUBSET_UNIV]; ALL_TAC] THEN + CONJ_TAC THENL [REWRITE_TAC[REAL_INTEGRABLE_CONST]; ALL_TAC] THEN + REWRITE_TAC[IN_REAL_INTERVAL] THEN REPEAT STRIP_TAC THEN + EXPAND_TAC "sinc" THEN REWRITE_TAC[SINC_BOUND]; + SIMP_TAC[REAL_INTEGRAL_CONST; REAL_LE_01] THEN REAL_ARITH_TAC]; + (* Bound on [1,u]: sinc(t) <= 1/t, integral = ln(u) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_integral (real_interval[&1,u]) (\t. inv t)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_LE THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + ASM_MESON_TAC[REAL_CONTINUOUS_ON_SUBSET; SUBSET_UNIV]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_CONTINUOUS THEN + MATCH_MP_TAC REAL_CONTINUOUS_ON_INV THEN + REWRITE_TAC[REAL_CONTINUOUS_ON_ID] THEN + REWRITE_TAC[IN_REAL_INTERVAL] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_REAL_INTERVAL] THEN + X_GEN_TAC `t:real` THEN STRIP_TAC THEN + EXPAND_TAC "sinc" THEN + SUBGOAL_THEN `~(t = &0)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_DIV; real_div] THEN + SUBGOAL_THEN `abs t = t` SUBST1_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [MP_TAC(SPEC `t:real` SIN_BOUND) THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC]; + SUBGOAL_THEN + `real_integral (real_interval[&1,u]) (\t. inv t) = log u` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + MATCH_MP_TAC INTEGRAL_INV_1_T THEN ASM_REWRITE_TAC[]]]);; -let SIMPLE_RV_SUM_DIV = prove - (`!p:A prob_space (X:num->A->real) n c. - (!k. simple_rv p (X k)) - ==> simple_rv p (\a. sum(0..n) (\i. X i a) / c)`, - REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_RV_DIV THEN - MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_REWRITE_TAC[]);; +(* ------------------------------------------------------------------------- *) +(* Trig polynomial expectation decomposition for Berry-Esseen. *) +(* E_F[trig_poly] - E_Phi[trig_poly] = sum of char fn errors. *) +(* ------------------------------------------------------------------------- *) -(* CLT: The standardized sum of IID random variables with mean 0 and - finite variance converges in distribution to the standard normal. - This combines CLT_VARIANCE_FORM with SIMPLE_LEVY_CONTINUITY_CLT. *) -let CLT_CONVERGENCE_IN_DISTRIBUTION = prove - (`!p:A prob_space (X:num->A->real). - (!n. simple_rv p (X n)) /\ - (!i. simple_expectation p (X i) = &0) /\ - &0 < simple_variance p (X 0) /\ - (!i. simple_variance p (X i) = simple_variance p (X 0)) /\ - (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ - (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ - char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ - (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> !x. ((\n. simple_cdf p - (\a. sum(0..n) (\i. X i a) / - (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n)))) x) - ---> std_normal_cdf x) sequentially`, +let TRIG_POLY_EXPECTATION_DIFF = prove + (`!p:A prob_space Y (a:num->real) (b:num->real) (freq:num->real) m. + simple_rv p Y + ==> simple_expectation p + (\x. sum(0..m) (\k. a k * cos(freq k * Y x) + + b k * sin(freq k * Y x))) - + real_integral (:real) + (\y. sum(0..m) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y)) * + std_normal_density y) = + sum(0..m) + (\k. a k * (simple_char_fn_re p Y (freq k) - + exp(--(freq k pow 2 / &2))) + + b k * simple_char_fn_im p Y (freq k))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * + (Y:A->real) x) + + (b:num->real) k * sin(freq k * Y x))) = + sum(0..m) (\k. a k * simple_char_fn_re p Y (freq k) + + b k * simple_char_fn_im p Y (freq k))` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\i:num. \x:A. (a:num->real) i * cos((freq:num->real) i * + (Y:A->real) x) + + (b:num->real) i * sin(freq i * Y x)`; + `m:num`] SIMPLE_EXPECTATION_SUM_NUMSEG) THEN + BETA_TAC THEN ANTS_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC SIMPLE_RV_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC SIMPLE_RV_CMUL THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; + `\y:real. cos((freq:num->real) i * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC; + MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; + `\y:real. sin((freq:num->real) i * y)`] + SIMPLE_RV_REAL_COMPOSE) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + X_GEN_TAC `i:num` THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`] + SIMPLE_EXPECTATION_TRIG_TERM) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `real_integral (:real) + (\y:real. sum(0..m) (\k. (a:num->real) k * + cos((freq:num->real) k * y) + + (b:num->real) k * sin(freq k * y)) * + std_normal_density y) = + sum(0..m) (\k. a k * exp(--((freq k) pow 2 / &2)))` + SUBST1_TAC THENL + [MATCH_MP_TAC REAL_INTEGRAL_UNIQUE THEN + REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]; + ALL_TAC] THEN + REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN REAL_ARITH_TAC);; + +let TRIG_POLY_EXPECTATION_DIFF_BOUND = prove + (`!p:A prob_space Y (a:num->real) (b:num->real) (freq:num->real) m. + simple_rv p Y + ==> abs(simple_expectation p + (\x. sum(0..m) (\k. a k * cos(freq k * Y x) + + b k * sin(freq k * Y x))) - + real_integral (:real) + (\y. sum(0..m) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y)) * + std_normal_density y)) + <= sum(0..m) + (\k. abs(a k) * + abs(simple_char_fn_re p Y (freq k) - + exp(--(freq k pow 2 / &2))) + + abs(b k) * abs(simple_char_fn_im p Y (freq k)))`, + REPEAT STRIP_TAC THEN + ASM_SIMP_TAC[TRIG_POLY_EXPECTATION_DIFF] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..m) + (\k. abs((a:num->real) k * + (simple_char_fn_re (p:A prob_space) (Y:A->real) + ((freq:num->real) k) - + exp(--((freq k) pow 2 / &2))) + + (b:num->real) k * simple_char_fn_im p Y (freq k)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; + MATCH_MP_TAC SUM_LE_NUMSEG THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((a:num->real) i * + (simple_char_fn_re (p:A prob_space) (Y:A->real) + ((freq:num->real) i) - + exp(--((freq i) pow 2 / &2)))) + + abs((b:num->real) i * simple_char_fn_im p Y (freq i))` THEN + REWRITE_TAC[REAL_ABS_TRIANGLE; REAL_ABS_MUL; REAL_LE_REFL]]);; + +(* ------------------------------------------------------------------------- *) +(* Quantitative CDF bounds for Berry-Esseen: trapezoidal test functions. *) +(* ------------------------------------------------------------------------- *) + +let CLAMP_LIPSCHITZ = prove + (`!a b:real. + abs(max (&0) (min (&1) a) - max (&0) (min (&1) b)) <= abs(a - b)`, + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC);; + +let TRAPEZOIDAL_CONTINUOUS = prove + (`!x h y:real. &0 < h ==> + (\y. max (&0) (min (&1) (&1 - (y - x) / h))) + real_continuous atreal y`, REPEAT GEN_TAC THEN DISCH_TAC THEN - MP_TAC(ISPECL - [`p:A prob_space`; - `\n:num. \a:A. sum(0..n) (\i. (X:num->A->real) i a) / - (sqrt(simple_variance p (X 0)) * sqrt(&(SUC n)))`] - SIMPLE_LEVY_CONTINUITY_CLT) THEN - BETA_TAC THEN - ANTS_TAC THENL - [FIRST_X_ASSUM(REPEAT_TCL CONJUNCTS_THEN ASSUME_TAC) THEN - ABBREV_TAC `sigma2 = simple_variance (p:A prob_space) ((X:num->A->real) 0)` THEN - REPEAT CONJ_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_SUM_DIV THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[real_continuous_atreal] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + EXISTS_TAC `e * h:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `z:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs((&1 - (z - x) / h) - (&1 - (y - x) / h))` THEN + CONJ_TAC THENL + [MP_TAC(SPECL [`&1 - (z - x) / h`; `&1 - (y - x) / h`] + CLAMP_LIPSCHITZ) THEN SIMP_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ARITH `(&1 - a) - (&1 - b) = b - a`] THEN + REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB; REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(inv h) = inv h` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(z - y:real) * inv h` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC]; + ASM_SIMP_TAC[GSYM real_div; REAL_LT_LDIV_EQ] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REAL_ARITH_TAC]);; + +let SIMPLE_CDF_UPPER_TRAPEZOIDAL = prove + (`!p:A prob_space Y x h. + simple_rv p Y /\ &0 < h + ==> simple_cdf p Y x <= + simple_expectation p + (\a. max (&0) (min (&1) (&1 - (Y a - x) / h)))`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_CDF_LE_EXPECTATION THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THEN X_GEN_TAC `y:real` THEN DISCH_TAC THENL + [SUBGOAL_THEN `(y - x) / h <= &0` ASSUME_TAC THENL + [REWRITE_TAC[real_div] THEN + ONCE_REWRITE_TAC[REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&1 <= &1 - (y - x) / h` MP_TAC THENL + [ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC]; + REAL_ARITH_TAC]);; - (* Bounded second moments for standardized sums: E[S_n^2] <= 2 *) - EXISTS_TAC `&2` THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - X_GEN_TAC `n:num` THEN - SUBGOAL_THEN `&0 < sigma2` ASSUME_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < sqrt sigma2` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < sqrt(&(SUC n))` ASSUME_TAC THENL - [MATCH_MP_TAC SQRT_POS_LT THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; - ALL_TAC] THEN - SUBGOAL_THEN `~(sqrt sigma2 * sqrt(&(SUC n)) = &0)` ASSUME_TAC THENL - [MATCH_MP_TAC (REAL_ARITH `&0 < x ==> ~(x = &0)`) THEN - MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN - `simple_rv (p:A prob_space) (\a:A. sum(0..n) (\i. (X:num->A->real) i a))` - ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\a:A. sum(0..n) (\i. (X:num->A->real) i a)`; - `sqrt sigma2 * sqrt(&(SUC n))`] - SIMPLE_EXPECTATION_POW2_DIV) THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN - SUBGOAL_THEN - `simple_expectation (p:A prob_space) - (\a:A. sum(0..n) (\i. (X:num->A->real) i a)) = &0` - ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`] - SIMPLE_EXPECTATION_SUM_ZERO) THEN - ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN - `simple_expectation (p:A prob_space) - (\x:A. (sum(0..n) (\i. (X:num->A->real) i x)) pow 2) = - simple_variance p (\a. sum(0..n) (\i. X i a))` - SUBST1_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SIMPLE_VARIANCE_MEAN_ZERO THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN - `simple_variance (p:A prob_space) - (\a:A. sum(0..n) (\i. (X:num->A->real) i a)) = &(SUC n) * sigma2` - SUBST1_TAC THENL - [EXPAND_TAC "sigma2" THEN - MATCH_MP_TAC SIMPLE_VARIANCE_SUM_IID THEN - REPEAT CONJ_TAC THENL - [ASM_MESON_TAC[]; - REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_COVARIANCE_INDEP THEN - ASM_MESON_TAC[]; - ASM_MESON_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN - `(sqrt sigma2 * sqrt (&(SUC n))) pow 2 = sigma2 * &(SUC n)` - SUBST1_TAC THENL - [REWRITE_TAC[REAL_POW_MUL] THEN - SUBGOAL_THEN `sqrt sigma2 pow 2 = sigma2` SUBST1_TAC THENL - [MATCH_MP_TAC SQRT_POW_2 THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `sqrt (&(SUC n)) pow 2 = &(SUC n)` SUBST1_TAC THENL - [MATCH_MP_TAC SQRT_POW_2 THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN - REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `&0 < sigma2 * &(SUC n)` ASSUME_TAC THENL - [MATCH_MP_TAC REAL_LT_MUL THEN - ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; +let GAUSSIAN_TRAPEZOIDAL_BOUND = prove + (`!x h. &0 < h + ==> std_normal_cdf x <= + real_integral (:real) + (\y. max (&0) (min (&1) (&1 - (y - x) / h)) * + std_normal_density y) /\ + real_integral (:real) + (\y. max (&0) (min (&1) (&1 - (y - x) / h)) * + std_normal_density y) <= + std_normal_cdf (x + h)`, + REPEAT STRIP_TAC THENL + [MATCH_MP_TAC CDF_LE_INTEGRAL_BOUNDED THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `(y - x) / h <= &0` ASSUME_TAC THENL + [REWRITE_TAC[real_div] THEN + ONCE_REWRITE_TAC[REAL_ARITH `a * b <= &0 <=> &0 <= (--a) * b`] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN - ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN - SUBGOAL_THEN `&(SUC n) * sigma2 = sigma2 * &(SUC n)` SUBST1_TAC THENL - [MESON_TAC[REAL_MUL_SYM]; ALL_TAC] THEN - MATCH_MP_TAC (REAL_ARITH `&0 <= x ==> x <= &2 * x`) THEN - MATCH_MP_TAC REAL_LE_MUL THEN - CONJ_TAC THENL [ASM_REAL_ARITH_TAC; REWRITE_TAC[REAL_POS]]; + SUBGOAL_THEN `&1 <= &1 - (y - x) / h` MP_TAC THENL + [ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC]; + GEN_TAC THEN MATCH_MP_TAC TRAPEZOIDAL_CONTINUOUS THEN + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC INTEGRAL_BOUNDED_LE_CDF THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&1 < (y - x) / h` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LT_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC]; + GEN_TAC THEN MATCH_MP_TAC TRAPEZOIDAL_CONTINUOUS THEN + ASM_REWRITE_TAC[]]]);; + +let STD_NORMAL_CDF_LIPSCHITZ = prove + (`!x y. x <= y + ==> std_normal_cdf y - std_normal_cdf x <= + inv(sqrt(&2 * pi)) * (y - x)`, + REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`x:real`; `y:real`] STD_NORMAL_CDF_INTERVAL) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `(std_normal_cdf x + + real_integral (real_interval [x,y]) std_normal_density) - + std_normal_cdf x = + real_integral (real_interval [x,y]) std_normal_density` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(sqrt(&2 * pi))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC SQRT_POS_LT THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN + REWRITE_TAC[PI_POS]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `abs(real_integral (real_interval [x,y]) std_normal_density)` THEN + CONJ_TAC THENL [REWRITE_TAC[REAL_ABS_LE]; ALL_TAC] THEN + MP_TAC(ISPECL [`std_normal_density`; `x:real`; `y:real`; + `real_integral (real_interval [x,y]) std_normal_density`; + `inv(sqrt(&2 * pi))`] HAS_REAL_INTEGRAL_BOUND) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC REAL_INTEGRABLE_ON_SUBINTERVAL THEN + EXISTS_TAC `(:real)` THEN + REWRITE_TAC[STD_NORMAL_DENSITY_INTEGRABLE; SUBSET_UNIV]; + GEN_TAC THEN REWRITE_TAC[IN_REAL_INTERVAL] THEN DISCH_TAC THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_NONNEG) THEN + MP_TAC(SPEC `x':real` STD_NORMAL_DENSITY_BOUND) THEN + REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]);; - X_GEN_TAC `t:real` THEN EXPAND_TAC "sigma2" THEN - REWRITE_TAC[CHAR_FN_RE_DIV] THEN - MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t:real`] - CLT_VARIANCE_FORM) THEN - ANTS_TAC THENL [ASM_MESON_TAC[]; MESON_TAC[]]; - X_GEN_TAC `t:real` THEN EXPAND_TAC "sigma2" THEN - REWRITE_TAC[CHAR_FN_IM_DIV] THEN - MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t:real`] - CLT_VARIANCE_FORM) THEN - ANTS_TAC THENL [ASM_MESON_TAC[]; MESON_TAC[]]]; - SIMP_TAC[]]);; +(* ------------------------------------------------------------------------- *) +(* Quantitative one-sided CDF bound: F(x) - Phi(x) upper bound. *) +(* Combines CDF sandwich, trig poly approximation, Step C/D bounds, and *) +(* smoothing error from the trapezoidal test function. *) +(* ------------------------------------------------------------------------- *) +let QUANTITATIVE_CDF_UPPER = prove + (`!p:A prob_space Y x h M CC BB e + (nn:num) (a:num->real) (b:num->real) (freq:num->real). + simple_rv p Y /\ &0 < h /\ &0 < M /\ &0 < CC /\ &0 < BB /\ &0 < e /\ + simple_expectation p (\z. Y z pow 2) <= CC /\ + (!y:real. abs(sum(0..nn) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y))) <= BB) /\ + (!y:real. abs(max (&0) (min (&1) (&1 - (y - x) / h))) <= BB) /\ + (!y:real. abs y <= M ==> + abs(max (&0) (min (&1) (&1 - (y - x) / h)) - + sum(0..nn) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y))) < e / &6) + ==> simple_cdf p Y x - std_normal_cdf x <= + sum(0..nn) + (\k. abs(a k) * + abs(simple_char_fn_re p Y (freq k) - + exp(--(freq k pow 2 / &2))) + + abs(b k) * abs(simple_char_fn_im p Y (freq k))) + + (e / &6 + &2 * BB * CC / M pow 2) + + (e / &6 + &2 * BB / M pow 2) + + inv(sqrt(&2 * pi)) * h`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `g_up = \y:real. max (&0) (min (&1) (&1 - (y - x) / h))` THEN + ABBREV_TAC `T' = \y:real. sum(0..nn) (\k. (a:num->real) k * + cos((freq:num->real) k * y) + (b:num->real) k * sin(freq k * y))` THEN + (* Step 1: F(x) <= E_F[g_up] *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((Y:A->real) a)) - std_normal_cdf x` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= b ==> a - c <= b - c`) THEN + EXPAND_TAC "g_up" THEN + MATCH_MP_TAC SIMPLE_CDF_UPPER_TRAPEZOIDAL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Decompose via triangle into 4 terms *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `abs(simple_expectation (p:A prob_space) (\a:A. (g_up:real->real) + ((Y:A->real) a)) - + simple_expectation p (\a. (T':real->real) (Y a))) + + abs(simple_expectation p (\a. T' (Y a)) - + real_integral (:real) (\y. T' y * std_normal_density y)) + + abs(real_integral (:real) (\y. T' y * std_normal_density y) - + real_integral (:real) (\y. g_up y * std_normal_density y)) + + (real_integral (:real) (\y. g_up y * std_normal_density y) - + std_normal_cdf x)` THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + (* Bound Step C: sample approximation error *) + SUBGOAL_THEN + `abs(simple_expectation (p:A prob_space) (\a:A. (g_up:real->real) + ((Y:A->real) a)) - + simple_expectation p (\a. (T':real->real) (Y a))) <= + e / &6 + &2 * BB * CC / M pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `\n:num. (Y:A->real)`; + `g_up:real->real`; `T':real->real`; + `BB:real`; `CC:real`; `e:real`; `M:real`] SIMPLE_STEP_C_BOUND) THEN + BETA_TAC THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [EXPAND_TAC "g_up" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [EXPAND_TAC "T'" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN EXPAND_TAC "T'" THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + DISCH_THEN(MP_TAC o SPEC `0`) THEN SIMP_TAC[]]; + ALL_TAC] THEN + (* Bound char fn error: trig poly expectation difference *) + SUBGOAL_THEN + `abs(simple_expectation (p:A prob_space) (\a:A. (T':real->real) + ((Y:A->real) a)) - + real_integral (:real) (\y. T' y * std_normal_density y)) <= + sum(0..nn) + (\k. abs((a:num->real) k) * + abs(simple_char_fn_re p Y ((freq:num->real) k) - + exp(--((freq k) pow 2 / &2))) + + abs((b:num->real) k) * abs(simple_char_fn_im p Y (freq k)))` + ASSUME_TAC THENL + [EXPAND_TAC "T'" THEN + MATCH_MP_TAC TRIG_POLY_EXPECTATION_DIFF_BOUND THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Bound Step D: Gaussian integral approximation error *) + SUBGOAL_THEN + `abs(real_integral (:real) (\y. (T':real->real) y * std_normal_density y) - + real_integral (:real) (\y. (g_up:real->real) y * std_normal_density y)) <= + e / &6 + &2 * BB / M pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`g_up:real->real`; `T':real->real`; + `BB:real`; `e:real`; `M:real`; + `real_integral (:real) (\y:real. (T':real->real) y * + std_normal_density y)`] STEP_D_BOUND) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_up" THEN + MATCH_MP_TAC TRAPEZOIDAL_CONTINUOUS THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "g_up" THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "T'" THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN EXPAND_TAC "T'" THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "T'" THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `sum(0..nn) (\k. (a:num->real) k * + exp(--((freq:num->real) k pow 2 / &2)))` THEN + REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]]; + SIMP_TAC[]]; + ALL_TAC] THEN + (* Bound smoothing: trapezoidal Gaussian integral vs CDF *) + SUBGOAL_THEN + `real_integral (:real) (\y. (g_up:real->real) y * std_normal_density y) - + std_normal_cdf x <= inv(sqrt(&2 * pi)) * h` ASSUME_TAC THENL + [SUBGOAL_THEN `(\y. (g_up:real->real) y * std_normal_density y) = + (\y. max (&0) (min (&1) (&1 - (y - x) / h)) * std_normal_density y)` + SUBST1_TAC THENL + [EXPAND_TAC "g_up" THEN REFL_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`x:real`; `h:real`] GAUSSIAN_TRAPEZOIDAL_BOUND) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `std_normal_cdf(x + h) - std_normal_cdf x` THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`x:real`; `x + h:real`] STD_NORMAL_CDF_LIPSCHITZ) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_SUB]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; (* ------------------------------------------------------------------------- *) -(* Agreement theorems: general definitions equal simple definitions *) +(* Lower trapezoidal sandwich lemmas for the symmetric CDF bound. *) +(* g_low(y) = max(0, min(1, (x-y)/h)) satisfies I_{y<=x-h} <= g_low <= I. *) (* ------------------------------------------------------------------------- *) -let GEN_CDF_SIMPLE_AGREE = prove - (`!p:A prob_space X x. gen_cdf p X x = simple_cdf p X x`, - REWRITE_TAC[gen_cdf; simple_cdf]);; +let TRAPEZOIDAL_LOWER_CONTINUOUS = prove + (`!x h y:real. &0 < h + ==> (\y. max (&0) (min (&1) ((x - y) / h))) real_continuous atreal y`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[real_continuous_atreal] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + EXISTS_TAC `e * (h:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `w:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs((x - w:real) / h - (x - y) / h)` THEN CONJ_TAC THENL + [MP_TAC(SPECL [`(x - w:real) / h`; `(x - y:real) / h`] CLAMP_LIPSCHITZ) THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[real_div; GSYM REAL_SUB_RDISTRIB] THEN + SUBGOAL_THEN `(x - w) - (x - y:real) = y - w` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(inv h) = inv h` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_REFL] THEN MATCH_MP_TAC REAL_LE_INV THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(y - w:real) = abs(w - y)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_ABS_SUB]; ALL_TAC] THEN + REWRITE_TAC[GSYM real_div] THEN ASM_SIMP_TAC[REAL_LT_LDIV_EQ]);; + +let SIMPLE_CDF_LOWER_TRAPEZOIDAL = prove + (`!p:A prob_space Y x h. + simple_rv p Y /\ &0 < h + ==> simple_expectation p (\a. max (&0) (min (&1) ((x - Y a) / h))) + <= simple_cdf p Y x`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_LE_CDF THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> max (&0) a <= &1`) THEN + REWRITE_TAC[REAL_MIN_MIN] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 <= min (&1) a`) THEN + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_MUL THEN + CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN ASM_REAL_ARITH_TAC]; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_MAX_LE] THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN ASM_REAL_ARITH_TAC]]);; -(* Agreement: gen_char_fn_re = char_fn_re for simple RVs *) -let GEN_CHAR_FN_RE_SIMPLE = prove - (`!p:A prob_space X t. simple_rv p X ==> gen_char_fn_re p X t = char_fn_re p X t`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_re; char_fn_re] THEN - MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN - MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]);; +let GAUSSIAN_TRAPEZOIDAL_LOWER_BOUND = prove + (`!x h. &0 < h + ==> std_normal_cdf(x - h) <= + real_integral (:real) + (\y. max (&0) (min (&1) ((x - y) / h)) * std_normal_density y) /\ + real_integral (:real) + (\y. max (&0) (min (&1) ((x - y) / h)) * std_normal_density y) <= + std_normal_cdf x`, + REPEAT STRIP_TAC THENL + [MATCH_MP_TAC CDF_LE_INTEGRAL_BOUNDED THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&1 <= (x - y) / h` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC]; + GEN_TAC THEN MATCH_MP_TAC TRAPEZOIDAL_LOWER_CONTINUOUS THEN + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC INTEGRAL_BOUNDED_LE_CDF THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `(x - y) / h < &0` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max; real_min] THEN REAL_ARITH_TAC]; + GEN_TAC THEN MATCH_MP_TAC TRAPEZOIDAL_LOWER_CONTINUOUS THEN + ASM_REWRITE_TAC[]]]);; -(* Agreement: gen_char_fn_im = char_fn_im for simple RVs *) -let GEN_CHAR_FN_IM_SIMPLE = prove - (`!p:A prob_space X t. simple_rv p X ==> gen_char_fn_im p X t = char_fn_im p X t`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_im; char_fn_im] THEN - MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN - MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]);; +(* ------------------------------------------------------------------------- *) +(* Quantitative one-sided CDF bound: Phi(x) - F(x) upper bound. *) +(* Symmetric to QUANTITATIVE_CDF_UPPER using the lower trapezoidal function. *) +(* ------------------------------------------------------------------------- *) -(* General CLT: stated with general definitions, reduces to simple CLT *) -let GENERAL_CLT = prove - (`!p:A prob_space (X:num->A->real). - (!n. simple_rv p (X n)) /\ - (!i. expectation p (X i) = &0) /\ - &0 < variance p (X 0) /\ - (!i. variance p (X i) = variance p (X 0)) /\ - (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ - (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> !x. ((\n. gen_cdf p - (\a. sum(0..n) (\i. X i a) / - (sqrt(variance p (X 0)) * sqrt(&(SUC n)))) x) - ---> std_normal_cdf x) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Rewrite gen_cdf to simple_cdf *) - REWRITE_TAC[GEN_CDF_SIMPLE_AGREE] THEN - (* Rewrite variance to simple_variance *) - SUBGOAL_THEN `variance (p:A prob_space) ((X:num->A->real) 0) = - simple_variance p (X 0)` SUBST1_TAC THENL - [MATCH_MP_TAC VARIANCE_SIMPLE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Apply the simple CLT *) - MATCH_MP_TAC CLT_CONVERGENCE_IN_DISTRIBUTION THEN - (* Establish intermediate agreement facts *) - SUBGOAL_THEN `!i:num. simple_expectation (p:A prob_space) - ((X:num->A->real) i) = expectation p (X i)` ASSUME_TAC THENL - [GEN_TAC THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; +let QUANTITATIVE_CDF_LOWER = prove + (`!p:A prob_space Y x h M CC BB e + (nn:num) (a:num->real) (b:num->real) (freq:num->real). + simple_rv p Y /\ &0 < h /\ &0 < M /\ &0 < CC /\ &0 < BB /\ &0 < e /\ + simple_expectation p (\z. Y z pow 2) <= CC /\ + (!y:real. abs(sum(0..nn) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y))) <= BB) /\ + (!y:real. abs(max (&0) (min (&1) ((x - y) / h))) <= BB) /\ + (!y:real. abs y <= M ==> + abs(max (&0) (min (&1) ((x - y) / h)) - + sum(0..nn) (\k. a k * cos(freq k * y) + + b k * sin(freq k * y))) < e / &6) + ==> std_normal_cdf x - simple_cdf p Y x <= + sum(0..nn) + (\k. abs(a k) * + abs(simple_char_fn_re p Y (freq k) - + exp(--(freq k pow 2 / &2))) + + abs(b k) * abs(simple_char_fn_im p Y (freq k))) + + (e / &6 + &2 * BB * CC / M pow 2) + + (e / &6 + &2 * BB / M pow 2) + + inv(sqrt(&2 * pi)) * h`, + REPEAT STRIP_TAC THEN + ABBREV_TAC `g_low = \y:real. max (&0) (min (&1) ((x - y) / h))` THEN + ABBREV_TAC `T' = \y:real. sum(0..nn) (\k. (a:num->real) k * + cos((freq:num->real) k * y) + (b:num->real) k * sin(freq k * y))` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `std_normal_cdf x - + simple_expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((Y:A->real) a))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= b ==> c - b <= c - a`) THEN + EXPAND_TAC "g_low" THEN + MATCH_MP_TAC SIMPLE_CDF_LOWER_TRAPEZOIDAL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `!i:num. simple_variance (p:A prob_space) - ((X:num->A->real) i) = variance p (X i)` ASSUME_TAC THENL - [GEN_TAC THEN CONV_TAC SYM_CONV THEN - MATCH_MP_TAC VARIANCE_SIMPLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `abs(simple_expectation (p:A prob_space) (\a:A. (g_low:real->real) + ((Y:A->real) a)) - + simple_expectation p (\a. (T':real->real) (Y a))) + + abs(simple_expectation p (\a. T' (Y a)) - + real_integral (:real) (\y. T' y * std_normal_density y)) + + abs(real_integral (:real) (\y. T' y * std_normal_density y) - + real_integral (:real) (\y. g_low y * std_normal_density y)) + + (std_normal_cdf x - + real_integral (:real) (\y. g_low y * std_normal_density y))` THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs(simple_expectation (p:A prob_space) (\a:A. (g_low:real->real) + ((Y:A->real) a)) - + simple_expectation p (\a. (T':real->real) (Y a))) <= + e / &6 + &2 * BB * CC / M pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `\n:num. (Y:A->real)`; + `g_low:real->real`; `T':real->real`; + `BB:real`; `CC:real`; `e:real`; `M:real`] SIMPLE_STEP_C_BOUND) THEN + BETA_TAC THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [EXPAND_TAC "g_low" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [EXPAND_TAC "T'" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN EXPAND_TAC "T'" THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + DISCH_THEN(MP_TAC o SPEC `0`) THEN SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `abs(simple_expectation (p:A prob_space) (\a:A. (T':real->real) + ((Y:A->real) a)) - + real_integral (:real) (\y. T' y * std_normal_density y)) <= + sum(0..nn) + (\k. abs((a:num->real) k) * + abs(simple_char_fn_re p Y ((freq:num->real) k) - + exp(--((freq k) pow 2 / &2))) + + abs((b:num->real) k) * abs(simple_char_fn_im p Y (freq k)))` + ASSUME_TAC THENL + [EXPAND_TAC "T'" THEN + MATCH_MP_TAC TRIG_POLY_EXPECTATION_DIFF_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `!i:num t:real. - char_fn_re (p:A prob_space) ((X:num->A->real) i) t = - gen_char_fn_re p (X i) t /\ - char_fn_im p (X i) t = gen_char_fn_im p (X i) t` ASSUME_TAC THENL - [REPEAT GEN_TAC THEN CONJ_TAC THENL - [CONV_TAC SYM_CONV THEN MATCH_MP_TAC GEN_CHAR_FN_RE_SIMPLE THEN - ASM_REWRITE_TAC[]; - CONV_TAC SYM_CONV THEN MATCH_MP_TAC GEN_CHAR_FN_IM_SIMPLE THEN - ASM_REWRITE_TAC[]]; + SUBGOAL_THEN + `abs(real_integral (:real) (\y. (T':real->real) y * std_normal_density y) - + real_integral (:real) (\y. (g_low:real->real) y * std_normal_density y)) <= + e / &6 + &2 * BB / M pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`g_low:real->real`; `T':real->real`; + `BB:real`; `e:real`; `M:real`; + `real_integral (:real) (\y:real. (T':real->real) y * + std_normal_density y)`] STEP_D_BOUND) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_low" THEN + MATCH_MP_TAC TRAPEZOIDAL_LOWER_CONTINUOUS THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "g_low" THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "T'" THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN EXPAND_TAC "T'" THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + EXPAND_TAC "T'" THEN + MATCH_MP_TAC REAL_INTEGRABLE_INTEGRAL THEN + MATCH_MP_TAC HAS_REAL_INTEGRAL_INTEGRABLE THEN + EXISTS_TAC `sum(0..nn) (\k. (a:num->real) k * + exp(--((freq:num->real) k pow 2 / &2)))` THEN + REWRITE_TAC[GAUSSIAN_INTEGRAL_TRIG_POLY]]; + SIMP_TAC[]]; ALL_TAC] THEN - REPEAT CONJ_TAC THENL - [ASM_REWRITE_TAC[]; - GEN_TAC THEN ASM_MESON_TAC[]; - ASM_MESON_TAC[]; - GEN_TAC THEN ASM_MESON_TAC[]; - ASM_REWRITE_TAC[]; - REPEAT GEN_TAC THEN ASM_MESON_TAC[]; - ASM_REWRITE_TAC[]]);; - + SUBGOAL_THEN + `std_normal_cdf x - + real_integral (:real) (\y. (g_low:real->real) y * std_normal_density y) <= + inv(sqrt(&2 * pi)) * h` ASSUME_TAC THENL + [SUBGOAL_THEN `(\y. (g_low:real->real) y * std_normal_density y) = + (\y. max (&0) (min (&1) ((x - y) / h)) * std_normal_density y)` + SUBST1_TAC THENL + [EXPAND_TAC "g_low" THEN REFL_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`x:real`; `h:real`] GAUSSIAN_TRAPEZOIDAL_LOWER_BOUND) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `std_normal_cdf x - std_normal_cdf(x - h)` THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`x - h:real`; `x:real`] STD_NORMAL_CDF_LIPSCHITZ) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_SUB2]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; diff --git a/Probability/clt.ml b/Probability/clt.ml index 6e396084..c48026e5 100644 --- a/Probability/clt.ml +++ b/Probability/clt.ml @@ -10,6 +10,206 @@ needs "Probability/characteristic_functions.ml";; +(* ========================================================================= *) +(* Convergence in probability implies convergence in distribution *) +(* ========================================================================= *) + +let IN_PROB_IMP_IN_DIST = prove + (`!(p:A prob_space) (X:num->A->real) (L:A->real). + (!n:num. random_variable p (X n)) /\ + random_variable p L /\ + converges_in_prob p X L + ==> !x:real. + (\y. cdf p L y) real_continuous atreal x + ==> ((\n. cdf p (X n) x) ---> cdf p L x) + sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + X_GEN_TAC `x:real` THEN + REWRITE_TAC[real_continuous_atreal] THEN DISCH_TAC THEN + REWRITE_TAC[tendsto_real; EVENTUALLY_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(e:real) / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `d0:real` STRIP_ASSUME_TAC) THEN + ABBREV_TAC `d = (d0:real) / &2` THEN + (SUBGOAL_THEN `&0 < (d:real) /\ d < d0` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "d" THEN ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN + `abs(cdf (p:A prob_space) (L:A->real) (x + d) - + cdf p L x) < e / &2 /\ + abs(cdf p L (x - d) - cdf p L x) < e / &2` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `(x:real) + d`) THEN + MATCH_MP_TAC(TAUT `a ==> (a ==> b) ==> b`) THEN + ASM_REAL_ARITH_TAC; + FIRST_X_ASSUM(MP_TAC o SPEC `(x:real) - d`) THEN + MATCH_MP_TAC(TAUT `a ==> (a ==> b) ==> b`) THEN + ASM_REAL_ARITH_TAC]; + ALL_TAC]) THEN + FIRST_X_ASSUM + (MP_TAC o GEN_REWRITE_RULE I [converges_in_prob]) THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[tendsto_real; EVENTUALLY_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `(e:real) / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `N:num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (* sg4: {a | abs(Xn a - L a) >= d} is an event *) + (SUBGOAL_THEN + `{a:A | a IN prob_carrier p /\ + abs((X:num->A->real) n a - (L:A->real) a) >= d} + IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC ABS_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC]) THEN + (* pn_bounds: establish before sg1/sg2 so FIRST_X_ASSUM *) + (* picks the convergence bound, not sg2 which is !m:num *) + ABBREV_TAC + `pn = prob (p:A prob_space) + {a:A | a IN prob_carrier p /\ + abs((X:num->A->real) n a - + (L:A->real) a) >= d}` THEN + (SUBGOAL_THEN `&0 <= (pn:real) /\ pn < e / &2` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN + ASM_MESON_TAC[REAL_LET_TRANS; + REAL_ARITH `abs x < e ==> x < e`]; + ALL_TAC]) THEN + (* Establish measurability *) + (SUBGOAL_THEN + `!y. {a:A | a IN prob_carrier p /\ + (L:A->real) a <= y} + IN prob_events p` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM random_variable] THEN + ASM_REWRITE_TAC[]; + ALL_TAC]) THEN + (SUBGOAL_THEN + `!m:num. + {a:A | a IN prob_carrier p /\ + (X:num->A->real) m a <= x} + IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(REWRITE_RULE[random_variable; ETA_AX] + (SPEC `m:num` + (ASSUME `!n:num. random_variable (p:A prob_space) + ((X:num->A->real) n)`))) THEN + DISCH_THEN(MP_TAC o SPEC `x:real`) THEN + REWRITE_TAC[]; + ALL_TAC]) THEN + (* sg5: cdf(Xn,x) <= cdf(L,x+d) + pn *) + (SUBGOAL_THEN + `cdf (p:A prob_space) ((X:num->A->real) n) x <= + cdf p (L:A->real) (x + d) + pn` + ASSUME_TAC THENL + [REWRITE_TAC[cdf] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `prob (p:A prob_space) + ({a:A | a IN prob_carrier p /\ + (L:A->real) a <= x + d} UNION + {a | a IN prob_carrier p /\ + abs((X:num->A->real) n a - + L a) >= d})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN + ASM_SIMP_TAC[]; + REWRITE_TAC[SUBSET; IN_UNION; IN_ELIM_THM] THEN + X_GEN_TAC `a:A` THEN STRIP_TAC THEN + ASM_CASES_TAC + `abs((X:num->A->real) n a - + (L:A->real) a) >= d` THENL + [DISJ2_TAC THEN ASM_REWRITE_TAC[]; + DISJ1_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `prob (p:A prob_space) + {a:A | a IN prob_carrier p /\ + (L:A->real) a <= x + d} + + prob p + {a | a IN prob_carrier p /\ + abs((X:num->A->real) n a - + L a) >= d}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_SUBADDITIVE THEN + ASM_SIMP_TAC[]; + ASM_REWRITE_TAC[REAL_LE_REFL]]]; + ALL_TAC]) THEN + (* sg6: cdf(L,x-d) - pn <= cdf(Xn,x) *) + (SUBGOAL_THEN + `cdf (p:A prob_space) (L:A->real) (x - d) - pn <= + cdf p ((X:num->A->real) n) x` + ASSUME_TAC THENL + [REWRITE_TAC[cdf] THEN + REWRITE_TAC[REAL_ARITH `a - b <= c <=> a <= c + b`] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `prob (p:A prob_space) + ({a:A | a IN prob_carrier p /\ + (X:num->A->real) n a <= x} UNION + {a | a IN prob_carrier p /\ + abs(X n a - + (L:A->real) a) >= d})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN + ASM_SIMP_TAC[]; + REWRITE_TAC[SUBSET; IN_UNION; IN_ELIM_THM] THEN + X_GEN_TAC `a:A` THEN STRIP_TAC THEN + ASM_CASES_TAC + `abs((X:num->A->real) n a - + (L:A->real) a) >= d` THENL + [DISJ2_TAC THEN ASM_REWRITE_TAC[]; + DISJ1_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `prob (p:A prob_space) + {a:A | a IN prob_carrier p /\ + (X:num->A->real) n a <= x} + + prob p + {a | a IN prob_carrier p /\ + abs(X n a - + (L:A->real) a) >= d}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_SUBADDITIVE THEN + ASM_SIMP_TAC[]; + ASM_REWRITE_TAC[REAL_LE_REFL]]]; + ALL_TAC]) THEN + (* Final: combine sg3, sg5, sg6, pn_bounds *) + UNDISCH_TAC + `cdf (p:A prob_space) ((X:num->A->real) n) x <= + cdf p (L:A->real) (x + d) + pn` THEN + UNDISCH_TAC + `cdf (p:A prob_space) (L:A->real) (x - d) - pn <= + cdf p ((X:num->A->real) n) x` THEN + UNDISCH_TAC + `abs(cdf (p:A prob_space) (L:A->real) (x + d) - + cdf p L x) < e / &2` THEN + UNDISCH_TAC + `abs(cdf (p:A prob_space) (L:A->real) (x - d) - + cdf p L x) < e / &2` THEN + UNDISCH_TAC `(pn:real) < e / &2` THEN + REAL_ARITH_TAC);; + (* ========================================================================= *) (* Phase 19: Characteristic function bounds for integrable RVs *) (* ========================================================================= *) @@ -24,13 +224,13 @@ let COS_LOWER_BOUND = prove (`!x. &1 - x pow 2 / &2 <= cos(x)`, GEN_TAC THEN MP_TAC(SPEC `x:real` ONE_MINUS_COS_LE) THEN REAL_ARITH_TAC);; -(* GEN_CHAR_FN_RE_LOWER_BOUND: E[cos(tX)] >= 1 - t^2 * E[X^2] / 2 *) -let GEN_CHAR_FN_RE_LOWER_BOUND = prove +(* CHAR_FN_RE_LOWER_BOUND: E[cos(tX)] >= 1 - t^2 * E[X^2] / 2 *) +let CHAR_FN_RE_LOWER_BOUND = prove (`!p:A prob_space X t. integrable p X /\ integrable p (\x. X x pow 2) ==> &1 - t pow 2 * expectation p (\x. X x pow 2) / &2 - <= gen_char_fn_re p X t`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_re] THEN + <= char_fn_re p X t`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re] THEN SUBGOAL_THEN `&1 - t pow 2 * expectation p (\x. (X:A->real) x pow 2) / &2 = expectation p (\x. &1 - t pow 2 * X x pow 2 / &2)` SUBST1_TAC THENL [SUBGOAL_THEN `random_variable p (X:A->real)` ASSUME_TAC THENL @@ -64,12 +264,12 @@ let GEN_CHAR_FN_RE_LOWER_BOUND = prove MP_TAC(SPEC `t * (X:A->real) x` COS_LOWER_BOUND) THEN REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC]);; -(* GEN_CHAR_FN_RE_UPPER_BOUND: gen_char_fn_re p X t <= 1 *) -let GEN_CHAR_FN_RE_UPPER_BOUND = prove +(* CHAR_FN_RE_UPPER_BOUND: char_fn_re p X t <= 1 *) +let CHAR_FN_RE_UPPER_BOUND = prove (`!p:A prob_space X t. integrable p X /\ integrable p (\x. X x pow 2) - ==> gen_char_fn_re p X t <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_re] THEN + ==> char_fn_re p X t <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re] THEN SUBGOAL_THEN `&1 = expectation (p:A prob_space) (\x:A. &1)` SUBST1_TAC THENL [REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL @@ -128,9 +328,8 @@ let TIGHTNESS_FROM_SECOND_MOMENTS = prove SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ abs((X:num->A->real) n a) >= M} = {a | a IN prob_carrier p /\ X n a >= M} UNION {a | a IN prob_carrier p /\ --(X n a) >= M}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM] THEN GEN_TAC THEN - ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH + `!x t:real. abs x >= t <=> x >= t \/ --x >= t`]; MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THENL [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; @@ -1100,115 +1299,6 @@ let SIMPLE_RV_ABS_BOUNDED = prove FIRST_X_ASSUM MATCH_MP_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `w:A` THEN ASM_REWRITE_TAC[]);; -(* MCT with integrable limit instead of bounded limit *) -let MCT_NN_EXPECTATION = prove - (`!p:A prob_space gn f. - (!n. random_variable p (gn n)) /\ - (!n x. x IN prob_carrier p ==> &0 <= gn n x) /\ - (!n x. x IN prob_carrier p ==> gn n x <= gn (SUC n) x) /\ - (!x. x IN prob_carrier p ==> ((\n. gn n x) ---> f x) sequentially) /\ - (!x. x IN prob_carrier p ==> &0 <= f x) /\ - integrable p f - ==> ((\n. nn_expectation p (gn n)) ---> nn_expectation p f) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN - DISCH_TAC THEN - (* gn n <= f pointwise *) - SUBGOAL_THEN `!n (x:A). x IN prob_carrier p ==> - (gn:num->A->real) n x <= f x` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN - MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN - EXISTS_TAC `\n. (gn:num->A->real) n x` THEN - ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `n:num` THEN REPEAT STRIP_TAC THEN - MP_TAC(ISPECL [`gn:num->A->real`; `prob_carrier (p:A prob_space)`] - MONO_SEQ_LE) THEN ASM_SIMP_TAC[]; ALL_TAC] THEN - (* nn_exp(gn n) <= nn_exp(f) *) - SUBGOAL_THEN `!n. nn_expectation (p:A prob_space) ((gn:num->A->real) n) <= - nn_expectation p f` ASSUME_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN - ASM_SIMP_TAC[]; ALL_TAC] THEN - (* nn_exp(gn n) is monotonically increasing *) - SUBGOAL_THEN `!m n. m <= n ==> - nn_expectation (p:A prob_space) ((gn:num->A->real) m) <= - nn_expectation p (gn n)` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN - ASM_SIMP_TAC[] THEN CONJ_TAC THENL - [REPEAT STRIP_TAC THEN - MP_TAC(ISPECL [`gn:num->A->real`; `prob_carrier (p:A prob_space)`] - MONO_SEQ_LE) THEN ASM_SIMP_TAC[]; - MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `f:A->real` THEN - ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= abs y`) THEN - ASM_SIMP_TAC[]]; ALL_TAC] THEN - (* Use NN_EXPECTATION_MIN_LIMIT: for large enough k, nn_exp(min(f,k)) > nn_exp(f) - e/2 *) - MP_TAC(SPECL [`p:A prob_space`; `f:A->real`] NN_EXPECTATION_MIN_LIMIT) THEN - ASM_REWRITE_TAC[] THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN - ASM_SIMP_TAC[REAL_HALF] THEN - DISCH_THEN(X_CHOOSE_THEN `K:num` STRIP_ASSUME_TAC) THEN - (* For this K: nn_exp(min(f, &K)) > nn_exp(f) - e/2 *) - SUBGOAL_THEN `nn_expectation (p:A prob_space) (f:A->real) - e / &2 < - nn_expectation p (\x. min (f x) (&K))` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `K:num`) THEN REWRITE_TAC[LE_REFL] THEN - REAL_ARITH_TAC; ALL_TAC] THEN - (* Use MCT_NN_EXPECTATION_RV for bounded min(gn,K) -> min(f,K) *) - MP_TAC(ISPECL [`p:A prob_space`; - `\n (x:A). min ((gn:num->A->real) n x) (&K)`; - `\x:A. min ((f:A->real) x) (&K)`; `&K`] MCT_NN_EXPECTATION_RV) THEN - BETA_TAC THEN ANTS_TAC THENL - [REPEAT CONJ_TAC THENL - [(* random_variable min(gn n, K) *) - GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - REWRITE_TAC[ETA_AX; RANDOM_VARIABLE_CONST] THEN ASM_REWRITE_TAC[]; - (* nonneg *) - REPEAT STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - (* monotone *) - REPEAT STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH `a <= b ==> min a c <= min b c`) THEN - ASM_SIMP_TAC[]; - (* pointwise convergence *) - X_GEN_TAC `x:A` THEN DISCH_TAC THEN - MATCH_MP_TAC REALLIM_MIN THEN CONJ_TAC THENL - [ASM_SIMP_TAC[]; REWRITE_TAC[REALLIM_CONST]]; - (* f nonneg *) - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - (* bounded by K *) - GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN - ASM_SIMP_TAC[REAL_HALF] THEN - DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - (* For n >= N: nn_exp(min(gn n, K)) is close to nn_exp(min(f, K)) *) - (* And min(gn n, K) <= gn n, so nn_exp(min(gn n, K)) <= nn_exp(gn n) *) - SUBGOAL_THEN - `nn_expectation (p:A prob_space) (\x:A. min ((gn:num->A->real) n x) (&K)) <= - nn_expectation p (gn n)` ASSUME_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_MONO THEN BETA_TAC THEN - ASM_SIMP_TAC[] THEN REPEAT CONJ_TAC THENL - [REPEAT STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - REPEAT STRIP_TAC THEN REAL_ARITH_TAC; - MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `f:A->real` THEN - ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= abs y`) THEN - ASM_SIMP_TAC[]]; ALL_TAC] THEN - SUBGOAL_THEN `abs(nn_expectation (p:A prob_space) (\x:A. min ((gn:num->A->real) n x) (&K)) - - nn_expectation p (\x. min ((f:A->real) x) (&K))) < e / &2` - ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `nn_expectation (p:A prob_space) ((gn:num->A->real) n) <= - nn_expectation p f` ASSUME_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_MONO THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - ASM_REAL_ARITH_TAC);; - (* Truncation of expectation converges *) let EXPECTATION_TRUNCATION_LIMIT = prove (`!p:A prob_space f. @@ -1459,7 +1549,7 @@ let EXPECTATION_TRUNCATION_PRODUCT_LIMIT = prove MP_TAC(ISPECL [`p:A prob_space`; `\n x. min (abs((X:A->real) x)) (&n) * min (abs((Y:A->real) x)) (&n)`; `\x. abs((X:A->real) x * (Y:A->real) x)`] - MCT_NN_EXPECTATION) THEN + MCT_NN_EXPECTATION_INTEGRABLE) THEN BETA_TAC THEN ANTS_TAC THENL [REPEAT CONJ_TAC THENL @@ -1807,19 +1897,19 @@ let EXPECTATION_PRODUCT_COMPOSE_SIMPLE_INDEP = prove (* ========================================================================= *) (* Product formula for gen char fns of independent RVs (real part). - gen_char_fn_re p (X+Y) t = gen_char_fn_re p X t * gen_char_fn_re p Y t - - gen_char_fn_im p X t * gen_char_fn_im p Y t + char_fn_re p (X+Y) t = char_fn_re p X t * char_fn_re p Y t + - char_fn_im p X t * char_fn_im p Y t Proof: Truncate X,Y at +-M to get bounded independent approximations, shift to nonneg, use nsfa + INDEP_RV_NSFA for simple approximations, apply EXPECTATION_PRODUCT_COMPOSE_SIMPLE_INDEP, then bounded convergence. *) -let GEN_CHAR_FN_ADD_INDEP_RE = prove +let CHAR_FN_ADD_INDEP_RE = prove (`!p:A prob_space (X:A->real) (Y:A->real) t. random_variable p X /\ random_variable p Y /\ indep_rv p X Y - ==> gen_char_fn_re p (\x. X x + Y x) t = - gen_char_fn_re p X t * gen_char_fn_re p Y t - - gen_char_fn_im p X t * gen_char_fn_im p Y t`, + ==> char_fn_re p (\x. X x + Y x) t = + char_fn_re p X t * char_fn_re p Y t - + char_fn_im p X t * char_fn_im p Y t`, REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[gen_char_fn_re; gen_char_fn_im] THEN BETA_TAC THEN + REWRITE_TAC[char_fn_re; char_fn_im] THEN BETA_TAC THEN (* Trig identity: cos(t*(X+Y)) = cos(tX)cos(tY) - sin(tX)sin(tY) *) SUBGOAL_THEN `!x:A. cos(t * ((X:A->real) x + (Y:A->real) x)) = @@ -2215,19 +2305,19 @@ let GEN_CHAR_FN_ADD_INDEP_RE = prove MATCH_MP_TAC REALLIM_SIN THEN MATCH_MP_TAC REALLIM_LMUL THEN REWRITE_TAC[REALLIM_TRUNCATION]]]);; -(* GEN_CHAR_FN_ADD_INDEP_IM for integrable (random_variable) RVs. - Derived from GEN_CHAR_FN_ADD_INDEP_RE via a phase shift: +(* CHAR_FN_ADD_INDEP_IM for integrable (random_variable) RVs. + Derived from CHAR_FN_ADD_INDEP_RE via a phase shift: sin(t(X+Y)) = cos(t(X+Y) - pi/2) = cos(tX + t(Y - pi/(2t))) Then apply the RE formula with Y' = Y - pi/(2t) and simplify. *) -let GEN_CHAR_FN_ADD_INDEP_IM = prove +let CHAR_FN_ADD_INDEP_IM = prove (`!p:A prob_space X Y t. random_variable p X /\ random_variable p Y /\ indep_rv p X Y - ==> gen_char_fn_im p (\x. X x + Y x) t = - gen_char_fn_re p X t * gen_char_fn_im p Y t + - gen_char_fn_im p X t * gen_char_fn_re p Y t`, + ==> char_fn_im p (\x. X x + Y x) t = + char_fn_re p X t * char_fn_im p Y t + + char_fn_im p X t * char_fn_re p Y t`, REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_CASES_TAC `t = &0` THENL - [ASM_REWRITE_TAC[gen_char_fn_im; gen_char_fn_re; REAL_MUL_LZERO; + [ASM_REWRITE_TAC[char_fn_im; char_fn_re; REAL_MUL_LZERO; SIN_0; COS_0; EXPECTATION_CONST] THEN REAL_ARITH_TAC; ALL_TAC] THEN (* Define c = -pi/(2*t) and Y' = \x. Y x + c *) @@ -2261,20 +2351,20 @@ let GEN_CHAR_FN_ADD_INDEP_IM = prove `&0`; `c:real`] INDEP_RV_SHIFT) THEN ASM_REWRITE_TAC[REAL_ADD_RID; ETA_AX]; ALL_TAC] THEN - (* Apply GEN_CHAR_FN_ADD_INDEP_RE to X and Y' *) + (* Apply CHAR_FN_ADD_INDEP_RE to X and Y' *) MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `Y':A->real`; `t:real`] - GEN_CHAR_FN_ADD_INDEP_RE) THEN + CHAR_FN_ADD_INDEP_RE) THEN ASM_REWRITE_TAC[] THEN - (* LHS: gen_char_fn_re p (\x. X x + Y' x) t *) + (* LHS: char_fn_re p (\x. X x + Y' x) t *) SUBGOAL_THEN `(\x:A. (X:A->real) x + (Y':A->real) x) = (\x. X x + Y x + c)` SUBST1_TAC THENL [EXPAND_TAC "Y'" THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - (* gen_char_fn_re p (\x. X x + Y x + c) t = gen_char_fn_im p (\x. X x + Y x) t *) - SUBGOAL_THEN `gen_char_fn_re (p:A prob_space) (\x:A. X x + Y x + c) t = - gen_char_fn_im p (\x. X x + Y x) t` SUBST1_TAC THENL - [REWRITE_TAC[gen_char_fn_re; gen_char_fn_im] THEN + (* char_fn_re p (\x. X x + Y x + c) t = char_fn_im p (\x. X x + Y x) t *) + SUBGOAL_THEN `char_fn_re (p:A prob_space) (\x:A. X x + Y x + c) t = + char_fn_im p (\x. X x + Y x) t` SUBST1_TAC THENL + [REWRITE_TAC[char_fn_re; char_fn_im] THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `a:A` THEN SUBGOAL_THEN `t * ((X:A->real) a + (Y:A->real) a + c) = @@ -2285,17 +2375,17 @@ let GEN_CHAR_FN_ADD_INDEP_IM = prove ALL_TAC] THEN REWRITE_TAC[GSYM real_sub] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* RHS: gen_char_fn_re/im of Y' in terms of Y *) - SUBGOAL_THEN `gen_char_fn_re (p:A prob_space) (Y':A->real) t = - gen_char_fn_im p Y t` SUBST1_TAC THENL - [REWRITE_TAC[gen_char_fn_re; gen_char_fn_im] THEN + (* RHS: char_fn_re/im of Y' in terms of Y *) + SUBGOAL_THEN `char_fn_re (p:A prob_space) (Y':A->real) t = + char_fn_im p Y t` SUBST1_TAC THENL + [REWRITE_TAC[char_fn_re; char_fn_im] THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `a:A` THEN EXPAND_TAC "Y'" THEN BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `gen_char_fn_im (p:A prob_space) (Y':A->real) t = - --(gen_char_fn_re p Y t)` SUBST1_TAC THENL - [REWRITE_TAC[gen_char_fn_im; gen_char_fn_re] THEN + SUBGOAL_THEN `char_fn_im (p:A prob_space) (Y':A->real) t = + --(char_fn_re p Y t)` SUBST1_TAC THENL + [REWRITE_TAC[char_fn_im; char_fn_re] THEN SUBGOAL_THEN `(\x:A. sin(t * (Y':A->real) x)) = (\x. --(cos(t * (Y:A->real) x)))` SUBST1_TAC THENL [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `a:A` THEN @@ -2358,12 +2448,19 @@ let COS_TAYLOR_UPPER = prove GEN_TAC THEN MP_TAC(SPEC `x:real` COS_BOUNDS) THEN REAL_ARITH_TAC);; -(* cos(x) - 1 + x^2/2 <= x^4/6 (without abs, using non-negativity) *) +(* COS_APPROX_BOUND: defined in characteristic_functions.ml *) + +(* Corollary: cos(x) - 1 + x^2/2 <= x^4/6 (without abs, using non-negativity) *) let COS_TAYLOR_BOUND_4 = prove (`!x:real. cos x - &1 + x pow 2 / &2 <= x pow 4 / &6`, GEN_TAC THEN MP_TAC(SPEC `x:real` COS_APPROX_BOUND) THEN REAL_ARITH_TAC);; + +(* DOMINATED_CONVERGENCE_NULL moved to expectation.ml *) + + + (* ========================================================================= *) (* Phase 21b: CLT char fn convergence for integrable RVs *) (* Key approach: Only need E[X^2] < inf (no higher moments) via DCT. *) @@ -2434,12 +2531,12 @@ let TAYLOR_REMAINDER_EXPECTATION = prove (`!p:A prob_space (X:A->real) s. integrable p X /\ integrable p (\x. X x pow 2) ==> expectation p (\x. cos(s * X x) - &1 + s pow 2 * X x pow 2 / &2) = - gen_char_fn_re p X s - &1 + + char_fn_re p X s - &1 + s pow 2 * expectation p (\x. X x pow 2) / &2`, REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `random_variable (p:A prob_space) (X:A->real)` ASSUME_TAC THENL [ASM_MESON_TAC[integrable]; ALL_TAC] THEN - REWRITE_TAC[gen_char_fn_re] THEN + REWRITE_TAC[char_fn_re] THEN (* Rewrite as cos(s*X) - (1 - s^2/2*X^2) *) SUBGOAL_THEN `(\x:A. cos(s * (X:A->real) x) - &1 + s pow 2 * X x pow 2 / &2) = @@ -2495,15 +2592,15 @@ let INTEGRABLE_TAYLOR_REMAINDER = prove REWRITE_TAC[INTEGRABLE_CONST] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]);; -(* GEN_CLT_RE_PERTURBATION_VANISHES: +(* CLT_RE_PERTURBATION_VANISHES: The Taylor remainder of the real part of the char fn, scaled by (n+1), converges to 0. This is the key DCT step. Uses: 0 <= cos(z)-1+z^2/2 <= z^4/6, with dominator t^2*X^2/2 *) -let GEN_CLT_RE_PERTURBATION_VANISHES = prove +let CLT_RE_PERTURBATION_VANISHES = prove (`!p:A prob_space (X:A->real) t. integrable p X /\ integrable p (\x. X x pow 2) ==> ((\n. &(SUC n) * - (gen_char_fn_re p X (t / sqrt(&(SUC n))) - &1 + + (char_fn_re p X (t / sqrt(&(SUC n))) - &1 + t pow 2 * expectation p (\x. X x pow 2) / (&2 * &(SUC n)))) ---> &0) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN @@ -2643,16 +2740,16 @@ let GEN_CLT_RE_PERTURBATION_VANISHES = prove MATCH_MP_TAC REALLIM_NULL_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_SUC]]);; -(* GEN_CLT_IM_ERROR_VANISHES: - (n+1) * |gen_char_fn_im(t/sqrt(n+1))| --> 0 when E[X] = 0. +(* CLT_IM_ERROR_VANISHES: + (n+1) * |char_fn_im(t/sqrt(n+1))| --> 0 when E[X] = 0. Uses: |sin(z)-z| <= z^2, so |E[sin(sX)]| = |E[sin(sX)-sX]| <= s^2*E[X^2] - With DCT: (n+1)|gen_char_fn_im(t/sqrt(n+1))| <= t^2*E[X^2] and --> 0 *) -let GEN_CLT_IM_ERROR_VANISHES = prove + With DCT: (n+1)|char_fn_im(t/sqrt(n+1))| <= t^2*E[X^2] and --> 0 *) +let CLT_IM_ERROR_VANISHES = prove (`!p:A prob_space (X:A->real) t. integrable p X /\ integrable p (\x. X x pow 2) /\ expectation p X = &0 ==> ((\n. &(SUC n) * - abs(gen_char_fn_im p X (t / sqrt(&(SUC n))))) + abs(char_fn_im p X (t / sqrt(&(SUC n))))) ---> &0) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `random_variable (p:A prob_space) (X:A->real)` ASSUME_TAC THENL @@ -2668,7 +2765,7 @@ let GEN_CLT_IM_ERROR_VANISHES = prove X_GEN_TAC `n:num` THEN DISCH_TAC THEN BETA_TAC THEN ABBREV_TAC `s = t / sqrt(&(SUC n))` THEN REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM; REAL_ABS_ABS] THEN - REWRITE_TAC[gen_char_fn_im] THEN + REWRITE_TAC[char_fn_im] THEN (* E[sin(sX)] = E[sin(sX)-sX] since E[sX] = s*E[X] = 0 *) SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. sin(s * (X:A->real) x))` ASSUME_TAC THENL @@ -2776,16 +2873,16 @@ let GEN_CLT_IM_ERROR_VANISHES = prove ACCEPT_TAC(ISPECL [`t:real`; `(X:A->real) x`] SIN_SCALED_ERROR_VANISHES)]);; -(* GEN_CHAR_FN_RE_POW_CONV_EXP: - gen_char_fn_re(X, t/sqrt(n+1))^(n+1) --> exp(-t^2*sigma^2/2) - Proof: write gen_char_fn_re(s) = 1 - (c + h(n))/(n+1) where c = t^2*sigma^2/2 - and h(n) = -r(n) --> 0 by GEN_CLT_RE_PERTURBATION_VANISHES. +(* CHAR_FN_RE_POW_CONV_EXP: + char_fn_re(X, t/sqrt(n+1))^(n+1) --> exp(-t^2*sigma^2/2) + Proof: write char_fn_re(s) = 1 - (c + h(n))/(n+1) where c = t^2*sigma^2/2 + and h(n) = -r(n) --> 0 by CLT_RE_PERTURBATION_VANISHES. Apply REALLIM_POW_EXP_NEG_PERTURB. *) -let GEN_CHAR_FN_RE_POW_CONV_EXP = prove +let CHAR_FN_RE_POW_CONV_EXP = prove (`!p:A prob_space (X:A->real) t. integrable p X /\ integrable p (\x. X x pow 2) /\ &0 < expectation p (\x. X x pow 2) - ==> ((\n. gen_char_fn_re p X (t / sqrt(&(SUC n))) pow (SUC n)) + ==> ((\n. char_fn_re p X (t / sqrt(&(SUC n))) pow (SUC n)) ---> exp(--(t pow 2 * expectation p (\x. X x pow 2) / &2))) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN @@ -2795,7 +2892,7 @@ let GEN_CHAR_FN_RE_POW_CONV_EXP = prove (\x:A. (X:A->real) x pow 2)` THEN (* Case t = 0: trivial *) ASM_CASES_TAC `t = &0` THENL - [ASM_SIMP_TAC[real_div; REAL_MUL_LZERO; GEN_CHAR_FN_RE_ZERO; + [ASM_SIMP_TAC[real_div; REAL_MUL_LZERO; CHAR_FN_RE_ZERO; REAL_POW_ONE; REAL_POW_2; REAL_MUL_RZERO; REAL_NEG_0; REAL_EXP_0; REALLIM_CONST]; ALL_TAC] THEN @@ -2808,15 +2905,15 @@ let GEN_CHAR_FN_RE_POW_CONV_EXP = prove MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; ALL_TAC] THEN - (* Define perturbation h(n) = (n+1)*(1 - gen_char_fn_re(s)) - c *) + (* Define perturbation h(n) = (n+1)*(1 - char_fn_re(s)) - c *) ABBREV_TAC `h = \n:num. &(SUC n) * - (&1 - gen_char_fn_re (p:A prob_space) (X:A->real) + (&1 - char_fn_re (p:A prob_space) (X:A->real) (t / sqrt(&(SUC n)))) - c` THEN - (* Transform: gen_char_fn_re^(n+1) = (1-(c+h(n))/(n+1))^(n+1) *) + (* Transform: char_fn_re^(n+1) = (1-(c+h(n))/(n+1))^(n+1) *) MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC `\n. (&1 - (c + (h:num->real) n) / &(SUC n)) pow (SUC n)` THEN CONJ_TAC THENL - [(* Algebraic identity: gen_char_fn_re(s) = 1 - (c+h(n))/(n+1) *) + [(* Algebraic identity: char_fn_re(s) = 1 - (c+h(n))/(n+1) *) MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN BETA_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN EXPAND_TAC "h" THEN BETA_TAC THEN @@ -2826,12 +2923,12 @@ let GEN_CHAR_FN_RE_POW_CONV_EXP = prove ALL_TAC] THEN MATCH_MP_TAC REALLIM_POW_EXP_NEG_PERTURB THEN ASM_REWRITE_TAC[] THEN - (* Show h --> 0 using GEN_CLT_RE_PERTURBATION_VANISHES *) + (* Show h --> 0 using CLT_RE_PERTURBATION_VANISHES *) (* h(n) = -(perturbation sequence) *) EXPAND_TAC "h" THEN EXPAND_TAC "c" THEN MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN EXISTS_TAC `\n. --(&(SUC n) * - (gen_char_fn_re (p:A prob_space) (X:A->real) + (char_fn_re (p:A prob_space) (X:A->real) (t / sqrt(&(SUC n))) - &1 + t pow 2 * sigma2 / (&2 * &(SUC n))))` THEN CONJ_TAC THENL @@ -2846,24 +2943,24 @@ let GEN_CHAR_FN_RE_POW_CONV_EXP = prove ONCE_REWRITE_TAC[GSYM REAL_NEG_0] THEN MATCH_MP_TAC REALLIM_NEG THEN EXPAND_TAC "sigma2" THEN - MATCH_MP_TAC GEN_CLT_RE_PERTURBATION_VANISHES THEN + MATCH_MP_TAC CLT_RE_PERTURBATION_VANISHES THEN ASM_REWRITE_TAC[]);; -(* GEN_CHAR_FN_SUM_IID_RE_BOUND: - |gen_char_fn_re(sum, t) - gen_char_fn_re(X_0, t)^(n+1)| - <= (n+1) * |gen_char_fn_im(X_0, t)| - Inductive: same structure as CHAR_FN_SUM_IID_RE_BOUND but using - GEN_CHAR_FN_ADD_INDEP_RE/IM. *) -let GEN_CHAR_FN_SUM_IID_RE_BOUND = prove +(* CHAR_FN_SUM_IID_RE_BOUND: + |char_fn_re(sum, t) - char_fn_re(X_0, t)^(n+1)| + <= (n+1) * |char_fn_im(X_0, t)| + Inductive: same structure as SIMPLE_CHAR_FN_SUM_IID_RE_BOUND but using + CHAR_FN_ADD_INDEP_RE/IM. *) +let CHAR_FN_SUM_IID_RE_BOUND = prove (`!p:A prob_space (X:num->A->real) n t. (!i. random_variable p (X i)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> abs(gen_char_fn_re p (\x. sum(0..n) (\i. X i x)) t - - gen_char_fn_re p (X 0) t pow (SUC n)) - <= &(SUC n) * abs(gen_char_fn_im p (X 0) t)`, + ==> abs(char_fn_re p (\x. sum(0..n) (\i. X i x)) t - + char_fn_re p (X 0) t pow (SUC n)) + <= &(SUC n) * abs(char_fn_im p (X 0) t)`, GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [(* Base case: n = 0 *) REPEAT STRIP_TAC THEN @@ -2892,23 +2989,23 @@ let GEN_CHAR_FN_SUM_IID_RE_BOUND = prove MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - GEN_CHAR_FN_ADD_INDEP_RE) THEN + CHAR_FN_ADD_INDEP_RE) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN ONCE_ASM_REWRITE_TAC[] THEN SUBGOAL_THEN - `gen_char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = - gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X (SUC n)) t = gen_char_fn_im p (X 0) t` + `char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = + char_fn_re p (X 0) t /\ + char_fn_im p (X (SUC n)) t = char_fn_im p (X 0) t` STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN ONCE_ASM_REWRITE_TAC[] THEN ONCE_REWRITE_TAC[real_pow] THEN - MATCH_MP_TAC CHAR_FN_SUM_IID_TRIANGLE THEN + MATCH_MP_TAC SIMPLE_CHAR_FN_SUM_IID_TRIANGLE THEN CONJ_TAC THENL - [MATCH_MP_TAC GEN_CHAR_FN_RE_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + [MATCH_MP_TAC CHAR_FN_RE_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC GEN_CHAR_FN_IM_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + [MATCH_MP_TAC CHAR_FN_IM_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN REPEAT CONJ_TAC THENL [ASM_REWRITE_TAC[]; @@ -2916,57 +3013,57 @@ let GEN_CHAR_FN_SUM_IID_RE_BOUND = prove GEN_TAC THEN DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]]);; -(* GEN_CLT_CHAR_FN_CONVERGENCE: - Main assembly: gen_char_fn_re of standardized sum --> exp(-t^2*sigma^2/2) - Combines: GEN_CHAR_FN_RE_POW_CONV_EXP, GEN_CHAR_FN_SUM_IID_RE_BOUND, - GEN_CLT_IM_ERROR_VANISHES via REALLIM_TRANSFORM + comparison *) -let GEN_CLT_CHAR_FN_CONVERGENCE = prove +(* CLT_CHAR_FN_CONVERGENCE: + Main assembly: char_fn_re of standardized sum --> exp(-t^2*sigma^2/2) + Combines: CHAR_FN_RE_POW_CONV_EXP, CHAR_FN_SUM_IID_RE_BOUND, + CLT_IM_ERROR_VANISHES via REALLIM_TRANSFORM + comparison *) +let CLT_CHAR_FN_CONVERGENCE = prove (`!p:A prob_space (X:num->A->real) t. (!n. integrable p (X n)) /\ (!n. integrable p (\x. X n x pow 2)) /\ (!i. expectation p (X i) = &0) /\ &0 < expectation p (\x. X 0 x pow 2) /\ (!i. expectation p (\x. X i x pow 2) = expectation p (\x. X 0 x pow 2)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. gen_char_fn_re p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> exp(--(t pow 2 * expectation p (\x. X 0 x pow 2) / &2))) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN (* Step 1: Show the difference from the power vanishes *) MATCH_MP_TAC REALLIM_TRANSFORM THEN - EXISTS_TAC `\n. gen_char_fn_re (p:A prob_space) ((X:num->A->real) 0) + EXISTS_TAC `\n. char_fn_re (p:A prob_space) ((X:num->A->real) 0) (t / sqrt(&(SUC n))) pow (SUC n)` THEN CONJ_TAC THENL [(* The difference vanishes *) MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN - EXISTS_TAC `\n. &(SUC n) * abs(gen_char_fn_im (p:A prob_space) + EXISTS_TAC `\n. &(SUC n) * abs(char_fn_im (p:A prob_space) ((X:num->A->real) 0) (t / sqrt(&(SUC n))))` THEN CONJ_TAC THENL [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ONCE_REWRITE_TAC[REAL_ABS_SUB] THEN - MATCH_MP_TAC GEN_CHAR_FN_SUM_IID_RE_BOUND THEN + MATCH_MP_TAC CHAR_FN_SUM_IID_RE_BOUND THEN ASM_MESON_TAC[integrable]; - (* (n+1)*|gen_char_fn_im(X_0, t/sqrt(n+1))| --> 0 *) - MATCH_MP_TAC GEN_CLT_IM_ERROR_VANISHES THEN + (* (n+1)*|char_fn_im(X_0, t/sqrt(n+1))| --> 0 *) + MATCH_MP_TAC CLT_IM_ERROR_VANISHES THEN ASM_REWRITE_TAC[]]; (* Step 2: The power converges *) - MATCH_MP_TAC GEN_CHAR_FN_RE_POW_CONV_EXP THEN + MATCH_MP_TAC CHAR_FN_RE_POW_CONV_EXP THEN ASM_REWRITE_TAC[]]);; (* ========================================================================= *) (* Phase 22: Integrable Levy continuity chain for INTEGRABLE_CLT *) (* ========================================================================= *) -(* gen_cdf is in [0,1] for any random variable *) -let GEN_CDF_BOUNDS = prove +(* cdf is in [0,1] for any random variable *) +let CDF_BOUNDS = prove (`!p:A prob_space (X:A->real) x. random_variable p X - ==> &0 <= gen_cdf p X x /\ gen_cdf p X x <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_cdf] THENL + ==> &0 <= cdf p X x /\ cdf p X x <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[cdf] THENL [MATCH_MP_TAC PROB_POSITIVE THEN FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]; @@ -2974,37 +3071,37 @@ let GEN_CDF_BOUNDS = prove FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]]);; -(* gen_char_fn under division by constant *) -let GEN_CHAR_FN_RE_DIV = prove +(* char_fn under division by constant *) +let CHAR_FN_RE_DIV = prove (`!p:A prob_space (X:A->real) c t. - gen_char_fn_re p (\x. X x / c) t = gen_char_fn_re p X (t / c)`, - REPEAT GEN_TAC THEN REWRITE_TAC[gen_char_fn_re; real_div] THEN + char_fn_re p (\x. X x / c) t = char_fn_re p X (t / c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[char_fn_re; real_div] THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; -let GEN_CHAR_FN_IM_DIV = prove +let CHAR_FN_IM_DIV = prove (`!p:A prob_space (X:A->real) c t. - gen_char_fn_im p (\x. X x / c) t = gen_char_fn_im p X (t / c)`, - REPEAT GEN_TAC THEN REWRITE_TAC[gen_char_fn_im; real_div] THEN + char_fn_im p (\x. X x / c) t = char_fn_im p X (t / c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[char_fn_im; real_div] THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_RING);; -(* E[g(X)] <= gen_cdf(X,x) when g(y) <= 1 for y<=x, g(y) <= 0 for y>x *) +(* E[g(X)] <= cdf(X,x) when g(y) <= 1 for y<=x, g(y) <= 0 for y>x *) (* Needs: random_variable composition for measurable g - will prove when needed *) -let EXPECTATION_LE_GEN_CDF = prove +let EXPECTATION_LE_CDF = prove (`!p:A prob_space (X:A->real) (g:real->real) x. random_variable p X /\ integrable p (\a. g(X a)) /\ (!y. y <= x ==> g y <= &1) /\ (!y. y > x ==> g y <= &0) - ==> expectation p (\a. g(X a)) <= gen_cdf p X x`, + ==> expectation p (\a. g(X a)) <= cdf p X x`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `{a | a IN prob_carrier (p:A prob_space) /\ (X:A->real) a <= x} IN prob_events p` ASSUME_TAC THENL [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[gen_cdf] THEN + REWRITE_TAC[cdf] THEN ASM_SIMP_TAC[GSYM EXPECTATION_INDICATOR] THEN MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL @@ -3018,22 +3115,22 @@ let EXPECTATION_LE_GEN_CDF = prove [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC]);; -(* gen_cdf(X,x) <= E[g(X)] when g(y) >= 1 for y<=x, g(y) >= 0 for y>x *) +(* cdf(X,x) <= E[g(X)] when g(y) >= 1 for y<=x, g(y) >= 0 for y>x *) (* Needs: integrability of g o X as hypothesis *) -let GEN_CDF_LE_EXPECTATION = prove +let CDF_LE_EXPECTATION = prove (`!p:A prob_space (X:A->real) (g:real->real) x. random_variable p X /\ integrable p (\a. g(X a)) /\ (!y. y <= x ==> &1 <= g y) /\ (!y. y > x ==> &0 <= g y) - ==> gen_cdf p X x <= expectation p (\a. g(X a))`, + ==> cdf p X x <= expectation p (\a. g(X a))`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `{a | a IN prob_carrier (p:A prob_space) /\ (X:A->real) a <= x} IN prob_events p` ASSUME_TAC THENL [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN DISCH_THEN(MP_TAC o SPEC `x:real`) THEN REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[gen_cdf] THEN + REWRITE_TAC[cdf] THEN ASM_SIMP_TAC[GSYM EXPECTATION_INDICATOR] THEN MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL @@ -3047,18 +3144,18 @@ let GEN_CDF_LE_EXPECTATION = prove [ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REAL_ARITH_TAC]);; -(* Modulus identity for gen_char_fn of IID sums: |cf(sum)|^2 = |cf(X_0)|^{2(n+1)} - Generalized from CHAR_FN_SUM_IID_MODULUS to use random_variable *) -let GEN_CHAR_FN_SUM_IID_MODULUS_RV = prove +(* Modulus identity for char_fn of IID sums: |cf(sum)|^2 = |cf(X_0)|^{2(n+1)} + Generalized from SIMPLE_CHAR_FN_SUM_IID_MODULUS to use random_variable *) +let CHAR_FN_SUM_IID_MODULUS_RV = prove (`!p:A prob_space (X:num->A->real) n t. (!i. random_variable p (X i)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> gen_char_fn_re p (\x. sum(0..n) (\i. X i x)) t pow 2 + - gen_char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = - (gen_char_fn_re p (X 0) t pow 2 + - gen_char_fn_im p (X 0) t pow 2) pow (SUC n)`, + ==> char_fn_re p (\x. sum(0..n) (\i. X i x)) t pow 2 + + char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 = + (char_fn_re p (X 0) t pow 2 + + char_fn_im p (X 0) t pow 2) pow (SUC n)`, GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [(* Base case: n = 0 *) REPEAT STRIP_TAC THEN @@ -3087,23 +3184,23 @@ let GEN_CHAR_FN_SUM_IID_MODULUS_RV = prove MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - GEN_CHAR_FN_ADD_INDEP_RE) THEN + CHAR_FN_ADD_INDEP_RE) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; `(X:num->A->real) (SUC n)`; `t:real`] - GEN_CHAR_FN_ADD_INDEP_IM) THEN + CHAR_FN_ADD_INDEP_IM) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN DISCH_TAC THEN - ABBREV_TAC `R = gen_char_fn_re (p:A prob_space) + ABBREV_TAC `R = char_fn_re (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN - ABBREV_TAC `S' = gen_char_fn_im (p:A prob_space) + ABBREV_TAC `S' = char_fn_im (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN - ABBREV_TAC `r = gen_char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN - ABBREV_TAC `s = gen_char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN - SUBGOAL_THEN `gen_char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = r /\ - gen_char_fn_im p (X (SUC n)) t = s` STRIP_ASSUME_TAC THENL + ABBREV_TAC `r = char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN + ABBREV_TAC `s = char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN + SUBGOAL_THEN `char_fn_re (p:A prob_space) ((X:num->A->real) (SUC n)) t = r /\ + char_fn_im p (X (SUC n)) t = s` STRIP_ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN (* IH: R^2 + S'^2 = (r^2+s^2)^(n+1) *) SUBGOAL_THEN `(R:real) pow 2 + S' pow 2 = @@ -3125,13 +3222,13 @@ let GEN_CHAR_FN_SUM_IID_MODULUS_RV = prove ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN REWRITE_TAC[GSYM(CONJUNCT2 real_pow)]]);; -(* Modulus bound: |phi(t)|^2 <= 1 for gen_char_fn with random_variable *) +(* Modulus bound: |phi(t)|^2 <= 1 for char_fn with random_variable *) (* Proof via Jensen: 1 - E[cos]^2 - E[sin]^2 = E[(cos-c)^2+(sin-s)^2] >= 0 *) -let GEN_CHAR_FN_MODULUS_LE = prove +let CHAR_FN_MODULUS_LE = prove (`!p:A prob_space (X:A->real) t. random_variable p X - ==> gen_char_fn_re p X t pow 2 + gen_char_fn_im p X t pow 2 <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_re; gen_char_fn_im] THEN + ==> char_fn_re p X t pow 2 + char_fn_im p X t pow 2 <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re; char_fn_im] THEN SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. cos(t * (X:A->real) x))` ASSUME_TAC THENL [MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN @@ -3253,50 +3350,50 @@ let GEN_CHAR_FN_MODULUS_LE = prove X_GEN_TAC `a:A` THEN DISCH_TAC THEN BETA_TAC THEN MATCH_MP_TAC REAL_LE_ADD THEN CONJ_TAC THEN REWRITE_TAC[REAL_LE_POW_2]]);; -(* Im(sum)^2 bound for gen_char_fn with random_variable *) -let GEN_CHAR_FN_SUM_IID_IM_SQ_BOUND = prove +(* Im(sum)^2 bound for char_fn with random_variable *) +let CHAR_FN_SUM_IID_IM_SQ_BOUND = prove (`!p:A prob_space (X:num->A->real) n t. (!i. random_variable p (X i)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> gen_char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 - <= &3 * (&(SUC n) * abs(gen_char_fn_im p (X 0) t))`, + ==> char_fn_im p (\x. sum(0..n) (\i. X i x)) t pow 2 + <= &3 * (&(SUC n) * abs(char_fn_im p (X 0) t))`, REPEAT STRIP_TAC THEN - ABBREV_TAC `r = gen_char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN - ABBREV_TAC `s = gen_char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN - ABBREV_TAC `R = gen_char_fn_re (p:A prob_space) + ABBREV_TAC `r = char_fn_re (p:A prob_space) ((X:num->A->real) 0) t` THEN + ABBREV_TAC `s = char_fn_im (p:A prob_space) ((X:num->A->real) 0) t` THEN + ABBREV_TAC `R = char_fn_re (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN - ABBREV_TAC `S' = gen_char_fn_im (p:A prob_space) + ABBREV_TAC `S' = char_fn_im (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN (* Step 1: R^2+S'^2 = (r^2+s^2)^(n+1) *) MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; `t:real`] - GEN_CHAR_FN_SUM_IID_MODULUS_RV) THEN + CHAR_FN_SUM_IID_MODULUS_RV) THEN ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 2: |R-r^(n+1)| <= (n+1)|s| *) MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; `t:real`] - GEN_CHAR_FN_SUM_IID_RE_BOUND) THEN + CHAR_FN_SUM_IID_RE_BOUND) THEN ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN (* Step 3: r^2+s^2 <= 1 *) SUBGOAL_THEN `r pow 2 + s pow 2 <= &1` ASSUME_TAC THENL [EXPAND_TAC "r" THEN EXPAND_TAC "s" THEN - MATCH_MP_TAC GEN_CHAR_FN_MODULUS_LE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC CHAR_FN_MODULUS_LE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN (* Step 4: |s| <= 1 *) SUBGOAL_THEN `abs s <= &1` ASSUME_TAC THENL - [ASM_MESON_TAC[GEN_CHAR_FN_IM_BOUND]; ALL_TAC] THEN + [ASM_MESON_TAC[CHAR_FN_IM_BOUND]; ALL_TAC] THEN (* Step 5: |r| <= 1 *) SUBGOAL_THEN `abs r <= &1` ASSUME_TAC THENL - [ASM_MESON_TAC[GEN_CHAR_FN_RE_BOUND]; ALL_TAC] THEN + [ASM_MESON_TAC[CHAR_FN_RE_BOUND]; ALL_TAC] THEN (* Step 5b: |r^(n+1)| <= 1 *) SUBGOAL_THEN `abs(r pow (SUC n)) <= &1` ASSUME_TAC THENL [REWRITE_TAC[REAL_ABS_POW] THEN MATCH_MP_TAC REAL_POW_1_LE THEN ASM_REWRITE_TAC[REAL_ABS_POS]; ALL_TAC] THEN (* Step 6: |R| <= 1 *) SUBGOAL_THEN `abs R <= &1` ASSUME_TAC THENL - [EXPAND_TAC "R" THEN MATCH_MP_TAC GEN_CHAR_FN_RE_BOUND THEN + [EXPAND_TAC "R" THEN MATCH_MP_TAC CHAR_FN_RE_BOUND THEN MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN (* Step 7: (r^2+s^2)^(n+1) - (r^2)^(n+1) <= (n+1)*s^2 *) @@ -3333,36 +3430,36 @@ let REALLIM_SQRT_NULL = prove MATCH_MP_TAC REALLIM_REAL_CONTINUOUS_FUNCTION THEN REWRITE_TAC[REAL_CONTINUOUS_AT_SQRT] THEN ASM_REWRITE_TAC[]);; -(* CLT: Imaginary part of gen_char_fn of standardized sum --> 0 *) -let GEN_CLT_CHAR_FN_IM_CONVERGENCE = prove +(* CLT: Imaginary part of char_fn of standardized sum --> 0 *) +let CLT_CHAR_FN_IM_CONVERGENCE = prove (`!p:A prob_space (X:num->A->real) t. (!n. integrable p (X n)) /\ (!n. integrable p (\x. X n x pow 2)) /\ (!i. expectation p (X i) = &0) /\ &0 < expectation p (\x. X 0 x pow 2) /\ (!i. expectation p (\x. X i x pow 2) = expectation p (\x. X 0 x pow 2)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> ((\n. gen_char_fn_im p (\x. sum(0..n) (\i. X i x)) + ==> ((\n. char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / sqrt(&(SUC n)))) ---> &0) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `!i:num. random_variable (p:A prob_space) ((X:num->A->real) i)` ASSUME_TAC THENL [ASM_MESON_TAC[integrable]; ALL_TAC] THEN - ABBREV_TAC `I_n = \n:num. gen_char_fn_im (p:A prob_space) + ABBREV_TAC `I_n = \n:num. char_fn_im (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) (t / sqrt(&(SUC n)))` THEN (* Use: Im^2 <= 3*(n+1)*|Im(X_0, s)| where s = t/sqrt(n+1) *) ABBREV_TAC `C_n = \n:num. &3 * (&(SUC n) * - abs(gen_char_fn_im (p:A prob_space) ((X:num->A->real) 0) + abs(char_fn_im (p:A prob_space) ((X:num->A->real) 0) (t / sqrt(&(SUC n)))))` THEN (* Step 1: I_n^2 <= C_n *) SUBGOAL_THEN `!n:num. (I_n:num->real) n pow 2 <= C_n n` ASSUME_TAC THENL [X_GEN_TAC `n:num` THEN EXPAND_TAC "I_n" THEN EXPAND_TAC "C_n" THEN BETA_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`; - `t / sqrt(&(SUC n))`] GEN_CHAR_FN_SUM_IID_IM_SQ_BOUND) THEN + `t / sqrt(&(SUC n))`] CHAR_FN_SUM_IID_IM_SQ_BOUND) THEN ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; ALL_TAC] THEN (* Step 2: C_n --> 0 since (n+1)*|Im(X_0, t/sqrt(n+1))| --> 0 *) SUBGOAL_THEN `((C_n:num->real) ---> &0) sequentially` ASSUME_TAC THENL @@ -3371,7 +3468,7 @@ let GEN_CLT_CHAR_FN_IM_CONVERGENCE = prove [REAL_ARITH_TAC; ALL_TAC] THEN MATCH_MP_TAC REALLIM_LMUL THEN MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; `t:real`] - GEN_CLT_IM_ERROR_VANISHES) THEN + CLT_IM_ERROR_VANISHES) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REALLIM_TRANSFORM_EVENTUALLY) THEN MATCH_MP_TAC ALWAYS_EVENTUALLY THEN X_GEN_TAC `n:num` THEN BETA_TAC THEN @@ -3399,20 +3496,20 @@ let GEN_CLT_CHAR_FN_IM_CONVERGENCE = prove (* ========================================================================= *) (* Phase 23: Integrable weak convergence from char fn *) -(* Generalizes WEAK_CONVERGENCE_FROM_CHAR_FN and supporting lemmas *) +(* Generalizes SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN and supporting lemmas *) (* from simple_rv to integrable (random_variable) setting. *) (* ========================================================================= *) -(* GEN_TRIG_POLY_WEAK_CONVERGENCE: - If gen_char_fn_re/im of integrable X_n converge to normal limits, +(* TRIG_POLY_WEAK_CONVERGENCE: + If char_fn_re/im of integrable X_n converge to normal limits, then expectation of trig polynomials converges. - Analogous to TRIG_POLY_WEAK_CONVERGENCE for simple_rv. *) -let GEN_TRIG_POLY_WEAK_CONVERGENCE = prove + Analogous to SIMPLE_TRIG_POLY_WEAK_CONVERGENCE for simple_rv. *) +let TRIG_POLY_WEAK_CONVERGENCE = prove (`!p:A prob_space (X:num->A->real) m (a:num->real) (b:num->real) (freq:num->real). (!n. random_variable p (X n)) /\ - (!t. ((\n. gen_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) sequentially) /\ - (!t. ((\n. gen_char_fn_im p (X n) t) ---> &0) sequentially) + (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) ==> ((\n. expectation p (\x. sum(0..m) (\k. a k * cos(freq k * X n x) + b k * sin(freq k * X n x)))) ---> @@ -3424,8 +3521,8 @@ let GEN_TRIG_POLY_WEAK_CONVERGENCE = prove `!n:num. expectation (p:A prob_space) (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + (b:num->real) k * sin(freq k * X n x))) = - sum(0..m) (\k. a k * gen_char_fn_re p (X n) (freq k) + - b k * gen_char_fn_im p (X n) (freq k))` + sum(0..m) (\k. a k * char_fn_re p (X n) (freq k) + + b k * char_fn_im p (X n) (freq k))` ASSUME_TAC THENL [GEN_TAC THEN (* Each summand is integrable *) @@ -3485,12 +3582,12 @@ let GEN_TRIG_POLY_WEAK_CONVERGENCE = prove [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN - REWRITE_TAC[gen_char_fn_re; gen_char_fn_im]; + REWRITE_TAC[char_fn_re; char_fn_im]; ALL_TAC] THEN (* Step 2: Apply limit decomposition *) MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN - EXISTS_TAC `\n:num. sum(0..m) (\k. (a:num->real) k * gen_char_fn_re (p:A prob_space) ((X:num->A->real) n) ((freq:num->real) k) + - (b:num->real) k * gen_char_fn_im p (X n) (freq k))` THEN + EXISTS_TAC `\n:num. sum(0..m) (\k. (a:num->real) k * char_fn_re (p:A prob_space) ((X:num->A->real) n) ((freq:num->real) k) + + (b:num->real) k * char_fn_im p (X n) (freq k))` THEN CONJ_TAC THENL [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; @@ -3507,11 +3604,11 @@ let GEN_TRIG_POLY_WEAK_CONVERGENCE = prove [MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]; MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; -(* GEN_STEP_C_BOUND: +(* STEP_C_BOUND: For integrable X_n with bounded second moments, bound the difference |E[g(X_n)] - E[T(X_n)]| where g,T are bounded functions. - Analogous to STEP_C_BOUND for simple_rv. *) -let GEN_STEP_C_BOUND = prove + Analogous to SIMPLE_STEP_C_BOUND for simple_rv. *) +let STEP_C_BOUND = prove (`!p:A prob_space (X:num->A->real) (g:real->real) (T':real->real) BB CC e M. (!n. integrable p (\a. g(X n a))) /\ (!n. integrable p (\a. T'(X n a))) /\ @@ -3667,20 +3764,20 @@ let GEN_STEP_C_BOUND = prove [ASM_SIMP_TAC[REAL_POW_LT]; ALL_TAC] THEN ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN ASM_REWRITE_TAC[]]]]);; -(* GEN_WEAK_CONVERGENCE_FROM_CHAR_FN: - If gen_char_fn of integrable X_n converges to normal limits, +(* WEAK_CONVERGENCE_FROM_CHAR_FN: + If char_fn of integrable X_n converges to normal limits, then for any bounded continuous g, E[g(X_n)] -> integral(g * normal_density). - Analogous to WEAK_CONVERGENCE_FROM_CHAR_FN for simple_rv. *) -let GEN_WEAK_CONVERGENCE_FROM_CHAR_FN = prove + Analogous to SIMPLE_WEAK_CONVERGENCE_FROM_CHAR_FN for simple_rv. *) +let WEAK_CONVERGENCE_FROM_CHAR_FN = prove (`!p:A prob_space (X:num->A->real) (g:real->real). (!n. random_variable p (X n)) /\ (!n. integrable p (X n)) /\ (!n. integrable p (\x. X n x pow 2)) /\ (?C. &0 < C /\ !n. expectation p (\x. X n x pow 2) <= C) /\ - (!t. ((\n. gen_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) sequentially) /\ - (!t. ((\n. gen_char_fn_im p (X n) t) ---> &0) sequentially) /\ + (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) /\ (!y. g real_continuous atreal y) /\ (?B. &0 < B /\ !y. abs(g y) <= B) /\ (!n. integrable p (\a. g(X n a))) @@ -3777,7 +3874,7 @@ let GEN_WEAK_CONVERGENCE_FROM_CHAR_FN = prove L) sequentially` ASSUME_TAC THENL [EXPAND_TAC "L" THEN - MATCH_MP_TAC GEN_TRIG_POLY_WEAK_CONVERGENCE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC TRIG_POLY_WEAK_CONVERGENCE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN (* Step B: L = integral of T times density *) SUBGOAL_THEN @@ -3817,7 +3914,7 @@ let GEN_WEAK_CONVERGENCE_FROM_CHAR_FN = prove `\y:real. sum(0..nn) (\k. (aa:num->real) k * cos((ff:num->real) k * y) + (bb:num->real) k * sin(ff k * y))`; - `BB:real`; `CC:real`; `e:real`; `M:real`] GEN_STEP_C_BOUND) THEN + `BB:real`; `CC:real`; `e:real`; `M:real`] STEP_C_BOUND) THEN BETA_TAC THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_THEN ACCEPT_TAC; ALL_TAC] THEN @@ -3910,20 +4007,20 @@ let GEN_WEAK_CONVERGENCE_FROM_CHAR_FN = prove (\y. (g:real->real) y * std_normal_density y)` THEN ASM_REAL_ARITH_TAC);; -(* GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT: - If gen_char_fn converges to normal and gen_cdf converges to l, +(* CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT: + If char_fn converges to normal and cdf converges to l, then l = std_normal_cdf x. Uses sandwich argument with - piecewise linear test functions and GEN_WEAK_CONVERGENCE_FROM_CHAR_FN. *) -let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove + piecewise linear test functions and WEAK_CONVERGENCE_FROM_CHAR_FN. *) +let CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove (`!p:A prob_space (X:num->A->real) x l. (!n. random_variable p (X n)) /\ (!n. integrable p (X n)) /\ (!n. integrable p (\x. X n x pow 2)) /\ (?C. &0 < C /\ !n. expectation p (\x. X n x pow 2) <= C) /\ - (!t. ((\n. gen_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) sequentially) /\ - (!t. ((\n. gen_char_fn_im p (X n) t) ---> &0) sequentially) /\ - ((\n. gen_cdf p (X n) x) ---> l) sequentially + (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) /\ + ((\n. cdf p (X n) x) ---> l) sequentially ==> l = std_normal_cdf x`, REPEAT GEN_TAC THEN STRIP_TAC THEN MATCH_MP_TAC CONTINUOUS_LIMIT_SANDWICH THEN @@ -3989,7 +4086,7 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove [`sequentially`; `\n:num. expectation (p:A prob_space) (\a:A. (g_low:real->real) ((X:num->A->real) n a))`; - `\n:num. gen_cdf (p:A prob_space) ((X:num->A->real) n) x`; + `\n:num. cdf (p:A prob_space) ((X:num->A->real) n) x`; `real_integral (:real) (\y:real. (g_low:real->real) y * std_normal_density y)`; `l:real`] @@ -3998,7 +4095,7 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL [(* E[g_low(X_n)] -> integral(g_low * density) *) - MATCH_MP_TAC GEN_WEAK_CONVERGENCE_FROM_CHAR_FN THEN + MATCH_MP_TAC WEAK_CONVERGENCE_FROM_CHAR_FN THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL @@ -4020,10 +4117,10 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove EXISTS_TAC `&1` THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN EXPAND_TAC "g_low" THEN GEN_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN - (* eventually(E[g_low(X_n)] <= gen_cdf(X_n, x)) *) + (* eventually(E[g_low(X_n)] <= cdf(X_n, x)) *) REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN BETA_TAC THEN - MATCH_MP_TAC EXPECTATION_LE_GEN_CDF THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC EXPECTATION_LE_CDF THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [X_GEN_TAC `y:real` THEN EXPAND_TAC "g_low" THEN REAL_ARITH_TAC; X_GEN_TAC `y:real` THEN DISCH_TAC THEN EXPAND_TAC "g_low" THEN @@ -4088,7 +4185,7 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove (* l <= int g_high*density *) MP_TAC(ISPECL [`sequentially`; - `\n:num. gen_cdf (p:A prob_space) ((X:num->A->real) n) x`; + `\n:num. cdf (p:A prob_space) ((X:num->A->real) n) x`; `\n:num. expectation (p:A prob_space) (\a:A. (g_high:real->real) ((X:num->A->real) n a))`; `l:real`; @@ -4099,7 +4196,7 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove [ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL [(* E[g_high(X_n)] -> integral(g_high * density) *) - MATCH_MP_TAC GEN_WEAK_CONVERGENCE_FROM_CHAR_FN THEN + MATCH_MP_TAC WEAK_CONVERGENCE_FROM_CHAR_FN THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL @@ -4121,10 +4218,10 @@ let GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT = prove EXISTS_TAC `&1` THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN EXPAND_TAC "g_high" THEN GEN_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN - (* eventually(gen_cdf(X_n,x) <= E[g_high(X_n)]) *) + (* eventually(cdf(X_n,x) <= E[g_high(X_n)]) *) REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN BETA_TAC THEN - MATCH_MP_TAC GEN_CDF_LE_EXPECTATION THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC CDF_LE_EXPECTATION THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [X_GEN_TAC `y:real` THEN DISCH_TAC THEN EXPAND_TAC "g_high" THEN SUBGOAL_THEN `(y - x) / h <= &0` MP_TAC THENL @@ -4145,12 +4242,12 @@ let LEVY_CONTINUITY_CLT = prove !n. expectation p (\x. (X:num->A->real) n x pow 2) <= C) /\ (!n. integrable p (X n)) /\ (!n. integrable p (\x. X n x pow 2)) /\ - (!t. ((\n. gen_char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) + (!t. ((\n. char_fn_re p (X n) t) ---> exp(--(t pow 2 / &2))) sequentially) /\ - (!t. ((\n. gen_char_fn_im p (X n) t) ---> &0) sequentially) - ==> !x. ((\n. gen_cdf p (X n) x) ---> std_normal_cdf x) sequentially`, + (!t. ((\n. char_fn_im p (X n) t) ---> &0) sequentially) + ==> !x. ((\n. cdf p (X n) x) ---> std_normal_cdf x) sequentially`, REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `x:real` THEN - REWRITE_TAC[GEN_CDF_SIMPLE_AGREE] THEN + REWRITE_TAC[CDF_SIMPLE_AGREE] THEN (* Step 1: Tightness from bounded second moments *) SUBGOAL_THEN `!e. &0 < e ==> @@ -4174,8 +4271,8 @@ let LEVY_CONTINUITY_CLT = prove BETA_TAC THEN CONJ_TAC THENL [GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN - REWRITE_TAC[GSYM GEN_CDF_SIMPLE_AGREE] THEN - MATCH_MP_TAC GEN_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[GSYM CDF_SIMPLE_AGREE] THEN + MATCH_MP_TAC CDF_BOUNDS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN X_GEN_TAC `r:num->num` THEN DISCH_TAC THEN MP_TAC(ISPECL @@ -4184,8 +4281,8 @@ let LEVY_CONTINUITY_CLT = prove BETA_TAC THEN ANTS_TAC THENL [GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN - REWRITE_TAC[GSYM GEN_CDF_SIMPLE_AGREE] THEN - MATCH_MP_TAC GEN_CDF_BOUNDS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[GSYM CDF_SIMPLE_AGREE] THEN + MATCH_MP_TAC CDF_BOUNDS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_THEN(X_CHOOSE_THEN `l:real` (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN @@ -4196,7 +4293,7 @@ let LEVY_CONTINUITY_CLT = prove [`p:A prob_space`; `\k:num. (X:num->A->real) ((r:num->num) ((s:num->num) k))`; `x:real`; `l:real`] - GEN_CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT) THEN + CHAR_FN_DETERMINES_NORMAL_CDF_LIMIT) THEN BETA_TAC THEN ANTS_TAC THENL [CONJ_TAC THENL [GEN_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN @@ -4207,10 +4304,10 @@ let LEVY_CONTINUITY_CLT = prove CONJ_TAC THENL [EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL - [(* gen_char_fn_re convergence along r o s *) + [(* char_fn_re convergence along r o s *) X_GEN_TAC `t:real` THEN MP_TAC(ISPECL - [`\n:num. gen_char_fn_re (p:A prob_space) ((X:num->A->real) n) t`; + [`\n:num. char_fn_re (p:A prob_space) ((X:num->A->real) n) t`; `exp(--(t pow 2 / &2))`; `\k:num. (r:num->num) ((s:num->num) k)`] REALLIM_SUBSEQUENCE) THEN @@ -4221,10 +4318,10 @@ let LEVY_CONTINUITY_CLT = prove ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL - [(* gen_char_fn_im convergence along r o s *) + [(* char_fn_im convergence along r o s *) X_GEN_TAC `t:real` THEN MP_TAC(ISPECL - [`\n:num. gen_char_fn_im (p:A prob_space) ((X:num->A->real) n) t`; + [`\n:num. char_fn_im (p:A prob_space) ((X:num->A->real) n) t`; `&0`; `\k:num. (r:num->num) ((s:num->num) k)`] REALLIM_SUBSEQUENCE) THEN @@ -4234,7 +4331,7 @@ let LEVY_CONTINUITY_CLT = prove FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - ASM_REWRITE_TAC[GEN_CDF_SIMPLE_AGREE]; + ASM_REWRITE_TAC[CDF_SIMPLE_AGREE]; DISCH_TAC THEN ASM_REWRITE_TAC[]]; ASM_REWRITE_TAC[]]);; @@ -4251,10 +4348,10 @@ let INTEGRABLE_CLT = prove &0 < variance p (X 0) /\ (!i. variance p (X i) = variance p (X 0)) /\ (!i j:num. ~(i = j) ==> indep_rv p (X i) (X j)) /\ - (!i t. gen_char_fn_re p (X i) t = gen_char_fn_re p (X 0) t /\ - gen_char_fn_im p (X i) t = gen_char_fn_im p (X 0) t) /\ + (!i t. char_fn_re p (X i) t = char_fn_re p (X 0) t /\ + char_fn_im p (X i) t = char_fn_im p (X 0) t) /\ (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) - ==> !x:real. ((\n. gen_cdf p + ==> !x:real. ((\n. cdf p (\a. sum(0..n) (\i. X i a) / (sqrt(variance p (X 0)) * sqrt(&(SUC n)))) x) ---> std_normal_cdf x) sequentially`, @@ -4281,14 +4378,14 @@ let INTEGRABLE_CLT = prove GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN (* Apply LEVY_CONTINUITY_CLT to Y_n *) - SUBGOAL_THEN `!n x:real. gen_cdf (p:A prob_space) ((Y:num->A->real) n) x = - gen_cdf p (\a. sum(0..n) (\i. (X:num->A->real) i a) / + SUBGOAL_THEN `!n x:real. cdf (p:A prob_space) ((Y:num->A->real) n) x = + cdf p (\a. sum(0..n) (\i. (X:num->A->real) i a) / (sqrt sigma2 * sqrt(&(SUC n)))) x` ASSUME_TAC THENL [REPEAT GEN_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN EXPAND_TAC "Y" THEN REFL_TAC; ALL_TAC] THEN SUBGOAL_THEN - `!x:real. ((\n. gen_cdf (p:A prob_space) ((Y:num->A->real) n) x) ---> + `!x:real. ((\n. cdf (p:A prob_space) ((Y:num->A->real) n) x) ---> std_normal_cdf x) sequentially` MP_TAC THENL [ALL_TAC; @@ -4345,7 +4442,7 @@ let INTEGRABLE_CLT = prove SUBGOAL_THEN `(sqrt sigma2 * sqrt(&(SUC n))) pow 2 = sigma2 * &(SUC n)` ASSUME_TAC THENL [REWRITE_TAC[REAL_POW_MUL] THEN SUBGOAL_THEN `sqrt sigma2 pow 2 = sigma2` SUBST1_TAC THENL - [MATCH_MP_TAC SQRT_POW_2 THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN SUBGOAL_THEN `sqrt (&(SUC n)) pow 2 = &(SUC n)` SUBST1_TAC THENL [MATCH_MP_TAC SQRT_POW_2 THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN REFL_TAC; @@ -4404,20 +4501,20 @@ let INTEGRABLE_CLT = prove REWRITE_TAC[REAL_POW_DIV; real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN ASM_SIMP_TAC[]; - (* gen_char_fn_re convergence *) + (* char_fn_re convergence *) X_GEN_TAC `t:real` THEN EXPAND_TAC "Y" THEN BETA_TAC THEN - REWRITE_TAC[GEN_CHAR_FN_RE_DIV] THEN - (* gen_char_fn_re p (\x. sum(...)) (t/(sigma*sqrt(n+1))) *) - (* = gen_char_fn_re p (\x. sum(...)) ((t/sigma)/sqrt(n+1)) *) - SUBGOAL_THEN `!n:num. gen_char_fn_re (p:A prob_space) + REWRITE_TAC[CHAR_FN_RE_DIV] THEN + (* char_fn_re p (\x. sum(...)) (t/(sigma*sqrt(n+1))) *) + (* = char_fn_re p (\x. sum(...)) ((t/sigma)/sqrt(n+1)) *) + SUBGOAL_THEN `!n:num. char_fn_re (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) (t / (sqrt sigma2 * sqrt (&(SUC n)))) = - gen_char_fn_re p (\x. sum(0..n) (\i. X i x)) + char_fn_re p (\x. sum(0..n) (\i. X i x)) (t / sqrt sigma2 / sqrt (&(SUC n)))` ASSUME_TAC THENL [GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_FIELD; ASM_REWRITE_TAC[]] THEN MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t / sqrt sigma2`] - GEN_CLT_CHAR_FN_CONVERGENCE) THEN + CLT_CHAR_FN_CONVERGENCE) THEN ANTS_TAC THENL [REPEAT CONJ_TAC THENL [ASM_REWRITE_TAC[]; @@ -4438,23 +4535,23 @@ let INTEGRABLE_CLT = prove [AP_TERM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[REAL_POW_DIV] THEN SUBGOAL_THEN `sqrt sigma2 pow 2 = sigma2` SUBST1_TAC THENL - [MATCH_MP_TAC SQRT_POW_2 THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN SUBGOAL_THEN `~(sigma2 = &0)` MP_TAC THENL [ASM_REAL_ARITH_TAC; CONV_TAC REAL_FIELD]; ALL_TAC] THEN ASM_REWRITE_TAC[]; - (* gen_char_fn_im convergence *) + (* char_fn_im convergence *) X_GEN_TAC `t:real` THEN EXPAND_TAC "Y" THEN BETA_TAC THEN - REWRITE_TAC[GEN_CHAR_FN_IM_DIV] THEN - SUBGOAL_THEN `!n:num. gen_char_fn_im (p:A prob_space) + REWRITE_TAC[CHAR_FN_IM_DIV] THEN + SUBGOAL_THEN `!n:num. char_fn_im (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) (t / (sqrt sigma2 * sqrt (&(SUC n)))) = - gen_char_fn_im p (\x. sum(0..n) (\i. X i x)) + char_fn_im p (\x. sum(0..n) (\i. X i x)) (t / sqrt sigma2 / sqrt (&(SUC n)))` ASSUME_TAC THENL [GEN_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_FIELD; ASM_REWRITE_TAC[]] THEN MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `t / sqrt sigma2`] - GEN_CLT_CHAR_FN_IM_CONVERGENCE) THEN + CLT_CHAR_FN_IM_CONVERGENCE) THEN ANTS_TAC THENL [REPEAT CONJ_TAC THENL [ASM_REWRITE_TAC[]; @@ -4471,7 +4568,13750 @@ let INTEGRABLE_CLT = prove ALL_TAC] THEN SIMP_TAC[]]);; -let _ = let oc = open_out "/tmp/hol_compile_ok" in - output_string oc "OK\n"; close_out oc;; +(* ================================================================== *) +(* Kolmogorov Strong Law of Large Numbers *) +(* Removes nonnegativity assumption from NONNEG_SLLN via X = X+ - X- *) +(* ================================================================== *) + + + +(* Negation preserves pairwise independence *) +let INDEP_RV_NEG = prove + (`!p:A prob_space X Y. + indep_rv p X Y ==> indep_rv p (\x. --(X x)) (\x. --(Y x))`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP INDEP_RV_IMP_RV) THEN + REWRITE_TAC[indep_rv] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_NEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_NEG THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REPEAT GEN_TAC THEN + (* {-X <= a} = {X >= -a}, convert to complements of strict ineq sets *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ --(X x) <= a /\ --(Y x) <= b} = + prob_carrier p DIFF + ({x | x IN prob_carrier p /\ X x < --a} UNION + {x | x IN prob_carrier p /\ Y x < --b})` + SUBST1_TAC THENL + [SET_TAC[REAL_ARITH + `!x a:real. --x <= a <=> ~(x < --a)`]; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ --(X x) <= a} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x < --a}` + SUBST1_TAC THENL + [SET_TAC[REAL_ARITH `!x a:real. --x <= a <=> ~(x < --a)`]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ --(Y x) <= b} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ Y x < --b}` + SUBST1_TAC THENL + [SET_TAC[REAL_ARITH `!x b:real. --x <= b <=> ~(x < --b)`]; + ALL_TAC] THEN + (* Get strict inequality independence *) + MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `Y:A->real`] + INDEP_RV_STRICT_INEQ) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + ABBREV_TAC `pXa = prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ X x < --a}` THEN + ABBREV_TAC `pYb = prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ Y x < --b}` THEN + (* Events membership for strict inequality sets *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x < --a} IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_OPEN_HALFLINE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ Y x < --b} IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_OPEN_HALFLINE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Use PROB_COMPL and PROB_UNION *) + SUBGOAL_THEN `prob (p:A prob_space) (prob_carrier p DIFF + ({x:A | x IN prob_carrier p /\ X x < --a} UNION + {x | x IN prob_carrier p /\ Y x < --b})) = + &1 - prob p ({x | x IN prob_carrier p /\ X x < --a} UNION + {x | x IN prob_carrier p /\ Y x < --b})` SUBST1_TAC THENL + [MATCH_MP_TAC PROB_COMPL THEN + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) (prob_carrier p DIFF + {x:A | x IN prob_carrier p /\ X x < --a}) = &1 - pXa` SUBST1_TAC THENL + [EXPAND_TAC "pXa" THEN MATCH_MP_TAC PROB_COMPL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) (prob_carrier p DIFF + {x:A | x IN prob_carrier p /\ Y x < --b}) = &1 - pYb` SUBST1_TAC THENL + [EXPAND_TAC "pYb" THEN MATCH_MP_TAC PROB_COMPL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Inclusion-exclusion for the union *) + SUBGOAL_THEN `prob (p:A prob_space) + ({x:A | x IN prob_carrier p /\ X x < --a} UNION + {x | x IN prob_carrier p /\ Y x < --b}) = + pXa + pYb - prob p ({x | x IN prob_carrier p /\ X x < --a} INTER + {x | x IN prob_carrier p /\ Y x < --b})` SUBST1_TAC THENL + [EXPAND_TAC "pXa" THEN EXPAND_TAC "pYb" THEN + MATCH_MP_TAC PROB_UNION THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Simplify the intersection *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x < --a} INTER + {x | x IN prob_carrier p /\ Y x < --b} = + {x | x IN prob_carrier p /\ X x < --a /\ Y x < --b}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + (* Apply strict inequality independence *) + FIRST_X_ASSUM(MP_TAC o SPECL [`--a:real`; `--b:real`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_SUB_LDISTRIB; REAL_SUB_RDISTRIB; + REAL_MUL_LID; REAL_MUL_RID] THEN + REAL_ARITH_TAC);; + +(* Integrability of max(f, 0)^2 given integrability of f and f^2 *) +let INTEGRABLE_MAX_ZERO_POW2 = prove + (`!p:A prob_space f. + integrable p f /\ integrable p (\x. f x pow 2) + ==> integrable p (\x. max (f x) (&0) pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. (f:A->real) x pow 2` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[ETA_AX]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[ARITH; REAL_ABS_POS] THEN + REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC);; + +(* Variance of max(f, 0) bounded by E[f^2] *) +let VARIANCE_MAX_ZERO_BOUND = prove + (`!p:A prob_space f. + integrable p f /\ integrable p (\x. f x pow 2) + ==> variance p (\x. max (f x) (&0)) <= expectation p (\x. f x pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. max ((f:A->real) x) (&0) pow 2)` THEN + CONJ_TAC THENL + [(* variance(g) = E[g^2] - (Eg)^2 <= E[g^2] *) + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. max ((f:A->real) x) (&0))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. max ((f:A->real) x) (&0) pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. max ((f:A->real) x) (&0)`] + VARIANCE_ALT) THEN + ANTS_TAC THENL + [CONJ_TAC THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ARITH `a - b <= a <=> &0 <= b`; REAL_LE_POW_2]; + (* E[max(f,0)^2] <= E[f^2] by pointwise bound *) + MATCH_MP_TAC EXPECTATION_MONO THEN REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[ETA_AX]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_POW_ZERO; ARITH; REAL_LE_POW_2]; + REWRITE_TAC[REAL_LE_REFL]]]]);; + +(* Variance is invariant under negation *) +let VARIANCE_NEG = prove + (`!p:A prob_space f. random_variable p f ==> + variance p (\x. --(f x)) = variance p f`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[variance] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. --((f:A->real) x)) = + --expectation p f` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_NEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[REAL_NEG_SUB] THEN + SUBGOAL_THEN `(expectation (p:A prob_space) (f:A->real) - f x) pow 2 = + (f x - expectation p f) pow 2` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC);; + +(* Summable variance transfer: Var(X_n)/(n+1)^2 summable implies + Var(max(X_n, 0))/(n+1)^2 summable *) +let SUMMABLE_VARIANCE_MAX_ZERO = prove + (`!p:A prob_space (X:num->A->real) mu. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> real_summable (from 0) + (\n. variance p (\x. max (X n x) (&0)) / &(SUC n) pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\n:num. (variance (p:A prob_space) ((X:num->A->real) n) + + mu pow 2) / &(SUC n) pow 2` THEN + CONJ_TAC THENL + [ALL_TAC; + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN + `variance (p:A prob_space) (\x. max ((X:num->A->real) n x) (&0)) <= + variance p (X n) + mu pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`] + VARIANCE_MAX_ZERO_BOUND) THEN + ANTS_TAC THENL + [CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`] VARIANCE_ALT) THEN + ANTS_TAC THENL + [CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_REWRITE_TAC[ETA_AX] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= variance (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0))` ASSUME_TAC THENL + [MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0) pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[BETA_THM] THEN + ABBREV_TAC `c = expectation (p:A prob_space) + (\x:A. max ((X:num->A->real) n x) (&0))` THEN + SUBGOAL_THEN `(\x:A. (max ((X:num->A->real) n x) (&0) - c) pow 2) = + (\x. (max (X n x) (&0) pow 2 - &2 * c * max (X n x) (&0)) + c pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[INTEGRABLE_CONST]]]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(SUC n) pow 2` ASSUME_TAC THENL + [SIMP_TAC[REAL_POW_LT; REAL_OF_NUM_LT; LT_0]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= variance (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) / &(SUC n) pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + ASM_MESON_TAC[REAL_ABS_REFL; REAL_LE_DIV2_EQ]] THEN + REWRITE_TAC[real_div; REAL_ADD_RDISTRIB] THEN + MATCH_MP_TAC REAL_SUMMABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[GSYM real_div]; ALL_TAC] THEN + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\n:num. inv(&n pow 2)` THEN + CONJ_TAC THENL + [MP_TAC(SPECL [`0`; `2`] REAL_SUMMABLE_ZETA_INTEGER) THEN + REWRITE_TAC[ARITH_RULE `2 <= 2 <=> T`]; + EXISTS_TAC `1` THEN X_GEN_TAC `n:num` THEN + REWRITE_TAC[GE; IN_FROM; LE_0] THEN STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_POW; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_POS; REAL_OF_NUM_LE] THEN ARITH_TAC]]);; + +(* Kolmogorov Strong Law of Large Numbers: pairwise independent random + variables with common mean, common positive-part mean, and summable + variance/(n+1)^2 satisfy the SLLN. Generalizes NONNEG_SLLN by + removing the nonnegativity assumption via X = X+ - X- decomposition. *) +let KOLMOGOROV_SLLN = prove + (`!p:A prob_space (X:num->A->real) mu mu_plus. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu) /\ + (!n. expectation p (\x. max (X n x) (&0)) = mu_plus) /\ + (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: Apply NONNEG_SLLN to positive parts X^+ = max(X, 0) *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max ((X:num->A->real) i x) (&0))) ---> mu_plus) sequentially}` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). max ((X:num->A->real) n x) (&0)`; + `mu_plus:real`] NONNEG_SLLN) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* integrable max(X n, 0) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + (* integrable max(X n, 0)^2 *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + (* nonneg *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + (* expectation = mu_plus *) + ASM_REWRITE_TAC[]; + (* covariance max(X i, 0), max(X j, 0) = 0 *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC COVARIANCE_INDEP THEN REWRITE_TAC[BETA_THM] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MUL_SQUARE THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC INDEP_RV_MAX_CONST THEN + CONV_TAC(DEPTH_CONV ETA_CONV) THEN ASM_SIMP_TAC[]]; + (* summable variance *) + MATCH_MP_TAC SUMMABLE_VARIANCE_MAX_ZERO THEN + EXISTS_TAC `mu:real` THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* Step 2: Apply NONNEG_SLLN to negative parts X^- = max(-X, 0) *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max (--((X:num->A->real) i x)) (&0))) ---> (mu_plus - mu)) sequentially}` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). max (--((X:num->A->real) n x)) (&0)`; + `mu_plus - mu:real`] NONNEG_SLLN) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* integrable max(-X n, 0) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + (* integrable max(-X n, 0)^2 *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. --((X:num->A->real) n x) pow 2) = + (\x. X n x pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_NEG; ARITH] THEN REAL_ARITH_TAC; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]]; + (* nonneg *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + (* E[max(-X n, 0)] = mu_plus - mu *) + GEN_TAC THEN + SUBGOAL_THEN `(\x:A. max (--((X:num->A->real) n x)) (&0)) = + (\x. max (X n x) (&0) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0) - X n x) = + expectation p (\x. max (X n x) (&0)) - expectation p (X n)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUB THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; + (* covariance max(-X i, 0), max(-X j, 0) = 0 *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC COVARIANCE_INDEP THEN REWRITE_TAC[BETA_THM] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MUL_SQUARE THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. --((X:num->A->real) i x) pow 2) = + (\x. X i x pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_NEG; ARITH] THEN + REAL_ARITH_TAC; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]]; + MATCH_MP_TAC INTEGRABLE_MAX_ZERO_POW2 THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. --((X:num->A->real) j x) pow 2) = + (\x. X j x pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_NEG; ARITH] THEN + REAL_ARITH_TAC; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]]]; + MATCH_MP_TAC INDEP_RV_MAX_CONST THEN + MATCH_MP_TAC INDEP_RV_NEG THEN + CONV_TAC(DEPTH_CONV ETA_CONV) THEN ASM_SIMP_TAC[]]; + (* summable Var(max(-X n, 0))/(n+1)^2 *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). --((X:num->A->real) n x)`; `--mu:real`] + SUMMABLE_VARIANCE_MAX_ZERO) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_NEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN + SUBGOAL_THEN `(\x:A. --((X:num->A->real) n x) pow 2) = + (\x. X n x pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_NEG; ARITH] THEN + REAL_ARITH_TAC; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + GEN_TAC THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. --((X:num->A->real) n x)) = --(expectation p (X n))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_NEG THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `(\n. variance (p:A prob_space) + (\x. --((X:num->A->real) n x)) / &(SUC n) pow 2) = + (\n. variance p (X n) / &(SUC n) pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC VARIANCE_NEG THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]]; + REWRITE_TAC[]]]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* Step 3: Combine via X = X+ - X- and limit subtraction *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max ((X:num->A->real) i x) (&0))) ---> mu_plus) sequentially} INTER + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max (--(X i x)) (&0))) ---> (mu_plus - mu)) sequentially}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN + (* Establish: sum(X i x) = sum(max(X i x, 0)) - sum(max(-X i x, 0)) *) + SUBGOAL_THEN + `!n:num. sum(0..n) (\i. (X:num->A->real) i (x:A)) = + sum(0..n) (\i. max (X i x) (&0)) - + sum(0..n) (\i. max (--(X i x)) (&0))` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(\n:num. inv(&(SUC n)) * sum(0..n) + (\i. (X:num->A->real) i (x:A))) = + (\n. inv(&(SUC n)) * sum(0..n) (\i. max (X i x) (&0)) - + inv(&(SUC n)) * sum(0..n) (\i. max (--(X i x)) (&0)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; BETA_THM] THEN X_GEN_TAC `nn:num` THEN + ASM_REWRITE_TAC[REAL_SUB_LDISTRIB]; ALL_TAC] THEN + SUBGOAL_THEN `mu:real = mu_plus - (mu_plus - mu)` SUBST1_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_SUB THEN ASM_REWRITE_TAC[]]);; + +(* ===================================================================== *) +(* IID STRONG LAW OF LARGE NUMBERS (finite first moment only) *) +(* ===================================================================== *) + +(* Independence preserved under min with DIFFERENT constants *) +let INDEP_RV_MIN_DIFF_CONST = prove + (`!p:A prob_space X Y c d. + indep_rv p X Y + ==> indep_rv p (\x. min (X x) c) (\x. min (Y x) d)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o MATCH_MP INDEP_RV_IMP_RV) THEN + REWRITE_TAC[indep_rv] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + ALL_TAC] THEN + REPEAT GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [indep_rv]) THEN + STRIP_TAC THEN + ASM_CASES_TAC `c <= a` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((X:A->real) x) c <= a} = + prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((X:A->real) x) c <= a /\ + min ((Y:A->real) x) d <= b} = + {x | x IN prob_carrier p /\ min (Y x) d <= b}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[PROB_SPACE; REAL_MUL_LID]; + ALL_TAC] THEN + ASM_CASES_TAC `d <= b` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((Y:A->real) x) d <= b} = + prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((X:A->real) x) c <= a /\ + min ((Y:A->real) x) d <= b} = + {x | x IN prob_carrier p /\ min (X x) c <= a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[PROB_SPACE; REAL_MUL_RID]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((X:A->real) x) c <= a} = + {x | x IN prob_carrier p /\ X x <= a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((Y:A->real) x) d <= b} = + {x | x IN prob_carrier p /\ Y x <= b}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ min ((X:A->real) x) c <= a /\ + min ((Y:A->real) x) d <= b} = + {x | x IN prob_carrier p /\ X x <= a /\ Y x <= b}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[]);; + +(* Equal CDFs imply equal tail probabilities *) +let EQUIDIST_TAIL_PROB_GT = prove + (`!p:A prob_space X Y c. + random_variable p X /\ random_variable p Y /\ + (!a. distribution_fn p X a = distribution_fn p Y a) + ==> prob p {x | x IN prob_carrier p /\ X x > c} = + prob p {x | x IN prob_carrier p /\ Y x > c}`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x > c} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x <= c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + GEN_TAC THEN ASM_CASES_TAC `x:A IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ Y x > c} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ Y x <= c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + GEN_TAC THEN ASM_CASES_TAC `x:A IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x <= c} IN prob_events p /\ + {x:A | x IN prob_carrier p /\ Y x <= c} IN prob_events p` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN FIRST_ASSUM(fun th -> + ACCEPT_TAC(SPEC `c:real` (REWRITE_RULE[random_variable] th))); + ALL_TAC] THEN + ASM_SIMP_TAC[PROB_COMPL] THEN + REWRITE_TAC[GSYM distribution_fn] THEN ASM_REWRITE_TAC[]);; + +(* Riemann sum lower bound for min(x, c): pointwise real inequality *) +(* Proof: telescoping comparison with min(z, k*c/N) *) +let RIEMANN_LOWER_MIN = prove + (`!z c N. &0 <= z /\ &0 < c /\ ~(N = 0) ==> + sum(1..N) (\k. if z > &k * c / &N then c / &N else &0) <= min z c /\ + min z c <= sum(1..N) (\k. if z > &k * c / &N then c / &N else &0) + c / &N`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `&0 < &N /\ ~(&N = &0)` STRIP_ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < c / &N` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LT_DIV]; ALL_TAC] THEN + SUBGOAL_THEN `1 <= N` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `0 <= N - 1` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + (* Shift index: sum(1..N)(f) = sum(0..N-1)(f(i+1)) *) + SUBGOAL_THEN + `sum(1..N) (\k. if z > &k * c / &N then c / &N else &0) = + sum(0..N-1) (\i. if z > &(i + 1) * c / &N then c / &N else &0)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; + ALL_TAC] THEN + (* Helper: &(i+1)*c/N - &i*c/N = c/N *) + SUBGOAL_THEN `!i:num. &(i + 1) * c / &N - &i * c / &N = c / &N` + ASSUME_TAC THENL + [GEN_TAC THEN ONCE_REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN + REWRITE_TAC[REAL_ARITH `(&i + &1) * c / n - &i * c / n = c / n`]; + ALL_TAC] THEN + (* Telescoping: sum(0..N-1)(min z ((k+1)*c/N) - min z (k*c/N)) = min z c *) + SUBGOAL_THEN + `sum(0..N-1) (\k. min z (&(k + 1) * c / &N) - min z (&k * c / &N)) = + min z c` + ASSUME_TAC THENL + [MP_TAC(CONV_RULE(ONCE_DEPTH_CONV BETA_CONV) + (INST [`\k:num. min z (&k * c / &N)`, `f:num->real`] + (SPECL [`0`; `N - 1`] SUM_DIFFS_ALT))) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `N - 1 + 1 = N` SUBST1_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + SUBGOAL_THEN `&N * c * inv(&N) = c` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_FIELD `~(n = &0) ==> n * c * inv n = c`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `min z (&0) = &0` SUBST1_TAC THENL + [UNDISCH_TAC `&0 <= z` THEN REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Telescoping for left endpoint *) + SUBGOAL_THEN + `sum(0..N-1) (\k. (if z > &(k + 1) * c / &N then c / &N else &0) - + (if z > &k * c / &N then c / &N else &0)) = + (if z > &N * c / &N then c / &N else &0) - + (if z > &0 * c / &N then c / &N else &0)` + ASSUME_TAC THENL + [MP_TAC(CONV_RULE(ONCE_DEPTH_CONV BETA_CONV) + (INST [`\k:num. if z > &k * c / &N then c / &N else &0`, `f:num->real`] + (SPECL [`0`; `N - 1`] SUM_DIFFS_ALT))) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `N - 1 + 1 = N` SUBST1_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REFL_TAC; + ALL_TAC] THEN + (* sum(left) - sum(right) = left(0) - left(N) *) + SUBGOAL_THEN + `sum(0..N-1) (\i. if z > &i * c / &N then c / &N else &0) - + sum(0..N-1) (\i. if z > &(i + 1) * c / &N then c / &N else &0) = + (if z > &0 * c / &N then c / &N else &0) - + (if z > &N * c / &N then c / &N else &0)` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + ONCE_REWRITE_TAC[REAL_ARITH `(a:real) - b = --(b - a)`] THEN + REWRITE_TAC[SUM_NEG] THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ + (* === Lower bound: sum(0..N-1)(right) <= min z c === *) + FIRST_X_ASSUM(fun tele -> + GEN_REWRITE_TAC RAND_CONV [GSYM tele]) THEN + MATCH_MP_TAC SUM_LE_NUMSEG THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + COND_CASES_TAC THENL + [(* z > (i+1)*c/N: c/N <= min z ((i+1)*c/N) - min z (i*c/N) *) + SUBGOAL_THEN `min z (&(i + 1) * c / &N) = &(i + 1) * c / &N` + SUBST1_TAC THENL + [UNDISCH_TAC `z > &(i + 1) * c / &N` THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `min z (&i * c / &N) = &i * c / &N` + SUBST1_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + UNDISCH_TAC `z > &(i + 1) * c / &N` THEN + UNDISCH_TAC `&0 < c / &N` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_LE_REFL]; + (* ~(z > (i+1)*c/N): 0 <= min z ((i+1)*c/N) - min z (i*c/N) *) + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + UNDISCH_TAC `~(z > &(i + 1) * c / &N)` THEN + UNDISCH_TAC `&0 < c / &N` THEN REAL_ARITH_TAC + ]; + (* === Upper bound: min z c <= sum(0..N-1)(right) + c/N === *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..N-1) (\i. if z > &i * c / &N then c / &N else &0)` THEN + CONJ_TAC THENL + [ + (* min z c <= left endpoint sum *) + FIRST_X_ASSUM(fun tele -> + GEN_REWRITE_TAC LAND_CONV [GSYM tele]) THEN + MATCH_MP_TAC SUM_LE_NUMSEG THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + COND_CASES_TAC THENL + [(* z > i*c/N: diff <= c/N *) + SUBGOAL_THEN `min z (&i * c / &N) = &i * c / &N` + SUBST1_TAC THENL + [UNDISCH_TAC `z > &i * c / &N` THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `min z (&(i + 1) * c / &N) <= &(i + 1) * c / &N` + MP_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN REAL_ARITH_TAC; + (* ~(z > i*c/N): diff <= 0 *) + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + UNDISCH_TAC `~(z > &i * c / &N)` THEN + UNDISCH_TAC `&0 < c / &N` THEN REAL_ARITH_TAC + ]; + (* left endpoint sum <= right endpoint sum + c/N *) + MATCH_MP_TAC(REAL_ARITH `s1 - s2 <= h ==> s1 <= s2 + h`) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_MUL_LZERO; REAL_ARITH `&0 / x = &0`; + REAL_ARITH `z > &0 <=> &0 < z`] THEN + REPEAT COND_CASES_TAC THEN + UNDISCH_TAC `&0 < c / &N` THEN REAL_ARITH_TAC + ] + ]);; -(* End of probability theory development *) +(* E[if X > t then a else 0] = a * P(X > t) for random variable X *) +let EXPECTATION_IF_GT = prove + (`!p:A prob_space (X:A->real) t a. + random_variable p X /\ &0 <= a + ==> integrable p (\x. if X x > t then a else &0) /\ + expectation p (\x. if X x > t then a else &0) = + a * prob p {x | x IN prob_carrier p /\ X x > t}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x > t} IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. a * indicator_fn {x | x IN prob_carrier p /\ X x > t} x)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `a:real`; + `indicator_fn {x:A | x IN prob_carrier p /\ X x > t}`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + (if X x > t then a else &0) = + a * indicator_fn {x | x IN prob_carrier p /\ X x > t} x` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `random_variable p (\x:A. if X x > t then a else &0)` + ASSUME_TAC THENL + [REWRITE_TAC[random_variable] THEN X_GEN_TAC `c:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (if X x > t then a else &0) <= c} = + {x | x IN prob_carrier p /\ + a * indicator_fn {x | x IN prob_carrier p /\ X x > t} x <= c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_SIMP_TAC[] THEN + REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(MATCH_MP INTEGRABLE_IMP_RANDOM_VARIABLE + (ASSUME `integrable p + (\x:A. a * indicator_fn {x | x IN prob_carrier p /\ X x > t} x)`)) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(fun th -> ACCEPT_TAC(SPEC `c:real` th)); ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. if X x > t then a else &0)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `a:real` THEN + ASM_REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + UNDISCH_TAC `&0 <= a` THEN COND_CASES_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `expectation p (\x:A. if X x > t then a else &0) = + expectation p (\x. a * indicator_fn {x | x IN prob_carrier p /\ X x > t} x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `a:real`; + `indicator_fn {x:A | x IN prob_carrier p /\ X x > t}`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]);; + +(* Squeeze lemma: if |a - b| <= c/N for all N >= 1 then a = b *) +let REAL_EQ_SQUEEZE_DIV = prove + (`!a b c. &0 < c /\ (!N. ~(N = 0) ==> abs(a - b) <= c / &N) ==> a = b`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `(~(a:real = b) ==> F) ==> a = b`) THEN + DISCH_TAC THEN + SUBGOAL_THEN `&0 < abs(a - b:real)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPEC `abs(a - b:real)` REAL_ARCH) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `c:real`) THEN + DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN + SUBGOAL_THEN `~(n = 0)` ASSUME_TAC THENL + [DISCH_TAC THEN UNDISCH_TAC `c < &n * abs(a - b:real)` THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `&0 < &n` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(a - b:real) * &n <= c` MP_TAC THENL + [SUBGOAL_THEN `abs(a - b:real) <= c / &n <=> abs(a - b) * &n <= c` + MP_TAC THENL + [MATCH_MP_TAC REAL_LE_RDIV_EQ THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + UNDISCH_TAC `c < &n * abs(a - b:real)` THEN + REWRITE_TAC[REAL_MUL_SYM] THEN REAL_ARITH_TAC);; + +(* For equidistributed nonneg RVs, expectations of min-truncation are equal *) +(* Proof: Riemann sum squeeze -- both E[min(X,c)] and E[min(Y,c)] are within *) +(* c/N of E[sum(1..N)(if f > k*c/N then c/N else 0)], and the latter is the *) +(* same for X and Y by EQUIDIST_TAIL_PROB_GT. *) +let EQUIDIST_NONNEG_MIN_EXPECTATION = prove + (`!p:A prob_space X Y c. + random_variable p X /\ random_variable p Y /\ + (!x. x IN prob_carrier p ==> &0 <= X x) /\ + (!x. x IN prob_carrier p ==> &0 <= Y x) /\ + (!a. distribution_fn p X a = distribution_fn p Y a) /\ + &0 < c + ==> expectation p (\x. min (X x) c) = expectation p (\x. min (Y x) c)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_EQ_SQUEEZE_DIV THEN EXISTS_TAC `c:real` THEN + ASM_REWRITE_TAC[] THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN + (* Integrability of min(X,c) *) + SUBGOAL_THEN `integrable p (\x:A. min (X x) c)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `c:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A` o + check (fun th -> free_in `X:A->real` (concl th))) THEN + ASM_REWRITE_TAC[] THEN UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Integrability of min(Y,c) *) + SUBGOAL_THEN `integrable p (\x:A. min (Y x) c)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `c:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A` o + check (fun th -> free_in `Y:A->real` (concl th))) THEN + ASM_REWRITE_TAC[] THEN UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Integrability of each Riemann sum term *) + SUBGOAL_THEN + `!k. integrable p (\x:A. if X x > &k * c / &N then c / &N else &0)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `&k * c / &N`; `c / &N`] + EXPECTATION_IF_GT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1]; + SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN + `!k. integrable p (\x:A. if Y x > &k * c / &N then c / &N else &0)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `&k * c / &N`; `c / &N`] + EXPECTATION_IF_GT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1]; + SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `1 <= N` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + (* Integrability of X Riemann sum *) + SUBGOAL_THEN + `integrable p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0))` + ASSUME_TAC THENL + [SUBGOAL_THEN + `(\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) = + (\x. sum(0..N-1) + (\i. (\j x. if X x > &j * c / &N then c / &N else &0) (i+1) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + ASM_SIMP_TAC[SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Integrability of Y Riemann sum *) + SUBGOAL_THEN + `integrable p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0))` + ASSUME_TAC THENL + [SUBGOAL_THEN + `(\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) = + (\x. sum(0..N-1) + (\i. (\j x. if Y x > &j * c / &N then c / &N else &0) (i+1) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + ASM_SIMP_TAC[SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Reduce to 5 subgoals via real arithmetic *) + SUBGOAL_THEN + `expectation p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) <= + expectation p (\x. min (X x) c) /\ + expectation p (\x. min (X x) c) <= + expectation p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) + + c / &N /\ + expectation p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) <= + expectation p (\x. min (Y x) c) /\ + expectation p (\x. min (Y x) c) <= + expectation p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) + + c / &N /\ + expectation p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) = + expectation p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0))` + MP_TAC THENL [ALL_TAC; REAL_ARITH_TAC] THEN + (* Lower bound X: E[rsum_X] <= E[min(X,c)] via RIEMANN_LOWER_MIN *) + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(X:A->real) x`; `c:real`; `N:num`] RIEMANN_LOWER_MIN) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; ALL_TAC] THEN + (* Upper bound X: E[min(X,c)] <= E[rsum_X] + c/N *) + CONJ_TAC THENL + [SUBGOAL_THEN + `expectation p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) + + c / &N = + expectation p + (\x. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0) + + c / &N)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)`; + `\x:A. c / &N`] EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(X:A->real) x`; `c:real`; `N:num`] RIEMANN_LOWER_MIN) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; ALL_TAC] THEN + (* Lower bound Y *) + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(Y:A->real) x`; `c:real`; `N:num`] RIEMANN_LOWER_MIN) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; ALL_TAC] THEN + (* Upper bound Y *) + CONJ_TAC THENL + [SUBGOAL_THEN + `expectation p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) + + c / &N = + expectation p + (\x. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0) + + c / &N)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)`; + `\x:A. c / &N`] EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(Y:A->real) x`; `c:real`; `N:num`] RIEMANN_LOWER_MIN) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; SIMP_TAC[]]; ALL_TAC] THEN + (* Equality E[rsum_X] = E[rsum_Y] via tail probability equality *) + (* Convert E[sum(1..N)(...)] to sum(1..N)(E[...]) for both X and Y *) + SUBGOAL_THEN + `expectation p + (\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) = + sum(1..N) + (\k. expectation p (\x. if X x > &k * c / &N then c / &N else &0))` + SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. sum(1..N) (\k. if X x > &k * c / &N then c / &N else &0)) = + (\x. sum(0..N-1) + (\i. (\x. if X x > &(i + 1) * c / &N then c / &N else &0) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN REWRITE_TAC[] THEN + ASM_SIMP_TAC[SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\i:num. (\x:A. if X x > &(i+1) * c / &N then c / &N else &0)`; + `N - 1`] EXPECTATION_SUM) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN ASM_SIMP_TAC[GSYM SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p + (\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) = + sum(1..N) + (\k. expectation p (\x. if Y x > &k * c / &N then c / &N else &0))` + SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. sum(1..N) (\k. if Y x > &k * c / &N then c / &N else &0)) = + (\x. sum(0..N-1) + (\i. (\x. if Y x > &(i + 1) * c / &N then c / &N else &0) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN REWRITE_TAC[] THEN + ASM_SIMP_TAC[SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\i:num. (\x:A. if Y x > &(i+1) * c / &N then c / &N else &0)`; + `N - 1`] EXPECTATION_SUM) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN ASM_SIMP_TAC[GSYM SUM_OFFSET_0] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN SIMP_TAC[ADD_CLAUSES]; ALL_TAC] THEN + (* Each term is equal by EXPECTATION_IF_GT + EQUIDIST_TAIL_PROB_GT *) + MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `&0 <= c / &N` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; LE_1]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `&k * c / &N`; `c / &N`] + EXPECTATION_IF_GT) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Y:A->real`; `&k * c / &N`; `c / &N`] + EXPECTATION_IF_GT) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN AP_TERM_TAC THEN + MATCH_MP_TAC EQUIDIST_TAIL_PROB_GT THEN ASM_REWRITE_TAC[]);; + +(* Equidistributed expectations of min-squared-truncation *) +let EQUIDIST_NONNEG_MIN_SQ_EXPECTATION = prove + (`!p:A prob_space X Y c. + random_variable p X /\ random_variable p Y /\ + (!x. x IN prob_carrier p ==> &0 <= X x) /\ + (!x. x IN prob_carrier p ==> &0 <= Y x) /\ + (!a. distribution_fn p X a = distribution_fn p Y a) /\ + &0 < c + ==> expectation p (\x. min (X x) c pow 2) = + expectation p (\x. min (Y x) c pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Key identity: min z c pow 2 = min (z^2) (c^2) for nonneg z *) + SUBGOAL_THEN `!z. &0 <= z ==> min z c pow 2 = min (z pow 2) (c pow 2)` + ASSUME_TAC THENL + [X_GEN_TAC `z:real` THEN DISCH_TAC THEN + REWRITE_TAC[real_min] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN REWRITE_TAC[] THENL + [SUBGOAL_THEN `z pow 2 <= c pow 2` MP_TAC THENL + [MATCH_MP_TAC REAL_POW_LE2 THEN ASM_ARITH_TAC; + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `c pow 2 <= z pow 2` MP_TAC THENL + [MATCH_MP_TAC REAL_POW_LE2 THEN ASM_ARITH_TAC; + ASM_ARITH_TAC]]; + ALL_TAC] THEN + (* Rewrite LHS: E[min(X,c)^2] = E[min(X^2,c^2)] *) + SUBGOAL_THEN + `expectation p (\x:A. min (X x) c pow 2) = + expectation p (\x. min (X x pow 2) (c pow 2))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN + DISCH_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Rewrite RHS: E[min(Y,c)^2] = E[min(Y^2,c^2)] *) + SUBGOAL_THEN + `expectation p (\x:A. min (Y x) c pow 2) = + expectation p (\x. min (Y x pow 2) (c pow 2))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN + DISCH_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Apply EQUIDIST_NONNEG_MIN_EXPECTATION to X^2, Y^2 with constant c^2 *) + MATCH_MP_TAC EQUIDIST_NONNEG_MIN_EXPECTATION THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SQUARE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_SQUARE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + (* CDF equality for squared functions *) + X_GEN_TAC `a':real` THEN REWRITE_TAC[distribution_fn] THEN + ASM_CASES_TAC `a' < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x pow 2 <= a'} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN + MP_TAC(SPEC `(X:A->real) x` REAL_LE_POW_2) THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ Y x pow 2 <= a'} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN + MP_TAC(SPEC `(Y:A->real) x` REAL_LE_POW_2) THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= a'` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* For nonneg X: {X^2 <= a'} = {X <= sqrt(a')} *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x pow 2 <= a'} = + {x | x IN prob_carrier p /\ X x <= sqrt a'}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [MATCH_MP_TAC REAL_LE_RSQRT THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&0 <= (X:A->real) x` ASSUME_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`2`; `(X:A->real) x`; `sqrt a'`] REAL_POW_LE2) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[SQRT_POW_2]]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ Y x pow 2 <= a'} = + {x | x IN prob_carrier p /\ Y x <= sqrt a'}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [MATCH_MP_TAC REAL_LE_RSQRT THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&0 <= (Y:A->real) x` ASSUME_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`2`; `(Y:A->real) x`; `sqrt a'`] REAL_POW_LE2) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[SQRT_POW_2]]; + ALL_TAC] THEN + ASM_REWRITE_TAC[GSYM distribution_fn]; + (* &0 < c pow 2 *) + MATCH_MP_TAC REAL_POW_LT THEN ASM_REWRITE_TAC[]]);; + +(* Equidistributed max-zero preserves CDF equality *) +let EQUIDIST_MAX_ZERO = prove + (`!p:A prob_space X Y. + random_variable p X /\ random_variable p Y /\ + (!a. distribution_fn p X a = distribution_fn p Y a) + ==> !a. distribution_fn p (\x. max (X x) (&0)) a = + distribution_fn p (\x. max (Y x) (&0)) a`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[distribution_fn] THEN + ASM_CASES_TAC `a < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (X x) (&0) <= a} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (Y x) (&0) <= a} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= a` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (X x) (&0) <= a} = + {x | x IN prob_carrier p /\ X x <= a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (Y x) (&0) <= a} = + {x | x IN prob_carrier p /\ Y x <= a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[GSYM distribution_fn]);; + +(* Equidistributed strict inequality probability *) +let EQUIDIST_PROB_LT = prove + (`!p:A prob_space X Y c. + random_variable p X /\ random_variable p Y /\ + (!a. distribution_fn p X a = distribution_fn p Y a) + ==> prob p {x | x IN prob_carrier p /\ X x < c} = + prob p {x | x IN prob_carrier p /\ Y x < c}`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `!f:A->real. random_variable p f ==> + ((\m. prob p {x:A | x IN prob_carrier p /\ f x <= c - inv(&(m + 1))}) + ---> prob p {x | x IN prob_carrier p /\ f x < c}) sequentially` + ASSUME_TAC THENL + [X_GEN_TAC `f:A->real` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\m:num. {x:A | x IN prob_carrier p /\ f x <= c - inv(&(m + 1))}`] + PROB_CONTINUITY_FROM_BELOW) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN + FIRST_ASSUM(fun th -> + ACCEPT_TAC(SPEC `c - inv(&(n + 1))` + (REWRITE_RULE[random_variable] th))); + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `c - inv(&(n + 1))` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `c - x <= c - y <=> y <= x`] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `UNIONS {{x:A | x IN prob_carrier p /\ f x <= c - inv(&(n + 1))} | + n IN (:num)} = + {x | x IN prob_carrier p /\ f x < c}` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[EXTENSION] THEN X_GEN_TAC `y:A` THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM; IN_UNIV] THEN + EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `t:A->bool` + (CONJUNCTS_THEN2 (X_CHOOSE_TAC `n:num`) ASSUME_TAC)) THEN + FIRST_X_ASSUM SUBST_ALL_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `c - inv(&(n + 1))` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `c - x < c <=> &0 < x`] THEN + MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + ARITH_TAC; + STRIP_TAC THEN + MP_TAC(GEN_REWRITE_RULE I [REAL_ARCH_INV] + (REAL_ARITH `(f:A->real) y < c ==> &0 < c - f y` + |> C MP (ASSUME `(f:A->real) y < c`))) THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `{y':A | y' IN prob_carrier p /\ + f y' <= c - inv(&((m - 1) + 1))}` THEN + CONJ_TAC THENL + [EXISTS_TAC `m - 1` THEN REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(m - 1) + 1 = m` SUBST1_TAC THENL + [ASM_ARITH_TAC; ASM_REAL_ARITH_TAC]]]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`sequentially`; + `\m:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ X x <= c - inv(&(m + 1))}`; + `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ X x < c}`; + `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ Y x < c}`] + REALLIM_UNIQUE) THEN + DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `X:A->real`) THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\m. prob p {x:A | x IN prob_carrier p /\ + X x <= c - inv (&(m + 1))}) = + (\m. prob p {x:A | x IN prob_carrier p /\ + Y x <= c - inv (&(m + 1))})` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + ASM_REWRITE_TAC[GSYM distribution_fn]; + FIRST_X_ASSUM(MP_TAC o SPEC `Y:A->real`) THEN ASM_REWRITE_TAC[]]]);; + +(* Equidist neg-max-zero: distribution_fn of max(-X, 0) *) +let EQUIDIST_NEG_MAX_ZERO = prove + (`!p:A prob_space X Y. + random_variable p X /\ random_variable p Y /\ + (!a. distribution_fn p X a = distribution_fn p Y a) + ==> !a. distribution_fn p (\x. max (--(X x)) (&0)) a = + distribution_fn p (\x. max (--(Y x)) (&0)) a`, + REPEAT STRIP_TAC THEN REWRITE_TAC[distribution_fn] THEN + ASM_CASES_TAC `a < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (--(X x)) (&0) <= a} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (--(Y x)) (&0) <= a} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= a` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (--(X x)) (&0) <= a} = + {x | x IN prob_carrier p /\ X x >= --a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ max (--(Y x)) (&0) <= a} = + {x | x IN prob_carrier p /\ Y x >= --a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x >= --a} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x < --a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ Y x >= --a} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ Y x < --a}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x < --a} IN prob_events p /\ + {x:A | x IN prob_carrier p /\ Y x < --a} IN prob_events p` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x < --a} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x >= --a}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ Y x < --a} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ Y x >= --a}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ASM_SIMP_TAC[PROB_COMPL] THEN AP_TERM_TAC THEN + MATCH_MP_TAC EQUIDIST_PROB_LT THEN ASM_REWRITE_TAC[]);; + +(* Nonneg equidistributed integrable functions have equal expectations *) +let EQUIDIST_NONNEG_EXPECTATION = prove + (`!p:A prob_space f g. + integrable p f /\ integrable p g /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + (!a. distribution_fn p f a = distribution_fn p g a) + ==> expectation p f = expectation p g`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `((\n. expectation (p:A prob_space) + (\x. min ((f:A->real) x) (&n))) ---> expectation p f) sequentially` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`] EXPECTATION_MIN_ABS_LIMIT) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. abs ((f:A->real) x)) = + expectation p f` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN DISCH_TAC THEN + BETA_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. min (abs ((f:A->real) x)) (&n)) = + expectation p (\x. min (f x) (&n))` (fun th -> REWRITE_TAC[th]) THEN + GEN_TAC THEN MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN + DISCH_TAC THEN BETA_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `((\n. expectation (p:A prob_space) + (\x. min ((g:A->real) x) (&n))) ---> expectation p g) sequentially` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] EXPECTATION_MIN_ABS_LIMIT) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. abs ((g:A->real) x)) = + expectation p g` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN DISCH_TAC THEN + BETA_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. min (abs ((g:A->real) x)) (&n)) = + expectation p (\x. min (g x) (&n))` (fun th -> REWRITE_TAC[th]) THEN + GEN_TAC THEN MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN + DISCH_TAC THEN BETA_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`sequentially`; + `\n. expectation (p:A prob_space) (\x. min ((f:A->real) x) (&n))`; + `expectation (p:A prob_space) (f:A->real)`; + `expectation (p:A prob_space) (g:A->real)`] REALLIM_UNIQUE) THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(\n. expectation (p:A prob_space) + (\x. min ((f:A->real) x) (&n))) = + (\n. expectation p (\x. min ((g:A->real) x) (&n)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `n:num` THEN + ASM_CASES_TAC `n = 0` THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `&0 <= (f:A->real) z /\ &0 <= (g:A->real) z` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC EQUIDIST_NONNEG_MIN_EXPECTATION THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + ASM_REWRITE_TAC[]] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY] o + check (fun th -> free_in `g:A->real` (concl th) && + not(free_in `f:A->real` (concl th)))) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `MAX N 1` THEN REPEAT STRIP_TAC THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. min ((f:A->real) x) (&n)) = + expectation p (\x. min ((g:A->real) x) (&n))` SUBST1_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]);; + +(* ================================================================= *) +(* IID SLLN for nonneg RVs with finite first moment *) +(* ================================================================= *) + +let IID_SLLN_NONNEG = prove + (`!p:A prob_space (X:num->A->real) mu. + (!n. integrable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n. expectation p (X n) = mu) /\ + (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!n a. distribution_fn p (X n) a = distribution_fn p (X 0) a) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) + sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* mu >= 0 from nonnegativity *) + SUBGOAL_THEN `&0 <= mu` ASSUME_TAC THENL + [SUBGOAL_THEN `mu = expectation p ((X:num->A->real) 0)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Decompose: S_n/(n+1) = S'_n/(n+1) + error/(n+1) *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. min ((X:num->A->real) i x) (&(SUC i)))) ---> mu) + sequentially} INTER + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. X i x - min (X i x) (&(SUC i)))) ---> &0) + sequentially}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [(* Part 1: truncated averages -> mu *) + (* Asm 6: !n. random_variable p (X n) *) + SUBGOAL_THEN `!n. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Asm 7: !n. integrable p (\x. min (X n x) (&(SUC n))) *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MIN THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + (* Asm 8: !n x. x IN carrier ==> 0 <= min(X n x, SUC n) *) + SUBGOAL_THEN `!n (y:A). y IN prob_carrier p ==> + &0 <= min ((X:num->A->real) n y) (&(SUC n))` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + CONJ_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_POS]]; + ALL_TAC] THEN + (* Asm 9: !n. integrable p (\x. min(X n x, SUC n) pow 2) *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&(SUC n) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SQUARE THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= a ==> abs x <= a`) THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_POS]]; + MP_TAC(ISPECL [`(X:num->A->real) n y`; `&(SUC n)`] REAL_MIN_MIN) THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Asm 10: (\n. E[min(X 0, SUC n)]) -> mu *) + SUBGOAL_THEN `((\n. expectation (p:A prob_space) + (\x. min ((X:num->A->real) 0 x) (&(SUC n)))) ---> mu) sequentially` + ASSUME_TAC THENL + [SUBGOAL_THEN `((\n. expectation (p:A prob_space) + (\x. min ((X:num->A->real) 0 x) (&n))) ---> mu) sequentially` + MP_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`] + EXPECTATION_MIN_ABS_LIMIT) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. abs ((X:num->A->real) 0 x)) = mu` SUBST1_TAC THENL + [SUBGOAL_THEN `expectation (p:A prob_space) + (\x. abs ((X:num->A->real) 0 x)) = + expectation p (X 0)` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN + DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + SUBGOAL_THEN `&0 <= (X:num->A->real) 0 z` + (fun th -> REWRITE_TAC[th]) THEN + FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + DISCH_THEN(fun th -> MP_TAC th) THEN + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. min (abs ((X:num->A->real) 0 x)) (&n)) = + expectation p (\x. min (X 0 x) (&n))` + (fun th -> REWRITE_TAC[th]) THEN + GEN_TAC THEN MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `z:A` THEN DISCH_TAC THEN + BETA_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + SUBGOAL_THEN `&0 <= (X:num->A->real) 0 z` + (fun th -> REWRITE_TAC[th]) THEN + FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(fun th -> X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e:real` th)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `SUC n`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[]]; + ALL_TAC] THEN + (* Asm 11: !n. E[min(X n, SUC n)] = E[min(X 0, SUC n)] *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n))) = + expectation p (\x. min (X 0 x) (&(SUC n)))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC EQUIDIST_NONNEG_MIN_EXPECTATION THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN + REWRITE_TAC[]; + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]]; + ALL_TAC] THEN + (* Asm 12: !n. E[min(X n, SUC n)^2] = E[min(X 0, SUC n)^2] *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)) pow 2) = + expectation p (\x. min (X 0 x) (&(SUC n)) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC EQUIDIST_NONNEG_MIN_SQ_EXPECTATION THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN + REWRITE_TAC[]; + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]]; + ALL_TAC] THEN + (* Asm 13: !n. 0 <= Var(Y_n) *) + SUBGOAL_THEN `!n. &0 <= variance (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN BETA_TAC THEN + ABBREV_TAC `c = expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)))` THEN + SUBGOAL_THEN `(\x:A. (min ((X:num->A->real) n x) (&(SUC n)) - c) pow 2) = + (\x. min (X n x) (&(SUC n)) pow 2 + + (--(&2 * c) * min (X n x) (&(SUC n)) + c pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]]]; + ALL_TAC] THEN + (* Asm 14: variance summability *) + SUBGOAL_THEN `real_summable (from 0) + (\n. variance (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n))) / &(SUC n) pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\n. expectation (p:A prob_space) + (\x. min ((X:num->A->real) 0 x) (&(SUC n)) pow 2) / + &(SUC n) pow 2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC TRUNCATED_VARIANCE_SUMMABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + EXISTS_TAC `0` THEN REWRITE_TAC[IN_FROM; GE] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[REAL_LE_POW_2]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(SUC n) pow 2` ASSUME_TAC THENL + [SIMP_TAC[REAL_POW_LT; REAL_OF_NUM_LT; LT_0]; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)) pow 2)` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x. min ((X:num->A->real) n x) (&(SUC n))`] VARIANCE_ALT) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ARITH `a - b <= a <=> &0 <= b`; REAL_LE_POW_2]; + ASM_REWRITE_TAC[REAL_LE_REFL]]; + ALL_TAC] THEN + (* Main: reduce to convergence along all gseq b *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `INTERS + {(\b:num. {x:A | + ((\k. inv(&(gseq b k)) * + sum(0..gseq b k - 1) + (\i. min ((X:num->A->real) i x) (&(SUC i)) - + expectation p (\y. min (X i y) (&(SUC i))))) + ---> &0) sequentially}) b | b IN (:num)}` THEN + CONJ_TAC THENL + [(* Almost sure convergence along gseq for all b *) + MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN + BETA_TAC THEN GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). min ((X:num->A->real) n x) (&(SUC n)) - + expectation p (\y. min (X n y) (&(SUC n)))`; + `b:num`] SLLN_SUBSEQ_GSEQ) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN REPEAT CONJ_TAC THENL + [(* integrable (\x. min(X n x, SUC n) - E[...]) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + (* integrable (\x. (min(X n x, SUC n) - E[...]) pow 2) *) + GEN_TAC THEN + ABBREV_TAC `c = expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n)))` THEN + SUBGOAL_THEN + `(\x:A. (min ((X:num->A->real) n x) (&(SUC n)) - c) pow 2) = + (\x. min (X n x) (&(SUC n)) pow 2 + + (--(&2 * c) * min (X n x) (&(SUC n)) + c pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]]]; + (* expectation (\x. min(X n x, SUC n) - E[...]) = 0 *) + GEN_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o + lhand o snd) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + REWRITE_TAC[REAL_SUB_REFL]; + (* covariance = 0 *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `covariance (p:A prob_space) + (\x. min ((X:num->A->real) i x) (&(SUC i)) - + expectation p (\y. min (X i y) (&(SUC i)))) + (\x. min (X j x) (&(SUC j)) - + expectation p (\y. min (X j y) (&(SUC j)))) = + covariance p (\x. min (X i x) (&(SUC i))) + (\x. min (X j x) (&(SUC j)))` SUBST1_TAC THENL + [MATCH_MP_TAC COVARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC COVARIANCE_INDEP THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_SQUARE THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC INDEP_RV_MIN_DIFF_CONST THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* summable variance *) + MATCH_MP_TAC REAL_SUMMABLE_EQ THEN + EXISTS_TAC `\n. variance (p:A prob_space) + (\x. min ((X:num->A->real) n x) (&(SUC n))) / + &(SUC n) pow 2` THEN + CONJ_TAC THENL + [REWRITE_TAC[IN_FROM] THEN + GEN_TAC THEN DISCH_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `(\x':A. min ((X:num->A->real) x x') (&(SUC x)) - + expectation p (\y. min (X x y) (&(SUC x)))) = + (\x'. min (X x x') (&(SUC x)) + + --(expectation p (\y. min (X x y) (&(SUC x)))))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC VARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* On the a.s. set, apply NONDECREASING_CONVERGENCE_GSEQ *) + REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + BETA_TAC THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN DISCH_TAC THEN + MP_TAC(SPECL + [`\n. sum(0..n) (\i. min ((X:num->A->real) i x) (&(SUC i)))`; + `mu:real`] + NONDECREASING_CONVERGENCE_GSEQ) THEN + BETA_TAC THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* nondecreasing *) + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN + REWRITE_TAC[FINITE_NUMSEG] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_NUMSEG] THEN ASM_ARITH_TAC; + REWRITE_TAC[IN_DIFF; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_POS]]]; + (* nonneg *) + GEN_TAC THEN MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_POS]]; + (* 0 <= mu *) + ASM_REWRITE_TAC[]; + (* convergence along gseq *) + GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `b:num`) THEN + SUBGOAL_THEN `!k. inv(&(gseq b k)) * + sum (0..gseq b k - 1) + (\i. min ((X:num->A->real) i x) (&(SUC i)) - + expectation p (\y. min (X i y) (&(SUC i)))) = + sum(0..gseq b k - 1) (\i. min (X i x) (&(SUC i))) / + &(gseq b k) - + inv(&(gseq b k)) * sum(0..gseq b k - 1) + (\i. expectation p (\y. min (X i y) (&(SUC i))))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[SUM_SUB_NUMSEG; real_div] THEN + REWRITE_TAC[REAL_SUB_RDISTRIB] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + DISCH_TAC THEN + (* Cesaro mean of expectations -> mu *) + SUBGOAL_THEN + `((\k. inv(&(gseq b k)) * sum(0..gseq b k - 1) + (\i. expectation p + (\y. min ((X:num->A->real) i y) (&(SUC i))))) ---> + mu) sequentially` + ASSUME_TAC THENL + [SUBGOAL_THEN `!k. sum (0..gseq b k - 1) + (\i. expectation (p:A prob_space) + (\y. min ((X:num->A->real) i y) (&(SUC i)))) = + sum (0..gseq b k - 1) + (\i. expectation p (\y. min (X 0 y) (&(SUC i))))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!k:num. gseq b k = SUC(gseq b k - 1)` + ASSUME_TAC THENL + [GEN_TAC THEN MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN + ARITH_TAC; + ALL_TAC] THEN + ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUC_SUB1] THEN + MP_TAC(ISPECL [ + `\n. inv(&(SUC n)) * sum(0..n) + (\i. expectation (p:A prob_space) + (\y. min ((X:num->A->real) 0 y) (&(SUC i))))`; + `mu:real`; + `\k:num. gseq b k - 1`] REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN(fun th -> MATCH_MP_TAC th) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_CESARO_MEAN THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `gseq b m < gseq b n` ASSUME_TAC THENL + [MATCH_MP_TAC LTE_TRANS THEN + EXISTS_TAC `gseq b (SUC m)` THEN + CONJ_TAC THENL + [REWRITE_TAC[GSEQ_SUC_GT]; + MATCH_MP_TAC GSEQ_MONOTONE THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(SPECL [`b:num`; `m:num`] GSEQ_POS) THEN + MP_TAC(SPECL [`b:num`; `n:num`] GSEQ_POS) THEN + ASM_ARITH_TAC]; + ALL_TAC] THEN + (* Combine: a_k = (a_k - b_k) + b_k *) + SUBGOAL_THEN + `(\k. sum(0..gseq b k - 1) + (\i. min ((X:num->A->real) i x) (&(SUC i))) / + &(gseq b k)) = + (\k. (sum(0..gseq b k - 1) + (\i. min (X i x) (&(SUC i))) / &(gseq b k) - + inv(&(gseq b k)) * sum(0..gseq b k - 1) + (\i. expectation p + (\y. min (X i y) (&(SUC i))))) + + inv(&(gseq b k)) * sum(0..gseq b k - 1) + (\i. expectation p + (\y. min (X i y) (&(SUC i)))))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `mu = &0 + mu` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* f(n)/SUC(n) -> mu gives inv(SUC n)*sum -> mu *) + SUBGOAL_THEN `(\n. inv(&(SUC n)) * + sum(0..n) (\i. min ((X:num->A->real) i x) (&(SUC i)))) = + (\n. sum(0..n) (\i. min (X i x) (&(SUC i))) / &(SUC n))` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN REAL_ARITH_TAC; + (* Part 2: truncation error -> 0 via Borel-Cantelli *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `prob_carrier (p:A prob_space) DIFF + limsup_events + (\n. {x:A | x IN prob_carrier p /\ X n x > &(SUC n)})` THEN + CONJ_TAC THENL + [REWRITE_TAC[almost_surely] THEN + EXISTS_TAC + `limsup_events + (\n. {x:A | x IN prob_carrier p /\ X n x > &(SUC n)})` THEN + SUBGOAL_THEN `!n. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. {x:A | x IN prob_carrier p /\ X n x > &(SUC n)} IN + prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC + `\k. prob p {x:A | x IN prob_carrier p /\ X 0 x >= &(k + 1)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC TAIL_PROB_SUMMABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + EXISTS_TAC `0` THEN REWRITE_TAC[IN_FROM] THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN REWRITE_TAC[ADD1] THEN + SUBGOAL_THEN + `&0 <= prob p {x:A | x IN prob_carrier p /\ X n x > &(n + 1)}` + (fun th -> REWRITE_TAC[real_abs; th]) THENL + [MATCH_MP_TAC PROB_POSITIVE THEN REWRITE_TAC[GSYM ADD1] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob p {x:A | x IN prob_carrier p /\ X n x > &(n + 1)} = + prob p {x | x IN prob_carrier p /\ X 0 x > &(n + 1)}` + SUBST1_TAC THENL + [MATCH_MP_TAC EQUIDIST_TAIL_PROB_GT THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN + REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + MESON_TAC[REAL_ARITH `x > a ==> x >= a`]]]]]; + SET_TAC[]]; + (* Deterministic: outside limsup, error -> 0 *) + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_DIFF; IN_ELIM_THM] THEN DISCH_TAC THEN + SUBGOAL_THEN `?M:num. !n. n >= M ==> ~((X:num->A->real) n x > &(SUC n))` + MP_TAC THENL + [POP_ASSUM(MP_TAC o CONJUNCT2) THEN + REWRITE_TAC[limsup_events; IN_INTERS] THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` STRIP_ASSUME_TAC) THEN + POP_ASSUM MP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + REWRITE_TAC[IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `M:num` SUBST_ALL_TAC) THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM; NOT_EXISTS_THM] THEN + DISCH_TAC THEN EXISTS_TAC `M:num` THEN + X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | x IN prob_carrier p /\ X nn x > &(SUC nn)}`) THEN + REWRITE_TAC[IN_ELIM_THM; DE_MORGAN_THM] THEN + DISCH_THEN DISJ_CASES_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + DISCH_THEN(MP_TAC o SPEC `nn:num`) THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + SUBGOAL_THEN + `!n. n >= M + ==> (X:num->A->real) n x - min (X n x) (&(SUC n)) = &0` + ASSUME_TAC THENL + [X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_gt; REAL_NOT_LT] THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `min x y = x ==> x - min x y = &0`) THEN + MATCH_MP_TAC(REAL_ARITH `x <= y ==> min x y = x`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ABBREV_TAC + `C = sum(0..M) + (\i. (X:num->A->real) i x - min (X i x) (&(SUC i)))` THEN + SUBGOAL_THEN + `!n. n >= M ==> + sum(0..n) + (\i. (X:num->A->real) i x - min (X i x) (&(SUC i))) = C` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [DISCH_TAC THEN + SUBGOAL_THEN `M = 0` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + DISCH_TAC THEN ASM_CASES_TAC `n >= M:num` THENL + [ASM_SIMP_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `SUC n`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_TAC] THEN + ASM_REWRITE_TAC[REAL_ADD_RID]; + SUBGOAL_THEN `SUC n = M` (fun th -> ASM_REWRITE_TAC[th]) THEN + ASM_ARITH_TAC]]; + ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_TRANSFORM_EVENTUALLY) THEN + EXISTS_TAC `\n. inv(&(SUC n)) * C` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `M:num` THEN X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN + FIRST_ASSUM(MATCH_MP_TAC o REWRITE_RULE[GE]) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REALLIM_SEQUENTIALLY; REAL_SUB_RZERO] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `abs C / e` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `K:num`) THEN + EXISTS_TAC `K:num` THEN X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_INV; REAL_ABS_NUM] THEN + SUBGOAL_THEN `abs C <= &K * e` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LE_LDIV_EQ]; ALL_TAC] THEN + SUBGOAL_THEN `abs C < e * &(SUC nn)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `e * &nn` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&K * e` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `a * e <= e * b <=> e * a <= e * b`] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC]; + ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + REWRITE_TAC[GSYM real_div] THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; LT_0]]]]; + (* On the intersection, sum X/(n+1) = sum Y/(n+1) + error/(n+1) -> mu+0 *) + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `(\n. inv(&(SUC n)) * sum(0..n) (\i. (X:num->A->real) i x)) = + (\n. inv(&(SUC n)) * sum(0..n) (\i. min (X i x) (&(SUC i))) + + inv(&(SUC n)) * sum(0..n) + (\i. X i x - min (X i x) (&(SUC i))))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[GSYM REAL_ADD_LDISTRIB; GSYM SUM_ADD_NUMSEG] THEN + AP_TERM_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `mu = mu + &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN ASM_REWRITE_TAC[]] + );; + +(* ================================================================= *) +(* IID SLLN -- general signed case *) +(* ================================================================= *) + +let IID_SLLN = prove + (`!p:A prob_space (X:num->A->real) mu. + (!n. integrable p (X n)) /\ + (!n. expectation p (X n) = mu) /\ + (!i j. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!n a. distribution_fn p (X n) a = distribution_fn p (X 0) a) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) + sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `mu_plus = expectation (p:A prob_space) + (\x. max ((X:num->A->real) 0 x) (&0))` THEN + SUBGOAL_THEN `!n. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 1: Apply IID_SLLN_NONNEG to positive parts max(X, 0) *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max ((X:num->A->real) i x) (&0))) ---> mu_plus) sequentially}` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). max ((X:num->A->real) n x) (&0)`; + `mu_plus:real`] IID_SLLN_NONNEG) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* integrable max(X n, 0) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + (* nonneg *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + (* E[max(X n, 0)] = mu_plus *) + GEN_TAC THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) = + expectation p (\x. max (X 0 x) (&0))` SUBST1_TAC THENL + [MATCH_MP_TAC EQUIDIST_NONNEG_EXPECTATION THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + ALL_TAC] THEN + SUBGOAL_THEN `!a. distribution_fn (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) a = + distribution_fn p (\x. max (X 0 x) (&0)) a` + (fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC EQUIDIST_MAX_ZERO THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + (* indep_rv max(X_i, 0) max(X_j, 0) *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC INDEP_RV_MAX_CONST THEN + CONV_TAC(DEPTH_CONV ETA_CONV) THEN ASM_SIMP_TAC[]; + (* equidist max(X n, 0) *) + GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `(X:num->A->real) 0`] EQUIDIST_MAX_ZERO) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN REWRITE_TAC[]; + REWRITE_TAC[]]]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* Step 2: Apply IID_SLLN_NONNEG to negative parts max(-X, 0) *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max (--((X:num->A->real) i x)) (&0))) ---> + (mu_plus - mu)) sequentially}` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). max (--((X:num->A->real) n x)) (&0)`; + `mu_plus - mu:real`] IID_SLLN_NONNEG) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* integrable max(-X n, 0) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_NEG THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + (* nonneg *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + (* E[max(-X n, 0)] = mu_plus - mu *) + GEN_TAC THEN + SUBGOAL_THEN `(\x:A. max (--((X:num->A->real) n x)) (&0)) = + (\x. max (X n x) (&0) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0) - X n x) = + expectation p (\x. max (X n x) (&0)) - expectation p (X n)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUB THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) = mu_plus` SUBST1_TAC THENL + [SUBGOAL_THEN `expectation (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) = + expectation p (\x. max (X 0 x) (&0))` SUBST1_TAC THENL + [MATCH_MP_TAC EQUIDIST_NONNEG_EXPECTATION THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MAX; REAL_LE_REFL]; + ALL_TAC] THEN + SUBGOAL_THEN `!a. distribution_fn (p:A prob_space) + (\x. max ((X:num->A->real) n x) (&0)) a = + distribution_fn p (\x. max (X 0 x) (&0)) a` + (fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC EQUIDIST_MAX_ZERO THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; + (* indep_rv max(-X_i, 0) max(-X_j, 0) *) + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC INDEP_RV_MAX_CONST THEN + MATCH_MP_TAC INDEP_RV_NEG THEN + CONV_TAC(DEPTH_CONV ETA_CONV) THEN ASM_SIMP_TAC[]; + (* equidist max(-X n, 0) *) + GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `(X:num->A->real) 0`] EQUIDIST_NEG_MAX_ZERO) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + FIRST_ASSUM(MP_TAC o SPECL [`n:num`; `a:real`]) THEN REWRITE_TAC[]; + REWRITE_TAC[]]]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* Step 3: Combine via X = max(X,0) - max(-X,0) and REALLIM_SUB *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max ((X:num->A->real) i x) (&0))) ---> mu_plus) sequentially} INTER + {x | ((\n. inv(&(SUC n)) * sum(0..n) + (\i. max (--(X i x)) (&0))) ---> (mu_plus - mu)) sequentially}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN + SUBGOAL_THEN + `!n:num. sum(0..n) (\i. (X:num->A->real) i (x:A)) = + sum(0..n) (\i. max (X i x) (&0)) - + sum(0..n) (\i. max (--(X i x)) (&0))` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(\n:num. inv(&(SUC n)) * sum(0..n) + (\i. (X:num->A->real) i (x:A))) = + (\n. inv(&(SUC n)) * sum(0..n) (\i. max (X i x) (&0)) - + inv(&(SUC n)) * sum(0..n) (\i. max (--(X i x)) (&0)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; BETA_THM] THEN X_GEN_TAC `nn:num` THEN + ASM_REWRITE_TAC[REAL_SUB_LDISTRIB]; ALL_TAC] THEN + SUBGOAL_THEN `mu:real = mu_plus - (mu_plus - mu)` SUBST1_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_SUB THEN ASM_REWRITE_TAC[]]);; + +(* ================================================================== *) +(* Kolmogorov Three-Series Theorem (Sufficiency) *) +(* ================================================================== *) + +(* Helper: tail of a nonneg summable series goes to 0 *) +let REAL_SUMMABLE_TAIL_BOUND = prove + (`!f:num->real. (!n. &0 <= f n) /\ real_summable (from 0) f + ==> !e. &0 < e ==> ?a. !N. sum(a..a+N) f < e`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [real_summable]) THEN + DISCH_THEN(X_CHOOSE_TAC `V:real`) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [real_sums]) THEN + REWRITE_TAC[FROM_INTER_NUMSEG_MAX; ARITH_RULE `MAX 0 n = n`] THEN + DISCH_TAC THEN + SUBGOAL_THEN `!n. sum(0..n) (f:num->real) <= V` ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + ABBREV_TAC `d = sum(0..n) (f:num->real) - V` THEN + SUBGOAL_THEN `&0 < d` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `((\n. sum (0..n) (f:num->real)) ---> V) sequentially` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n + N:num`) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum(0..n) (f:num->real) <= sum(0..n + N) f` MP_TAC THENL + [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_NUMSEG] THEN ARITH_TAC; + REWRITE_TAC[IN_DIFF; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + ASM_MESON_TAC[]]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN + UNDISCH_TAC `((\n. sum (0..n) (f:num->real)) ---> V) sequentially` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + EXISTS_TAC `SUC M` THEN X_GEN_TAC `N:num` THEN + SUBGOAL_THEN `sum(SUC M..SUC M + N) (f:num->real) = + sum(0..SUC M + N) f - sum(0..M) f` SUBST1_TAC THENL + [MP_TAC(ISPECL [`f:num->real`; `0`; `M:num`; `SUC M + N`] SUM_COMBINE_R) THEN + REWRITE_TAC[ARITH_RULE `M + 1 = SUC M`] THEN + ANTS_TAC THENL [ARITH_TAC; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `V - sum(0..M) (f:num->real) < e` MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `M:num`) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPEC `M:num` (ASSUME `!n. sum(0..n) (f:num->real) <= V`)) THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(SPEC `SUC M + N` (ASSUME `!n. sum(0..n) (f:num->real) <= V`)) THEN + REAL_ARITH_TAC);; + +(* Helper: shift universal quantifier index range *) +let FORALL_SHIFT_INDEX = prove + (`!a k (P:num->bool). + (!j. a <= j /\ j < a + k ==> P j) <=> + (!j. j < k ==> P (a + j))`, + REPEAT GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `a + j:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[]]; + FIRST_X_ASSUM(MP_TAC o SPEC `j - a:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a + (j - a):num = j` SUBST1_TAC THENL + [ASM_ARITH_TAC; REWRITE_TAC[]]]);; + +(* Helper: reindex sum(a..a+k) to sum(0..k) with shifted indices *) +let SUM_REINDEX_SHIFT = prove + (`!a k (f:num->real). sum(a..a+k) f = sum(0..k) (\i. f(a+i))`, + REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`a:num`; `f:num->real`; `0`; `k:num`] SUM_OFFSET) THEN + REWRITE_TAC[ADD_CLAUSES; ADD_SYM]);; + +(* Helper: from 0 INTER (m..n) = m..n *) +let FROM_0_INTER_NUMSEG = prove + (`!m n. from 0 INTER (m..n) = m..n`, + REWRITE_TAC[EXTENSION; from; IN_INTER; IN_ELIM_THM; IN_NUMSEG] THEN + ARITH_TAC);; + +(* Kolmogorov Convergence Criterion: + Independent mean-zero variables with summable variance and + first-crossing hypothesis => series converges a.s. *) +let KOLMOGOROV_CONVERGENCE_CRITERION = prove + (`!p:A prob_space (X:num->A->real). + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + (!a b k t. a <= k /\ k < b /\ &0 < t ==> + expectation p (\x. sum(a..k) (\i. X i x) * + sum(SUC k..b) (\i. X i x) * + indicator_fn {y:A | y IN prob_carrier p /\ + (!j. a <= j /\ j < k ==> abs(sum(a..j) (\i. X i y)) < t) /\ + abs(sum(a..k) (\i. X i y)) >= t} x) = &0) /\ + real_summable (from 0) (\n. variance p (X n)) + ==> almost_surely p + {x | (?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially)}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Nonneg variance *) + SUBGOAL_THEN `!n. &0 <= variance (p:A prob_space) ((X:num->A->real) n)` + (LABEL_TAC "Vnn") THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `expectation (p:A prob_space) ((X:num->A->real) n) = &0` + SUBST1_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Tail bound: for any eps, exists a s.t. tail variance < eps *) + SUBGOAL_THEN `!e. &0 < e ==> + ?a. !N. sum(a..a+N) (\n. variance (p:A prob_space) ((X:num->A->real) n)) < e` + (LABEL_TAC "TB") THENL + [MATCH_MP_TAC REAL_SUMMABLE_TAIL_BOUND THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `INTERS {(\m:num. {x:A | + ?a. !k. abs(sum(a..a+k) (\i. (X:num->A->real) i x)) < + inv(&(SUC m))}) m | m IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN + BETA_TAC THEN X_GEN_TAC `m:num` THEN + REWRITE_TAC[almost_surely] THEN + ABBREV_TAC `eps = inv(&(SUC m))` THEN + SUBGOAL_THEN `&0 < eps` (LABEL_TAC "eps_pos") THENL + [EXPAND_TAC "eps" THEN MATCH_MP_TAC REAL_LT_INV THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + ABBREV_TAC `D = \a N. {x:A | x IN prob_carrier p /\ + ?k. k <= N /\ abs(sum(a..a+k) (\i. (X:num->A->real) i x)) >= eps}` THEN + (* D(a,N) is a measurable event *) + SUBGOAL_THEN `!a N. (D:num->num->A->bool) a N IN prob_events p` + (LABEL_TAC "Dev") THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "D" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (?k. k <= N /\ abs(sum(a..a+k) (\i. (X:num->A->real) i x)) >= eps)} = + UNIONS(IMAGE (\k. {x:A | x IN prob_carrier p /\ + abs(sum(a..a+k) (\i. X i x)) >= eps}) {k | k <= N})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM] THEN + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + SUBGOAL_THEN `(\x:A. sum(a..a+k) (\i. (X:num->A->real) i x)) = + (\x. sum(0..k) (\i. X (a + i) x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; SUM_REINDEX_SHIFT]; ALL_TAC] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_IMAGE THEN + MATCH_MP_TAC FINITE_SUBSET THEN EXISTS_TAC `0..N:num` THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ARITH_TAC]; + ALL_TAC] THEN + (* D(a,N) SUBSET D(a,SUC N) *) + SUBGOAL_THEN `!a N. (D:num->num->A->bool) a N SUBSET D a (SUC N)` + (LABEL_TAC "Dinc") THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "D" THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + (* Index translation: absolute-index set = relative-index set *) + SUBGOAL_THEN `!a k. {y:A | y IN prob_carrier p /\ + (!j. a <= j /\ j < a + k ==> + abs(sum(a..j) (\i. (X:num->A->real) i y)) < eps) /\ + abs(sum(a..a+k) (\i. X i y)) >= eps} = + {y | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(a..a+j) (\i. X i y)) < eps) /\ + abs(sum(a..a+k) (\i. X i y)) >= eps}` (LABEL_TAC "Idx") THENL + [REWRITE_TAC[FORALL_SHIFT_INDEX]; ALL_TAC] THEN + (* Probability bound: P(D(a,N)) <= sum Var / eps^2 *) + SUBGOAL_THEN `!a N. prob (p:A prob_space) ((D:num->num->A->bool) a N) <= + sum(a..a+N) (\n. variance p ((X:num->A->real) n)) / eps pow 2` + (LABEL_TAC "Dbd") THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "D" THEN + MATCH_MP_TAC KOLMOGOROV_MAXIMAL_INEQ_SHIFTED THEN + REPEAT CONJ_TAC THENL + [REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[]; + X_GEN_TAC `k':num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`a:num`; `a + N:num`; `a + k':num`; `eps:real`]) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ARITH_TAC; CONJ_TAC THENL + [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + REWRITE_TAC[ADD1; FORALL_SHIFT_INDEX] THEN + MATCH_MP_TAC(MESON[] `(P = Q) ==> P ==> Q`) THEN + REWRITE_TAC[GSYM ADD_ASSOC]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* UNIONS {D(a,N) | N} is an event for each a *) + SUBGOAL_THEN `!a. UNIONS {(D:num->num->A->bool) a N | N IN (:num)} + IN prob_events p` (LABEL_TAC "Uev") THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_UNIV] THEN + USE_THEN "Dev" (fun th -> REWRITE_TAC[th]); + REWRITE_TAC[SIMPLE_IMAGE] THEN MATCH_MP_TAC COUNTABLE_IMAGE THEN + REWRITE_TAC[NUM_COUNTABLE]]; + ALL_TAC] THEN + (* INTERS {UNIONS {D(a,N) | N} | a} is an event *) + SUBGOAL_THEN `INTERS {UNIONS {(D:num->num->A->bool) a N | + N IN (:num)} | a IN (:num)} IN prob_events p` (LABEL_TAC "Iev") THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN + GEN_TAC THEN DISCH_TAC THEN USE_THEN "Uev" (fun th -> REWRITE_TAC[th]); + REWRITE_TAC[SIMPLE_IMAGE] THEN MATCH_MP_TAC COUNTABLE_IMAGE THEN + REWRITE_TAC[NUM_COUNTABLE]; + REWRITE_TAC[SIMPLE_IMAGE; IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY]]; + ALL_TAC] THEN + EXISTS_TAC `INTERS {UNIONS {(D:num->num->A->bool) a N | + N IN (:num)} | a IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [USE_THEN "Iev" (fun th -> REWRITE_TAC[th]); ALL_TAC] THEN + MATCH_MP_TAC(prove(`!x:real. &0 <= x /\ (!d. &0 < d ==> x <= d) + ==> x = &0`, + GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ ~(&0 < x) ==> x = &0`) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x / &2`) THEN ASM_REAL_ARITH_TAC)) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + USE_THEN "Iev" (fun th -> REWRITE_TAC[th]); + ALL_TAC] THEN + X_GEN_TAC `d:real` THEN DISCH_TAC THEN + REMOVE_THEN "TB" (MP_TAC o SPEC `d * (eps:real) pow 2`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_POW_LT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `a:num`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + (UNIONS {(D:num->num->A->bool) a N | N IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN + CONJ_TAC THENL + [USE_THEN "Iev" (fun th -> REWRITE_TAC[th]); ALL_TAC] THEN + CONJ_TAC THENL + [USE_THEN "Uev" (fun th -> REWRITE_TAC[th]); ALL_TAC] THEN + REWRITE_TAC[SUBSET; INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `a:num`) THEN REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(D:num->num->A->bool) a`] PROB_CONTINUITY_FROM_BELOW) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + DISCH_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\N. prob (p:A prob_space) ((D:num->num->A->bool) a N)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(fun th -> REWRITE_TAC[th]); ALL_TAC] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(a..a+nn) (\n. variance (p:A prob_space) + ((X:num->A->real) n)) / eps pow 2` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POW_LT] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + EXPAND_TAC "D" THEN + REWRITE_TAC[SUBSET; INTERS_GSPEC; UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + BETA_TAC THEN X_GEN_TAC `y:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; REAL_NOT_LT; GSYM real_ge] THEN + DISCH_TAC THEN X_GEN_TAC `aa:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `aa:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `kk:num`) THEN + EXISTS_TAC `kk:num` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `kk:num` THEN ASM_REWRITE_TAC[LE_REFL]; + (* Branch 2: INTERS {x | sums < inv(SUC m)} SUBSET {x | series converges} *) + REWRITE_TAC[SUBSET; INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN BETA_TAC THEN + GEN_TAC THEN DISCH_TAC THEN DISCH_TAC THEN + REWRITE_TAC[GSYM REAL_SERIES_FROM; GSYM real_summable; + REAL_SUMMABLE_CAUCHY; FROM_0_INTER_NUMSEG] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `?n. ~(n = 0) /\ &0 < inv(&n:real) /\ inv(&n) < e / &2` + (X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THENL + [REWRITE_TAC[GSYM REAL_ARCH_INV] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `a:num`) THEN + EXISTS_TAC `a:num` THEN + SUBGOAL_THEN `inv(&(SUC m)) < e / &2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&m:real)` THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LT_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + REPEAT GEN_TAC THEN DISCH_TAC THEN + ASM_CASES_TAC `n:num < m'` THENL + [ASM_SIMP_TAC[SUM_TRIV_NUMSEG; LT_IMP_LE; REAL_ABS_NUM]; ALL_TAC] THEN + SUBGOAL_THEN `m':num <= n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a:num <= m'` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_CASES_TAC `m' = a:num` THENL + [ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n - a:num`) THEN + SUBGOAL_THEN `a + (n - a) = n:num` SUBST1_TAC THENL + [ASM_ARITH_TAC; REWRITE_TAC[GSYM real_ge; REAL_NOT_LE] THEN + DISCH_TAC THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `a:num < m'` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum(m'..n) (\i. (X:num->A->real) i x) = + sum(a..n) (\i. X i x) - sum(a..m' - 1) (\i. X i x)` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `a:num`; `m' - 1`; + `n:num`] SUM_COMBINE_R) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `m' - 1 + 1 = m':num` SUBST1_TAC THENL + [ASM_ARITH_TAC; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `abs(sum(a..n) (\i. (X:num->A->real) i x)) < inv(&(SUC m))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n - a:num`) THEN + SUBGOAL_THEN `a + (n - a) = n:num` SUBST1_TAC THENL + [ASM_ARITH_TAC; REWRITE_TAC[GSYM real_ge; REAL_NOT_LE]]; + ALL_TAC] THEN + SUBGOAL_THEN `abs(sum(a..m' - 1) (\i. (X:num->A->real) i x)) < inv(&(SUC m))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `m' - 1 - a:num`) THEN + SUBGOAL_THEN `a + (m' - 1 - a) = m' - 1:num` SUBST1_TAC THENL + [ASM_ARITH_TAC; REWRITE_TAC[GSYM real_ge; REAL_NOT_LE]]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC]);; + +(* ========================================================================= *) +(* Truncation (clamping) infrastructure for Three-Series Theorem *) +(* ========================================================================= *) + +(* Clamp bound: |min(max(x, -c), c)| <= c for c > 0 *) +let CLAMP_BOUND = prove + (`!x c. &0 < c ==> abs(min (max x (--c)) c) <= c`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC);; + +(* Clamped function is integrable *) +let INTEGRABLE_CLAMP = prove + (`!p:A prob_space f c. integrable p f + ==> integrable p (\x. min (max (f x) (--c)) c)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + REWRITE_TAC[INTEGRABLE_CONST]]);; + +(* Square of clamped function is integrable *) +let INTEGRABLE_CLAMP_POW2 = prove + (`!p:A prob_space f c. &0 < c /\ integrable p f + ==> integrable p (\x. min (max (f x) (--c)) c pow 2)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(c:real) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN CONJ_TAC THENL + [ASM_MESON_TAC[integrable]; REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC CLAMP_BOUND THEN ASM_REWRITE_TAC[]]);; + +(* Clamped function is a random variable *) +let RANDOM_VARIABLE_CLAMP = prove + (`!p:A prob_space f c. random_variable p f + ==> random_variable p (\x. min (max (f x) (--c)) c)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]);; + +(* Independence of clamped variables *) +let INDEP_RV_CLAMP = prove + (`!p:A prob_space X Y c. + indep_rv p X Y + ==> indep_rv p (\x. min (max (X x) (--c)) c) + (\x. min (max (Y x) (--c)) c)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INDEP_RV_MIN_CONST THEN + MATCH_MP_TAC INDEP_RV_MAX_CONST THEN ASM_REWRITE_TAC[]);; + +(* Bound on expectation of clamped function *) +let CLAMP_EXPECTATION_BOUND = prove + (`!p:A prob_space f c. + integrable p f /\ &0 < c + ==> abs(expectation p (\x. min (max (f x) (--c)) c)) <= c`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x. abs(min (max (f x) (--c)) c))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> abs(min (max (f x) (--c)) c) <= c` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC CLAMP_BOUND THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. abs(min (max ((f:A->real) x) (--c)) c)`; + `(\x:A. c:real)`] EXPECTATION_MONO) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[INTEGRABLE_CONST]]; + REWRITE_TAC[EXPECTATION_CONST; PROB_SPACE] THEN ASM_REAL_ARITH_TAC]]);; + +(* Expectation of f - c equals expectation of f minus c *) +let EXPECTATION_SUB_CONST = prove + (`!p:A prob_space f c. + integrable p f + ==> expectation p (\x. f x - c) = expectation p f - c`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`; `(\x:A. c:real)`] + EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST; PROB_SPACE; + REAL_MUL_LID]);; + +(* Variance is invariant under constant shift -- corollary of VARIANCE_SHIFT *) +let VARIANCE_SUB_CONST = prove + (`!p:A prob_space f c. + integrable p f + ==> variance p (\x. f x - c) = variance p f`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. (f:A->real) x - c) = (\x. f x + --c)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_sub]; ALL_TAC] THEN + ASM_SIMP_TAC[VARIANCE_SHIFT]);; + +(* Bound on centered clamped function *) +let CLAMP_CENTERED_BOUND = prove + (`!p:A prob_space f c x. + integrable p f /\ &0 < c /\ x IN prob_carrier p + ==> abs(min (max (f x) (--c)) c - + expectation p (\y. min (max (f y) (--c)) c)) <= &2 * c`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `abs(min (max ((f:A->real) x) (--c)) c) <= c` + ASSUME_TAC THENL + [MATCH_MP_TAC CLAMP_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `abs(expectation (p:A prob_space) (\y. min (max (f y) (--c)) c)) <= c` + ASSUME_TAC THENL + [MATCH_MP_TAC CLAMP_EXPECTATION_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +(* Centered clamped function is integrable *) +let INTEGRABLE_CLAMP_CENTERED = prove + (`!p:A prob_space f c. + integrable p f + ==> integrable p (\x. min (max (f x) (--c)) c - + expectation p (\y. min (max (f y) (--c)) c))`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]);; + +(* Square of centered clamped function is integrable *) +let INTEGRABLE_CLAMP_CENTERED_POW2 = prove + (`!p:A prob_space f c. + integrable p f /\ &0 < c + ==> integrable p (\x. (min (max (f x) (--c)) c - + expectation p (\y. min (max (f y) (--c)) c)) pow 2)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&2 * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN + ASM_MESON_TAC[integrable]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC CLAMP_CENTERED_BOUND THEN ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* Borel-Cantelli to almost_surely bridge *) +(* ========================================================================= *) + +(* First Borel-Cantelli gives a.s. eventually not in B_n *) +let BOREL_CANTELLI_ALMOST_SURELY = prove + (`!p:A prob_space B. + (!n. B n IN prob_events p) /\ + real_summable (from 0) (\n. prob p (B n)) + ==> almost_surely p {x | ?N. !n. N <= n ==> ~(x IN B n)}`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `limsup_events (B:num->A->bool)` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; limsup_events; IN_INTERS; IN_ELIM_THM; + NOT_EXISTS_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + X_GEN_TAC `t:A->bool` THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_IMP; GSYM GE] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(B:num->A->bool) nn` THEN + ASM_REWRITE_TAC[] THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* Tail equivalence for series convergence *) +(* ========================================================================= *) + +(* If a.s. eventually X_n = Y_n and sum Y_n converges a.s., + then sum X_n converges a.s. *) +let TAIL_EQUIVALENCE_CONVERGENCE = prove + (`!p:A prob_space X Y. + almost_surely p {x | ?N. !n. N <= n ==> X n x = Y n x} /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially} + ==> almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially}`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` ALMOST_SURELY_SUBSET) THEN + EXISTS_TAC `{x:A | ?N. !n. N <= n ==> (X:num->A->real) n x = Y n x} INTER + {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN REPEAT STRIP_TAC] THEN + EXISTS_TAC `L + sum(0..N) (\i. (X:num->A->real) i x - Y i x)` THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n. sum(0..n) (\i. (Y:num->A->real) i x) + + sum(0..N) (\i. X i x - Y i x)` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `0`; `N:num`; `n:num`] + SUM_COMBINE_R) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`\i. (Y:num->A->real) i x`; `0`; `N:num`; `n:num`] + SUM_COMBINE_R) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum(N + 1..n) (\i. (X:num->A->real) i x) = + sum(N + 1..n) (\i. Y i x)` ASSUME_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[SUM_SUB_NUMSEG] THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_ADD THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; REWRITE_TAC[REALLIM_CONST]]]);; + +(* ========================================================================= *) +(* Kolmogorov Three-Series Theorem (Sufficiency) *) +(* ========================================================================= *) + +(* The sufficiency direction of Kolmogorov's Three-Series Theorem: + If the three series conditions hold (tail probabilities, expectations, + and variances of truncated variables), plus the centered truncations + are uncorrelated and satisfy the Kolmogorov cross-term condition, + then the original series converges almost surely. + + The uncorrelated and cross-term conditions follow from mutual independence + of the X_n; they are stated as hypotheses here because the formalization + works with pairwise indep_rv rather than mutually_indep_rv. *) +let THREE_SERIES_SUFFICIENCY = prove + (`!p:A prob_space X c. + &0 < c /\ + (!n. integrable p (X n)) /\ + real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + real_summable (from 0) + (\n. expectation p (\x. min (max (X n x) (--c)) c)) /\ + real_summable (from 0) + (\n. variance p (\x. min (max (X n x) (--c)) c)) /\ + (!i j. ~(i = j) + ==> covariance p + (\x. min (max (X i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) + (\x. min (max (X j x) (--c)) c - + expectation p (\y. min (max (X j y) (--c)) c)) = &0) /\ + (!a b k t. + a <= k /\ k < b /\ &0 < t + ==> expectation p + (\x. sum(a..k) + (\i. min (max (X i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) * + sum(SUC k..b) + (\i. min (max (X i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) * + indicator_fn + {z | z IN prob_carrier p /\ + (!j. a <= j /\ j < k + ==> abs(sum(a..j) + (\i. min (max (X i z) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c))) < t) /\ + abs(sum(a..k) + (\i. min (max (X i z) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c))) >= t} x) = &0) + ==> almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially}`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "tail_prob") MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "exp_sum") MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "var_sum") MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (LABEL_TAC "uncorr") (LABEL_TAC "cross")) THEN + (* Step 1: Reduce to sum of clamped variables via tail equivalence *) + MATCH_MP_TAC(ISPEC `p:A prob_space` TAIL_EQUIVALENCE_CONVERGENCE) THEN + EXISTS_TAC `\n x. min (max ((X:num->A->real) n x) (--c)) c` THEN + CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN CONJ_TAC THENL + [(* Step 1a: a.s. eventually X_n = clamp(X_n) via Borel-Cantelli *) + MATCH_MP_TAC(ISPEC `p:A prob_space` ALMOST_SURELY_SUBSET) THEN + EXISTS_TAC `{x:A | ?N. !n. N <= n + ==> ~(x IN {y | y IN prob_carrier p /\ abs((X:num->A->real) n y) > c})}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC BOREL_CANTELLI_ALMOST_SURELY THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN + SUBGOAL_THEN `{y:A | y IN prob_carrier p /\ abs(X (n:num) y) > c} = + {y | y IN prob_carrier p /\ (\y. abs((X:num->A->real) n y)) y > c}` + SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_gt; REAL_NOT_LT] THEN DISCH_TAC THEN + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Step 2: Reduce sum(clamp) to sum(centered clamp) + sum(expectations) *) + CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` ALMOST_SURELY_SUBSET) THEN + EXISTS_TAC + `{x:A | ?L. ((\n. sum(0..n) (\i. min (max ((X:num->A->real) i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c))) ---> L) + sequentially}` THEN + CONJ_TAC THENL + [(* Step 2a: sum(centered clamp) converges a.s. via Kolmogorov criterion *) + MATCH_MP_TAC KOLMOGOROV_CONVERGENCE_CRITERION THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + (* Condition 1: centered clamp is integrable *) + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_CLAMP_CENTERED THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Condition 2: square of centered clamp is integrable *) + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_CLAMP_CENTERED_POW2 THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Condition 3: E[centered clamp] = 0 *) + CONJ_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. min (max ((X:num->A->real) n x) (--c)) c - + expectation p (\y. min (max (X n y) (--c)) c)) = + expectation p (\x. min (max (X n x) (--c)) c) - + expectation p (\y. min (max (X n y) (--c)) c)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUB_CONST THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC(REAL_ARITH `a = b ==> a - b = &0`) THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]]; + ALL_TAC] THEN + (* Condition 4: uncorrelated *) + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Condition 5: cross-term *) + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Condition 6: summable variance *) + SUBGOAL_THEN + `!n. variance (p:A prob_space) + (\x. min (max ((X:num->A->real) n x) (--c)) c - + expectation p (\y. min (max (X n y) (--c)) c)) = + variance p (\x. min (max (X n x) (--c)) c)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_SUB_CONST THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + (* Step 2b: convergence of sum(Z_n) implies convergence of sum(clamp) *) + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `?M. ((\n. sum(0..n) + (\i. expectation (p:A prob_space) (\y. min(max((X:num->A->real) i y)(--c)) c))) ---> M) + sequentially` STRIP_ASSUME_TAC THENL + [USE_THEN "exp_sum" MP_TAC THEN + REWRITE_TAC[real_summable; real_sums; FROM_INTER_NUMSEG] THEN + MESON_TAC[]; + ALL_TAC] THEN + EXISTS_TAC `L + M:real` THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n. sum(0..n) + (\i. min (max ((X:num->A->real) i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) + + sum(0..n) (\i. expectation p (\y. min (max (X i y) (--c)) c))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN + REWRITE_TAC[GSYM SUM_ADD_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_ADD THEN ASM_REWRITE_TAC[]]]);; + +(* ========================================================================= *) +(* Kolmogorov Three-Series Theorem (Necessity): Supporting Lemmas *) +(* ========================================================================= *) + +(* Convergent series have terms that eventually vanish *) +let CONVERGENT_SERIES_TERMS_VANISH = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> almost_surely p {x | ?N. !n. N <= n ==> abs(X n x) <= c}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` ALMOST_SURELY_SUBSET) THEN + EXISTS_TAC `{x:A | ?L. ((\n. sum(0..n) (\i. (X:num->A->real) i x)) ---> L) + sequentially}` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `c / &2`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(X:num->A->real) n x = + sum(0..n) (\i. X i x) - sum(0..PRE n) (\i. X i x)` SUBST1_TAC THENL + [MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `0`; `PRE n`; `n:num`] + SUM_COMBINE_R) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `PRE n + 1 = n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[NUMSEG_SING; SUM_SING] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `abs(sum(0..n) (\i. (X:num->A->real) i x) - L) < c / &2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `abs(sum(0..PRE n) (\i. (X:num->A->real) i x) - L) < c / &2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `PRE n`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[]]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +(* Utility: almost_surely events are nonempty (contain some x in prob_carrier) *) +let ALMOST_SURELY_NONEMPTY = prove + (`!p:A prob_space s. + almost_surely p s + ==> ?x. x IN prob_carrier p /\ x IN s`, + REPEAT GEN_TAC THEN REWRITE_TAC[almost_surely; null_event] THEN + STRIP_TAC THEN + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) SUBSET (n:A->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ ~(x IN s)}` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `prob_carrier (p:A prob_space)`; `n:A->bool`] + PROB_MONO) THEN + ASM_REWRITE_TAC[PROB_SPACE; PROB_CARRIER_IN_EVENTS] THEN + ASM_REAL_ARITH_TAC);; + +(* Three-Series Necessity: Condition 1 + If independent events (abs X_n > c) and sum X_n converges a.s., + then sum P(abs X_n > c) < infinity. + Proof: Second Borel-Cantelli contrapositive. *) +let THREE_SERIES_CONDITION1 = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + (!n. integrable p (X n)) /\ + indep_events_seq p (\n. {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c})`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c}`] + SECOND_BOREL_CANTELLI) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `c:real`] + CONVERGENT_SERIES_TERMS_VANISH) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[almost_surely] THEN + DISCH_THEN(X_CHOOSE_THEN `NE:A->bool` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c}) + SUBSET (NE:A->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + ~(x IN {x | ?N. !n:num. N <= n ==> abs((X:num->A->real) n x) <= c})}` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET; limsup_events; IN_INTERS; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC + `UNIONS {(\n. {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x) > c}) n | n >= 0}`) THEN + ANTS_TAC THENL [EXISTS_TAC `0` THEN REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` + (CONJUNCTS_THEN2 ASSUME_TAC SUBST_ALL_TAC)) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + SIMP_TAC[]; + REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; NOT_IMP] THEN + X_GEN_TAC `N:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `UNIONS {(\n. {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x) > c}) n | n >= N}`) THEN + ANTS_TAC THENL [EXISTS_TAC `N:num` THEN REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` + (CONJUNCTS_THEN2 ASSUME_TAC SUBST_ALL_TAC)) THEN + EXISTS_TAC `m:num` THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + REWRITE_TAC[real_gt; REAL_NOT_LE; GE] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[GSYM GE]]; + ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) (limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})) + <= prob p NE` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN + GEN_TAC THEN CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [null_event]) THEN + SIMP_TAC[]]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [null_event]) THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC);; + +(* Reduction to bounded case: First BC gives Y_n = X_n eventually, + then tail equivalence gives sum Y_n converges a.s. *) +let THREE_SERIES_REDUCTION = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + (!n. integrable p (X n)) /\ + real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. min(max(X i x) (--c)) c)) ---> L) + sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c}`] + BOREL_CANTELLI_ALMOST_SURELY) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + CONV_TAC(ONCE_DEPTH_CONV BETA_CONV) THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\i:num. \x:A. min (max ((X:num->A->real) i x) (--c)) c`; + `X:num->A->real`] + TAIL_EQUIVALENCE_CONVERGENCE) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(fun th -> MATCH_MP_TAC th) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` ALMOST_SURELY_SUBSET) THEN + EXISTS_TAC `{x:A | ?N. !n. N <= n + ==> ~(x IN {x | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})}` THEN + ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + REWRITE_TAC[real_gt; REAL_NOT_LT; DE_MORGAN_THM] THEN + STRIP_TAC THEN REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC);; + +(* Cauchy-Schwarz inequality for expectations: + E[XY]^2 <= E[X^2] * E[Y^2] *) +let EXPECTATION_CAUCHY_SCHWARZ = prove + (`!p:A prob_space X Y. + integrable p X /\ integrable p Y /\ + integrable p (\x. X x pow 2) /\ integrable p (\x. Y x pow 2) /\ + integrable p (\x. X x * Y x) + ==> expectation p (\x. X x * Y x) pow 2 <= + expectation p (\x. X x pow 2) * expectation p (\x. Y x pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `a = expectation p (\x:A. (X:A->real) x pow 2)` THEN + ABBREV_TAC `b = expectation p (\x:A. (X:A->real) x * (Y:A->real) x)` THEN + ABBREV_TAC `cc = expectation p (\x:A. (Y:A->real) x pow 2)` THEN + SUBGOAL_THEN `!t:real. &0 <= a - &2 * b * t + cc * t pow 2` ASSUME_TAC THENL + [X_GEN_TAC `t:real` THEN + SUBGOAL_THEN `a - &2 * b * t + cc * t pow 2 = + expectation (p:A prob_space) (\x. ((X:A->real) x - t * (Y:A->real) x) pow 2)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. ((X:A->real) x - t * (Y:A->real) x) pow 2) = + (\x. X x pow 2 + (t pow 2 * Y x pow 2 - &2 * t * X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. t pow 2 * (Y:A->real) x pow 2 - &2 * t * (X:A->real) x * Y x)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. &2 * t * (X:A->real) x * (Y:A->real) x) = + (\x. (&2 * t) * (X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. (X:A->real) x pow 2`; + `\x:A. t pow 2 * (Y:A->real) x pow 2 - &2 * t * (X:A->real) x * Y x`] + EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. t pow 2 * (Y:A->real) x pow 2`; + `\x:A. &2 * t * (X:A->real) x * (Y:A->real) x`] EXPECTATION_SUB) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. &2 * t * (X:A->real) x * (Y:A->real) x) = + (\x. (&2 * t) * (X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_TAC THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. t pow 2 * (Y:A->real) x pow 2) = + t pow 2 * cc` SUBST1_TAC THENL + [TRANS_TAC EQ_TRANS + `(t pow 2) * expectation (p:A prob_space) (\x:A. (Y:A->real) x pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. &2 * t * (X:A->real) x * (Y:A->real) x) = &2 * t * b` SUBST1_TAC THENL + [SUBGOAL_THEN `(\x:A. &2 * t * (X:A->real) x * (Y:A->real) x) = + (\x. (&2 * t) * (X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + TRANS_TAC EQ_TRANS + `(&2 * t) * expectation (p:A prob_space) (\x:A. (X:A->real) x * (Y:A->real) x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. ((X:A->real) x - t * (Y:A->real) x) pow 2) = + (\x. X x pow 2 + (t pow 2 * Y x pow 2 - &2 * t * X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. &2 * t * (X:A->real) x * (Y:A->real) x) = + (\x. (&2 * t) * (X x * Y x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]]]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= a /\ &0 <= cc` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [EXPAND_TAC "a" THEN MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + EXPAND_TAC "cc" THEN MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]]; + ALL_TAC] THEN + ASM_CASES_TAC `cc = &0` THENL + [SUBGOAL_THEN `b = &0` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `~(&0 < b) /\ ~(b < &0) ==> b = &0`) THEN + CONJ_TAC THEN DISCH_TAC THENL + [MP_TAC(SPEC `&2 * b` REAL_ARCH) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN + DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&n`) THEN + ASM_REWRITE_TAC[REAL_POW_2; REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ADD_RID] THEN + UNDISCH_TAC `a < &n * (&2 * b)` THEN REAL_ARITH_TAC; + MP_TAC(SPEC `&2 * --b` REAL_ARCH) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN + DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `-- &n`) THEN + ASM_REWRITE_TAC[REAL_POW_2; REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_ADD_RID] THEN + UNDISCH_TAC `a < &n * (&2 * --b)` THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[REAL_POW_2; REAL_MUL_LZERO; REAL_MUL_RZERO; REAL_LE_REFL]]; + SUBGOAL_THEN `&0 < cc` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `!t:real. &0 <= a - &2 * b * t + cc * t pow 2` THEN + DISCH_THEN(MP_TAC o SPEC `(b:real) / cc`) THEN + SUBGOAL_THEN `a - &2 * b * b / cc + cc * (b / cc) pow 2 = + (a * cc - b pow 2) / cc` SUBST1_TAC THENL + [UNDISCH_TAC `~(cc = &0)` THEN CONV_TAC REAL_FIELD; ALL_TAC] THEN + DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a * cc - b pow 2 ==> b pow 2 <= a * cc`) THEN + SUBGOAL_THEN `&0 * cc <= a * cc - b pow 2` MP_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_LE_RDIV_EQ; REAL_MUL_LZERO] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_LZERO]]]);; + +(* Expectation split over an event: E[f] = E[f*1_A] + E[f*1_{A^c}] *) +let EXPECTATION_SPLIT = prove + (`!p:A prob_space f (a:A->bool). + integrable p f /\ a IN prob_events p + ==> expectation p f = expectation p (\x. f x * indicator_fn a x) + + expectation p (\x. f x * indicator_fn (prob_carrier p DIFF a) x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (f:A->real) x * indicator_fn a x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(prob_carrier (p:A prob_space) DIFF a) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (f:A->real) x * indicator_fn (prob_carrier p DIFF a) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn a x) + + expectation p (\x. f x * indicator_fn (prob_carrier p DIFF a) x) = + expectation p (\x. f x * indicator_fn a x + f x * indicator_fn (prob_carrier p DIFF a) x)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `(x:A) IN a` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* Paley-Zygmund inequality: + If X >= 0 and E[X] > 0 then for 0 <= theta < 1, + (1-theta)^2 * E[X]^2 <= E[X^2] * P(X >= theta*E[X]) *) +let PALEY_ZYGMUND = prove + (`!p:A prob_space X theta. + integrable p X /\ + integrable p (\x. X x pow 2) /\ + (!x. x IN prob_carrier p ==> &0 <= X x) /\ + &0 < expectation p X /\ + &0 <= theta /\ theta < &1 + ==> ((&1 - theta) pow 2) * (expectation p X) pow 2 <= + expectation p (\x. X x pow 2) * + prob p {x | x IN prob_carrier p /\ X x >= theta * expectation p X}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `mu = expectation (p:A prob_space) (X:A->real)` THEN + ABBREV_TAC `a:A->bool = {x | x IN prob_carrier (p:A prob_space) /\ (X:A->real) x >= theta * mu}` THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [EXPAND_TAC "a" THEN MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:A->real) x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(prob_carrier (p:A prob_space) DIFF a) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:A->real) x * indicator_fn (prob_carrier p DIFF a) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Pointwise bound: on carrier, X*1_{A^c} <= theta*mu *) + SUBGOAL_THEN `!x:A. x IN prob_carrier (p:A prob_space) + ==> (X:A->real) x * indicator_fn (prob_carrier p DIFF a) x <= theta * mu` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THENL + [FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN + EXPAND_TAC "a" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[real_ge; REAL_NOT_LE] THEN + DISCH_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO] THEN + MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn (prob_carrier p DIFF a) x) <= + theta * mu` ASSUME_TAC THENL + [TRANS_TAC REAL_LE_TRANS `expectation (p:A prob_space) (\x:A. theta * mu)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + REWRITE_TAC[EXPECTATION_CONST; REAL_LE_REFL]]; + ALL_TAC] THEN + (* Step 1: (1-theta)*mu <= E[X*1_A] *) + SUBGOAL_THEN `(&1 - theta) * mu <= + expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `a:A->bool`] EXPECTATION_SPLIT) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn (prob_carrier p DIFF a) x) <= theta * mu` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 2: E[X*1_A]^2 <= E[X^2]*P(A) by Cauchy-Schwarz *) + SUBGOAL_THEN `expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn (a:A->bool) x) pow 2 <= + expectation p (\x. X x pow 2) * prob p a` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `indicator_fn (a:A->bool)`] + EXPECTATION_CAUCHY_SCHWARZ) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `(\x:A. indicator_fn (a:A->bool) x pow 2) = indicator_fn a` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn] THEN GEN_TAC THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR] THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Combine: (1-theta)^2*mu^2 <= E[X*1_A]^2 <= E[X^2]*P(A) *) + TRANS_TAC REAL_LE_TRANS + `expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn (a:A->bool) x) pow 2` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[GSYM REAL_POW_MUL] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_MUL THEN ASM_REAL_ARITH_TAC);; + +(* Nonneg divergent series has unbounded partial sums *) +let NONNEG_DIVERGENT_UNBOUNDED = prove + (`!f. (!n. &0 <= f n) /\ ~real_summable (from 0) f + ==> !B. ?N. B < sum(0..N) f`, + REPEAT STRIP_TAC THEN + (* Contrapositive: if partial sums bounded, then convergent by + monotone bounded convergence *) + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + REWRITE_TAC[REAL_NOT_LT] THEN DISCH_TAC THEN + UNDISCH_TAC `~real_summable (from 0) (f:num->real)` THEN + REWRITE_TAC[real_summable; real_sums; FROM_INTER_NUMSEG] THEN + (* Partial sums are monotone increasing and bounded *) + SUBGOAL_THEN `!n:num. sum(0..n) (f:num->real) <= sum(0..SUC n) f` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= y ==> x <= x + y`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Use monotone bounded convergence *) + MP_TAC(ISPEC `\n:num. sum(0..n) (f:num->real)` CONVERGENT_REAL_BOUNDED_MONOTONE) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[real_bounded; FORALL_IN_IMAGE; IN_UNIV] THEN + EXISTS_TAC `abs(B:real) + &1` THEN + GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= B ==> abs x <= abs B + &1`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + DISJ1_TAC THEN ASM_REWRITE_TAC[]]; + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + EXISTS_TAC `L:real` THEN ASM_REWRITE_TAC[]]);; + +(* A finite sequence of reals is bounded *) +let FINITE_REAL_SEQUENCE_BOUNDED = prove + (`!(f:num->real) N. ?B:real. !n. n < N ==> abs(f n) <= B`, + GEN_TAC THEN INDUCT_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[LT]; + FIRST_X_ASSUM(X_CHOOSE_TAC `B0:real`) THEN + EXISTS_TAC `max B0 (abs((f:num->real) N))` THEN + X_GEN_TAC `m:num` THEN REWRITE_TAC[LT] THEN STRIP_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `x <= a ==> x <= max a b`) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]]);; + +(* A convergent real sequence is bounded by a natural number *) +let REALLIM_IMP_BOUNDED_NUM = prove + (`!f:num->real L. + (f ---> L) sequentially ==> ?K:num. !n. abs(f n) <= &K`, + REPEAT GEN_TAC THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + MP_TAC(SPECL [`f:num->real`; `N:num`] FINITE_REAL_SEQUENCE_BOUNDED) THEN + DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN + MP_TAC(SPEC `abs(B) + abs(L:real) + &1` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `K:num`) THEN + EXISTS_TAC `K:num` THEN X_GEN_TAC `n:num` THEN + ASM_CASES_TAC `n:num < N` THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `B:real` THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ASM_REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs(L:real) + &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `abs(x - l) < &1 ==> abs x <= abs l + &1`) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ASM_REAL_ARITH_TAC]]);; + +(* Helper: Paley-Zygmund gives a lower bound on P(S_n^2 >= E[S_n^2]/2) *) +let PALEY_ZYGMUND_LOWER_BOUND = prove + (`!p:A prob_space (Z:num->A->real) C n. + &0 < C /\ + integrable p (\x. sum(0..n) (\i. Z i x) pow 2) /\ + integrable p (\x. sum(0..n) (\i. Z i x) pow 4) /\ + expectation p (\x. sum(0..n) (\i. Z i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) pow 2 /\ + &0 < expectation p (\x. sum(0..n) (\i. Z i x) pow 2) + ==> inv(&4 * C) <= + prob p {x | x IN prob_carrier p /\ + sum(0..n) (\i. Z i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..n) (\i. Z i x) pow 2)}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 2`; + `inv(&2)`] PALEY_ZYGMUND) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC; + CONV_TAC REAL_RAT_REDUCE_CONV]; + ALL_TAC] THEN + SUBGOAL_THEN `(&1 - inv(&2)) pow 2 = inv(&4)` SUBST1_TAC THENL + [CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN + REWRITE_TAC[REAL_INV_MUL] THEN DISCH_TAC THEN + ABBREV_TAC `E1 = expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 2)` THEN + ABBREV_TAC `E4 = expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 4)` THEN + ABBREV_TAC `P0 = prob (p:A prob_space) + {x | x IN prob_carrier p /\ + sum(0..n) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * E1}` THEN + SUBGOAL_THEN `&0 <= P0` ASSUME_TAC THENL + [EXPAND_TAC "P0" THEN MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `inv(&4) <= C * P0` ASSUME_TAC THENL + [SUBGOAL_THEN `inv(&4) * E1 pow 2 <= (C * P0) * E1 pow 2` + MP_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(E4:real) * P0` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(C * P0) * E1 pow 2 = (C * E1 pow 2) * (P0:real)` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[REAL_LE_RMUL_EQ; REAL_POW_LT]]; + ALL_TAC] THEN + REWRITE_TAC[GSYM real_div] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]);; + +(* Helper: {x | ?n. S_n(x)^2 > &K} is an event *) +let PROB_INDEXED_UNION_EVENTS_LEMMA = prove + (`!p:A prob_space (Z:num->A->real) K. + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 2)) + ==> {x | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. Z i x) pow 2 > &K} IN prob_events p`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `!n:num t. {x:A | x IN prob_carrier p /\ + sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > t} IN prob_events p` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &K} = + UNIONS {(\n. {x | x IN prob_carrier p /\ + sum(0..n) (\i. Z i x) pow 2 > &K}) n | n IN (:num)}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNIONS] THEN + X_GEN_TAC `y:A` THEN EQ_TAC THENL + [DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (X_CHOOSE_TAC `m:num`)) THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + sum(0..m) (\i. (Z:num->A->real) i x) pow 2 > &K}` THEN + CONJ_TAC THENL + [EXISTS_TAC `m:num` THEN REWRITE_TAC[IN_UNIV] THEN + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[]]; + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `y:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + REWRITE_TAC[] THEN ASM_REWRITE_TAC[]]);; + +(* Helper: convergent partial sums implies y in INTERS is in null event *) +let PARTIAL_SUM_INTERS_SUBSET_NULL = prove + (`!p:A prob_space (Z:num->A->real) ne. + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 2)) /\ + null_event p ne /\ + {x | x IN prob_carrier p /\ + ~(x IN {x | ?L. ((\n. sum(0..n) (\i. Z i x)) ---> L) sequentially})} + SUBSET ne /\ + (!K. {x | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. Z i x) pow 2 > &K} IN prob_events p) + ==> INTERS {{x | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. Z i x) pow 2 > &n} | + n IN (:num)} SUBSET ne`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[SUBSET; IN_INTERS; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `y:A IN prob_carrier p` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. (Z:num->A->real) i x) pow 2 > &0}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `0` THEN REFL_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `y:A IN {x:A | x IN prob_carrier p /\ + ~(x IN {x | ?L. ((\n. sum(0..n) (\i. (Z:num->A->real) i x)) ---> L) + sequentially})}` MP_TAC THENL + [ALL_TAC; ASM SET_TAC[]] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + MP_TAC(SPECL [`\n:num. sum(0..n) + (\i. (Z:num->A->real) i (y:A))`; `L:real`] + REALLIM_IMP_BOUNDED_NUM) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `K:num`) THEN + UNDISCH_TAC `!t:A->bool. (?n. t = {x | x IN prob_carrier p /\ + (?n'. sum (0..n') (\i. (Z:num->A->real) i x) pow 2 > &n)}) + ==> y IN t` THEN + DISCH_THEN(MP_TAC o SPEC `{x:A | x IN prob_carrier p /\ + (?n':num. sum (0..n') (\i. (Z:num->A->real) i x) pow 2 > + &(K * K + 1))}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `K * K + 1` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) (X_CHOOSE_TAC `m:num`)) THEN + SUBGOAL_THEN `sum (0..m) (\i. (Z:num->A->real) i (y:A)) pow 2 + <= (&K) pow 2` MP_TAC THENL + [ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[REAL_ARITH `abs(&K) = &K`]; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN + UNDISCH_TAC `sum (0..m) (\i. (Z:num->A->real) i (y:A)) pow 2 > + &(K * K + 1)` THEN + REWRITE_TAC[REAL_POW_2; GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_ADD] THEN + REAL_ARITH_TAC);; + +(* Helper: a.s. convergence implies P(S_n^2 > K) -> 0 *) +let PARTIAL_SUM_LEVEL_PROB_VANISHES = prove + (`!p:A prob_space (Z:num->A->real). + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 2)) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Z i x)) ---> L) sequentially} + ==> ((\K. prob p {x | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. Z i x) pow 2 > &K}) + ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [almost_surely]) THEN + DISCH_THEN(X_CHOOSE_THEN `ne:A->bool` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `!K. {x:A | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &K} + IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_EVENTS_LEMMA THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!K. {x:A | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &(SUC K)} + SUBSET + {x | x IN prob_carrier p /\ + ?n. sum(0..n) (\i. Z i x) pow 2 > &K}` ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `n:num` THEN + UNDISCH_TAC + `sum(0..n) (\i. (Z:num->A->real) i (y:A)) pow 2 > &(SUC K)` THEN + REWRITE_TAC[GSYM REAL_OF_NUM_SUC] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPEC `p:A prob_space` PROB_CONTINUITY_FROM_ABOVE) THEN + DISCH_THEN(MP_TAC o SPEC + `\K:num. {x:A | x IN prob_carrier p /\ + ?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &K}`) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN `prob (p:A prob_space) + (INTERS {{x:A | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. (Z:num->A->real) i x) pow 2 > &n} | + n IN (:num)}) = &0` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (ne:A->bool)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [UNDISCH_TAC `null_event (p:A prob_space) (ne:A->bool)` THEN + REWRITE_TAC[null_event] THEN MESON_TAC[]; + MATCH_MP_TAC PARTIAL_SUM_INTERS_SUBSET_NULL THEN + ASM_REWRITE_TAC[]]]; + UNDISCH_TAC `null_event (p:A prob_space) (ne:A->bool)` THEN + REWRITE_TAC[null_event] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN ASM_REWRITE_TAC[]);; + +(* Key lemma: If second moments of partial sums are unbounded and + fourth moments satisfy E[S^4] <= C * E[S^2]^2, then partial sums + cannot converge a.s. Uses helpers: PALEY_ZYGMUND_LOWER_BOUND for + the PZ step and PARTIAL_SUM_LEVEL_PROB_VANISHES for the a.s. + convergence => prob vanishes argument. *) +let BOUNDED_INDEP_DIVERGENT_VARIANCE_DIVERGES = prove + (`!p:A prob_space (Z:num->A->real) C. + &1 <= C /\ + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 2)) /\ + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 4)) /\ + (!n. expectation p (\x. sum(0..n) (\i. Z i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) pow 2) /\ + (!B. ?N. B < expectation p (\x. sum(0..N) (\i. Z i x) pow 2)) + ==> ~almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Z i x)) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`] + PARTIAL_SUM_LEVEL_PROB_VANISHES) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `inv(&4 * C)`) THEN + SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&4 * C)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC REAL_LT_MUL THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `K0:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + (?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &K0)} + < inv(&4 * C)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `K0:num`) THEN + REWRITE_TAC[LE_REFL; REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x < d ==> x < d`) THEN + MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_UNION_EVENTS_LEMMA THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `!B. ?N:num. B < expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` THEN + DISCH_THEN(MP_TAC o SPEC `&2 * &K0 + &2`) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + SUBGOAL_THEN `&0 < expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `C:real`; `N:num`] + PALEY_ZYGMUND_LOWER_BOUND) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)} + SUBSET + {x | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. Z i x) pow 2 > &K0}` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `N:num` THEN + SUBGOAL_THEN `&K0 < inv(&2) * expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)} + <= prob p {x | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. Z i x) pow 2 > &K0}` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_EVENTS_LEMMA THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ABBREV_TAC `p1 = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)}` THEN + ABBREV_TAC `p2 = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. (Z:num->A->real) i x) pow 2 > &K0}` THEN + ASM_REAL_ARITH_TAC);; + +(* Three-Series Necessity: Condition (3) + If sum Y_n converges a.s. (where Y_n bounded, mean-zero centered Z_n + uncorrelated, with fourth moment bound on partial sums and sum E[Y_n] + convergent), then sum Var(Y_n) < infinity. + Additional hypotheses: C >= 1, fourth moment bound E[S^4] <= C*E[S^2]^2, + and real_summable E[Y_n]. These follow from independence of X_n but are + stated abstractly here. The main THREE_SERIES_NECESSITY will provide them. *) +let THREE_SERIES_CONDITION3 = prove + (`!p:A prob_space (X:num->A->real) c C. + &0 < c /\ &1 <= C /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!i j. ~(i = j) ==> covariance p + (\x. min(max(X i x) (--c)) c - expectation p (\y. min(max(X i y) (--c)) c)) + (\x. min(max(X j x) (--c)) c - expectation p (\y. min(max(X j y) (--c)) c)) + = &0) /\ + (!n x. x IN prob_carrier p ==> abs(min(max(X n x) (--c)) c - + expectation p (\y. min(max(X n y) (--c)) c)) <= &2 * c) /\ + (!n. expectation p (\x. sum(0..n) (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) pow 2) pow 2) /\ + real_summable (from 0) (\n. expectation p (\x. min(max(X n x) (--c)) c)) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. min(max(X i x) (--c)) c)) ---> L) + sequentially} + ==> real_summable (from 0) (\n. variance p (\x. min(max(X n x) (--c)) c))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `Y = \n (x:A). min(max((X:num->A->real) n x) (--c)) c` THEN + ABBREV_TAC `Z = \n (x:A). (Y:num->A->real) n x - + expectation (p:A prob_space) (\y:A. Y n y)` THEN + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + (* Z_n integrable *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((Z:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + (* Z_n^2 integrable *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. (Z:num->A->real) n x pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&2 * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* E[Z_n] = 0 *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) ((Z:num->A->real) n) = &0` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MP_TAC(ISPECL [`p:A prob_space`; `(Y:num->A->real) n`; + `\x:A. expectation (p:A prob_space) (\y:A. (Y:num->A->real) n y)`] + EXPECTATION_SUB) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[EXPECTATION_CONST; ETA_AX] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Var(Z_n) = Var(Y_n) *) + SUBGOAL_THEN `!n. variance (p:A prob_space) ((Z:num->A->real) n) = + variance p ((Y:num->A->real) n)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `(\x:A. (Y:num->A->real) n x - + expectation (p:A prob_space) (\y:A. Y n y)) = + (\x. Y n x + (-- expectation p (\y. Y n y)))` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC VARIANCE_SHIFT THEN + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* ~summable Var(Z) *) + SUBGOAL_THEN `~real_summable (from 0) + (\n. variance (p:A prob_space) ((Z:num->A->real) n))` ASSUME_TAC THENL + [UNDISCH_TAC `~real_summable (from 0) + (\n. variance p (\x:A. min(max((X:num->A->real) n x) (--c)) c))` THEN + MATCH_MP_TAC(TAUT `(p ==> q) ==> ~q ==> ~p`) THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REAL_SUMMABLE_EQ) THEN + REWRITE_TAC[IN_FROM] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN REWRITE_TAC[]; + ALL_TAC] THEN + (* Var(Z) >= 0 *) + SUBGOAL_THEN `!n. &0 <= variance (p:A prob_space) ((Z:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `(&2 * c) pow 2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + SUBGOAL_THEN `(Z:num->A->real) n (x:A) - + expectation (p:A prob_space) (Z n) = Z n x` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Uncorrelation of Z *) + SUBGOAL_THEN `!i j. ~(i = j) ==> covariance (p:A prob_space) + ((Z:num->A->real) i) (Z j) = &0` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) = (\k (x:A). + min(max((X:num->A->real) k x) (--c)) c - + expectation (p:A prob_space) (\y. min(max(X k y) (--c)) c))` + SUBST1_TAC THENL + [EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REWRITE_TAC[]; + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Integrability of partial sums^2 *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `((&(n + 1)) * (&2 * c)) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i (x:A)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + BETA_TAC THEN + EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUC] THEN + REWRITE_TAC[ADD1] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Integrability of partial sums^4 *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x) pow 4)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `((&(n + 1)) * (&2 * c)) pow 4` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i (x:A)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + BETA_TAC THEN + EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUC] THEN + REWRITE_TAC[ADD1] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Fourth moment bound for Z partial sums *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) pow 2` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) = (\k (x:A). + min(max((X:num->A->real) k x) (--c)) c - + expectation (p:A prob_space) (\y. min(max(X k y) (--c)) c))` + SUBST1_TAC THENL + [EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REWRITE_TAC[]; + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* E[S_n^2] = sum(0..n) Var(Z_i) *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x) pow 2) = + sum(0..n) (\i. variance p (Z i))` ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `variance (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x)) = + sum(0..n) (\i. variance p (Z i))` ASSUME_TAC THENL + [MATCH_MP_TAC VARIANCE_SUM_UNCORRELATED THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. sum(0..n) (\i. (Z:num->A->real) i x)) = &0` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `n:num`] + EXPECTATION_SUM) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; DISCH_THEN SUBST1_TAC] THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN + REWRITE_TAC[variance] THEN AP_TERM_TAC THEN + REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Divergence: !B. ?N. B < E[S_N^2] *) + SUBGOAL_THEN `!B. ?N:num. B < expectation (p:A prob_space) + (\x. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(SPEC `\i. variance (p:A prob_space) ((Z:num->A->real) i)` + NONNEG_PARTIAL_SUMS_UNBOUNDED) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + BETA_TAC THEN DISCH_THEN(MP_TAC o SPEC `B + &1`) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `N:num` THEN + UNDISCH_TAC `!n:num. expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 2) = + sum(0..n) (\i. variance p (Z i))` THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `B + &1 <= sum(0..N) + (\i. variance (p:A prob_space) ((Z:num->A->real) i))` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Apply BOUNDED_INDEP to get ~almost_surely {sum Z converges} *) + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `C:real`] + BOUNDED_INDEP_DIVERGENT_VARIANCE_DIVERGES) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[] THEN + (* Show almost_surely p {sum Z converges} *) + SUBGOAL_THEN `almost_surely (p:A prob_space) + {x:A | ?L. ((\n. sum(0..n) (\i. (Z:num->A->real) i x)) ---> L) + sequentially}` ASSUME_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ?L. ((\n. sum(0..n) + (\i. (Y:num->A->real) i x)) ---> L) sequentially}` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [UNDISCH_TAC `almost_surely (p:A prob_space) + {x:A | ?L. ((\n. sum(0..n) + (\i. min(max((X:num->A->real) i x) (--c)) c)) ---> L) + sequentially}` THEN + SUBGOAL_THEN `{x:A | ?L. ((\n. sum(0..n) + (\i. min(max((X:num->A->real) i x) (--c)) c)) ---> L) + sequentially} = + {x | ?L. ((\n. sum(0..n) (\i. (Y:num->A->real) i x)) ---> L) + sequentially}` ASSUME_TAC THENL + [EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN REFL_TAC; + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + DISCH_TAC THEN DISCH_THEN(X_CHOOSE_TAC `LY:real`) THEN + (* sum Y converges to LY, sum E[Y] converges (real_summable) *) + (* sum Z = sum Y - sum E[Y] converges *) + SUBGOAL_THEN `?LE. ((\n. sum(0..n) (\i. expectation (p:A prob_space) + (\y:A. (Y:num->A->real) i y))) ---> LE) sequentially` + (X_CHOOSE_TAC `LE:real`) THENL + [UNDISCH_TAC `real_summable (from 0) + (\n. expectation (p:A prob_space) (\x:A. min(max((X:num->A->real) n x) (--c)) c))` THEN + REWRITE_TAC[real_summable; real_sums; FROM_INTER_NUMSEG] THEN + MATCH_MP_TAC(MESON[] `(f:num->real) = g ==> (?l. (f ---> l) sequentially) ==> (?l. (g ---> l) sequentially)`) THEN + REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN REWRITE_TAC[]; + ALL_TAC] THEN + EXISTS_TAC `LY - LE:real` THEN + MP_TAC(ISPECL [`sequentially`; + `\n. sum(0..n) (\i. (Y:num->A->real) i (x:A))`; + `\n. sum(0..n) (\i. expectation (p:A prob_space) (\y:A. Y i y))`; + `LY:real`; `LE:real`] REALLIM_SUB) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] REALLIM_TRANSFORM) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + SIMP_TAC[REAL_ARITH `a - b - (a - b) = &0`; SUM_0] THEN + REWRITE_TAC[REALLIM_CONST]]; + ASM_MESON_TAC[]]);; + +(* Three-Series Necessity: Condition (2) + sum E[Y_n] converges. Uses Condition (3) + Kolmogorov convergence criterion. + Proof: Apply KCC to Z_n = Y_n - E[Y_n] to get sum Z_n converges a.s. + Then sum E[Y_n] = sum Y_n - sum Z_n converges at any point where both converge. *) +let THREE_SERIES_CONDITION2 = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!i j. ~(i = j) ==> covariance p + (\x. min(max(X i x) (--c)) c - expectation p (\y. min(max(X i y) (--c)) c)) + (\x. min(max(X j x) (--c)) c - expectation p (\y. min(max(X j y) (--c)) c)) + = &0) /\ + (!n x. x IN prob_carrier p ==> abs(min(max(X n x) (--c)) c - + expectation p (\y. min(max(X n y) (--c)) c)) <= &2 * c) /\ + (!a b k t. + a <= k /\ k < b /\ &0 < t + ==> expectation p + (\x. sum(a..k) + (\i. min (max (X i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) * + sum(SUC k..b) + (\i. min (max (X i x) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c)) * + indicator_fn + {z | z IN prob_carrier p /\ + (!j. a <= j /\ j < k + ==> abs(sum(a..j) + (\i. min (max (X i z) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c))) < t) /\ + abs(sum(a..k) + (\i. min (max (X i z) (--c)) c - + expectation p (\y. min (max (X i y) (--c)) c))) >= t} x) = &0) /\ + real_summable (from 0) (\n. variance p (\x. min(max(X n x) (--c)) c)) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. min(max(X i x) (--c)) c)) ---> L) + sequentially} + ==> real_summable (from 0) (\n. expectation p (\x. min(max(X n x) (--c)) c))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `Y = \n (x:A). min(max((X:num->A->real) n x) (--c)) c` THEN + ABBREV_TAC `Z = \n (x:A). (Y:num->A->real) n x - + expectation (p:A prob_space) (\y:A. Y n y)` THEN + (* Step 1: Establish Z_n properties for KOLMOGOROV_CONVERGENCE_CRITERION *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((Z:num->A->real) n)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) (\x. (Z:num->A->real) n x pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&2 * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation (p:A prob_space) ((Z:num->A->real) n) = &0` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MP_TAC(ISPECL [`p:A prob_space`; `(Y:num->A->real) n`; + `\x:A. expectation (p:A prob_space) (\y:A. (Y:num->A->real) n y)`] + EXPECTATION_SUB) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[EXPECTATION_CONST; ETA_AX] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Variance identity: Var(Z_n) = Var(Y_n) *) + SUBGOAL_THEN `!n. variance (p:A prob_space) ((Z:num->A->real) n) = + variance p ((Y:num->A->real) n)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `(\x:A. (Y:num->A->real) n x - expectation (p:A prob_space) (\y:A. Y n y)) = + (\x. Y n x + (-- expectation p (\y. Y n y)))` (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC VARIANCE_SHIFT THEN + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 2: Apply KOLMOGOROV_CONVERGENCE_CRITERION to get sum Z_n converges a.s. *) + SUBGOAL_THEN `almost_surely (p:A prob_space) + {x:A | ?L. ((\n. sum(0..n) (\i. (Z:num->A->real) i x)) ---> L) sequentially}` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`] KOLMOGOROV_CONVERGENCE_CRITERION) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN + EXPAND_TAC "Z" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* Cross-term condition: Z_i = Y_i - E[Y_i], same as hypothesis *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!i (x:A). (Z:num->A->real) i x = + min(max((X:num->A->real) i x) (--c)) c - + expectation (p:A prob_space) (\y. min(max(X i y) (--c)) c)` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "Z" THEN EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]; + (* Summable variance: ASM_REWRITE_TAC above rewrites Z to Y via asm 13 *) + EXPAND_TAC "Y" THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_REWRITE_TAC[]]; + DISCH_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 3: Intersect the two a.s. events, extract a point *) + MP_TAC(ISPECL [`p:A prob_space`; + `{x:A | ?L. ((\n. sum(0..n) (\i. min(max((X:num->A->real) i x) (--c)) c)) ---> L) sequentially}`; + `{x:A | ?L. ((\n. sum(0..n) (\i. (Z:num->A->real) i x)) ---> L) sequentially}`] + ALMOST_SURELY_INTER) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `{x:A | ?L. ((\n. sum(0..n) (\i. min(max((X:num->A->real) i x) (--c)) c)) ---> L) sequentially} INTER + {x:A | ?L. ((\n. sum(0..n) (\i. (Z:num->A->real) i x)) ---> L) sequentially}`] + ALMOST_SURELY_NONEMPTY) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `x0:A` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC `LY:real`) (X_CHOOSE_TAC `LZ:real`)) THEN + (* Step 4: Show the deterministic series converges *) + REWRITE_TAC[real_summable; real_sums; FROM_INTER_NUMSEG] THEN + EXISTS_TAC `(LY:real) - (LZ:real)` THEN + SUBGOAL_THEN `(\n. sum (0..n) + (\i. expectation (p:A prob_space) (\x. min(max((X:num->A->real) i x) (--c)) c))) = + (\n. sum(0..n) (\i. min(max(X i (x0:A)) (--c)) c) - + sum(0..n) (\i. (Z:num->A->real) i x0))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `n:num` THEN + REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN EXPAND_TAC "Z" THEN + CONV_TAC(ONCE_DEPTH_CONV ETA_CONV) THEN + EXPAND_TAC "Y" THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_SUB THEN ASM_REWRITE_TAC[]]);; + +(* Break circular dependency between CONDITION2 and CONDITION3: + Prove summable Var directly from a.s. convergence + BIDVD contrapositive. + Key insight: BIDVD works for non-centered Y_n, needing only + E[S_n^2] unbounded + fourth moment bound. If ~summable Var, then + Var(S_n) = sum Var(Y_k) -> infinity (by uncorrelation), hence + E[S_n^2] >= Var(S_n) -> infinity, so BIDVD gives ~a.s. convergence. *) +let SUMMABLE_VARIANCE_FROM_CONVERGENCE = prove + (`!p:A prob_space (Y:num->A->real) C. + &1 <= C /\ + (!n. integrable p (Y n)) /\ + (!n. integrable p (\x. Y n x pow 2)) /\ + (!i j. ~(i = j) ==> covariance p (Y i) (Y j) = &0) /\ + (!n. integrable p (\x. sum(0..n) (\i. Y i x) pow 2)) /\ + (!n. integrable p (\x. sum(0..n) (\i. Y i x) pow 4)) /\ + (!n. expectation p (\x. sum(0..n) (\i. Y i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Y i x) pow 2) pow 2) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially} + ==> real_summable (from 0) (\n. variance p (Y n))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + (* Var(Y n) >= 0 *) + SUBGOAL_THEN `!n. &0 <= variance (p:A prob_space) ((Y:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + REWRITE_TAC[REAL_ARITH `(a - b:real) pow 2 = a pow 2 - &2 * b * a + b pow 2`] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. &2 * expectation (p:A prob_space) ((Y:num->A->real) n) * Y n x) = + (\x. (&2 * expectation p (Y n)) * Y n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_MUL_ASSOC]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + (* E[S_n^2] is unbounded *) + SUBGOAL_THEN `!B. ?N:num. B < expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Y:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [X_GEN_TAC `B:real` THEN + MP_TAC(SPEC `\n:num. variance (p:A prob_space) ((Y:num->A->real) n)` + NONNEG_PARTIAL_SUMS_UNBOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `B + &1`) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN + (* Var(S_N) <= E[S_N^2] *) + SUBGOAL_THEN `variance (p:A prob_space) (\x:A. sum(0..N) (\i. (Y:num->A->real) i x)) <= + expectation p (\x. sum(0..N) (\i. Y i x) pow 2)` ASSUME_TAC THENL + [SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. sum(0..N) (\i. (Y:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..N) (\i. (Y:num->A->real) i x)`] + VARIANCE_ALT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ARITH `a - b <= a <=> &0 <= b`; REAL_LE_POW_2]; + ALL_TAC] THEN + (* sum Var(Y_k) = Var(S_N) *) + SUBGOAL_THEN `sum(0..N) (\n:num. variance (p:A prob_space) ((Y:num->A->real) n)) = + variance p (\x. sum(0..N) (\i. Y i x))` ASSUME_TAC THENL + [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC VARIANCE_SUM_UNCORRELATED THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Apply BIDVD: ~a.s. convergence, contradicting hypothesis *) + MP_TAC(ISPECL [`p:A prob_space`; `Y:num->A->real`; `C:real`] + BOUNDED_INDEP_DIVERGENT_VARIANCE_DIVERGES) THEN + ASM_REWRITE_TAC[]);; + +(* Helper: an unbounded sequence exceeds any threshold beyond any index *) +let UNBOUNDED_EVENTUALLY = prove + (`!f:num->real. (!B. ?N. B < f N) ==> (!B N0. ?N. N0 <= N /\ B < f N)`, + GEN_TAC THEN DISCH_TAC THEN REPEAT GEN_TAC THEN + SUBGOAL_THEN `?M:real. !n:num. n < N0 ==> (f:num->real) n <= M` + STRIP_ASSUME_TAC THENL + [SPEC_TAC(`N0:num`,`m:num`) THEN INDUCT_TAC THENL + [EXISTS_TAC `&0` THEN ARITH_TAC; + FIRST_X_ASSUM(X_CHOOSE_TAC `M:real`) THEN + EXISTS_TAC `max M ((f:num->real) m)` THEN + GEN_TAC THEN REWRITE_TAC[LT] THEN STRIP_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `x <= M ==> x <= max M y`) THEN + ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `max B M`) THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + EXISTS_TAC `N1:num` THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N1:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]);; + +(* Weakened BIDVD: fourth moment bound only needed eventually (for n >= N0). + Proof is same as BIDVD but picks N >= max(N0, threshold) using + UNBOUNDED_EVENTUALLY. *) +let BIDVD_EVENTUALLY = prove + (`!p:A prob_space (Z:num->A->real) C. + &1 <= C /\ + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 2)) /\ + (!n. integrable p (\x. sum(0..n) (\i. Z i x) pow 4)) /\ + (?N0. !n. N0 <= n ==> + expectation p (\x. sum(0..n) (\i. Z i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) pow 2) /\ + (!B. ?N. B < expectation p (\x. sum(0..N) (\i. Z i x) pow 2)) + ==> ~almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Z i x)) ---> L) sequentially}`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC `N0:num`) ASSUME_TAC) THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`] + PARTIAL_SUM_LEVEL_PROB_VANISHES) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `inv(&4 * C)`) THEN + SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&4 * C)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC REAL_LT_MUL THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `K0:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + (?n:num. sum(0..n) (\i. (Z:num->A->real) i x) pow 2 > &K0)} + < inv(&4 * C)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `K0:num`) THEN + REWRITE_TAC[LE_REFL; REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x < d ==> x < d`) THEN + MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_UNION_EVENTS_LEMMA THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Key change: use UNBOUNDED_EVENTUALLY to pick N >= N0 *) + MP_TAC(ISPEC `\n:num. expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 2)` + UNBOUNDED_EVENTUALLY) THEN + ASM_REWRITE_TAC[] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(MP_TAC o SPECL [`&2 * &K0 + &2`; `N0:num`]) THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `&0 < expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 4) <= + C * expectation p (\x. sum(0..N) (\i. Z i x) pow 2) pow 2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[IMP_CONJ]) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `C:real`; `N:num`] + PALEY_ZYGMUND_LOWER_BOUND) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)} + SUBSET + {x | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. Z i x) pow 2 > &K0}` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `N:num` THEN + SUBGOAL_THEN `&K0 < inv(&2) * expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Z:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)} + <= prob p {x | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. Z i x) pow 2 > &K0}` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_EVENTS_LEMMA THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ABBREV_TAC `p1 = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + sum(0..N) (\i. (Z:num->A->real) i x) pow 2 >= + inv(&2) * expectation p (\x. sum(0..N) (\i. Z i x) pow 2)}` THEN + ABBREV_TAC `p2 = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + ?n':num. sum(0..n') (\i. (Z:num->A->real) i x) pow 2 > &K0}` THEN + ASM_REAL_ARITH_TAC);; + +(* Summable variance from a.s. convergence -- eventually version. + Same as SUMMABLE_VARIANCE_FROM_CONVERGENCE but fourth moment bound + only required for n >= N0, using BIDVD_EVENTUALLY. *) +let SUMMABLE_VARIANCE_FROM_CONVERGENCE_V2 = prove + (`!p:A prob_space (Y:num->A->real) C. + &1 <= C /\ + (!n. integrable p (Y n)) /\ + (!n. integrable p (\x. Y n x pow 2)) /\ + (!i j. ~(i = j) ==> covariance p (Y i) (Y j) = &0) /\ + (!n. integrable p (\x. sum(0..n) (\i. Y i x) pow 2)) /\ + (!n. integrable p (\x. sum(0..n) (\i. Y i x) pow 4)) /\ + (?N0. !n. N0 <= n ==> + expectation p (\x. sum(0..n) (\i. Y i x) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. Y i x) pow 2) pow 2) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially} + ==> real_summable (from 0) (\n. variance p (Y n))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + SUBGOAL_THEN `!n. &0 <= variance (p:A prob_space) ((Y:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + REWRITE_TAC[REAL_ARITH `(a - b:real) pow 2 = a pow 2 - &2 * b * a + b pow 2`] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\x:A. &2 * expectation (p:A prob_space) ((Y:num->A->real) n) * Y n x) = + (\x. (&2 * expectation p (Y n)) * Y n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_MUL_ASSOC]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + SUBGOAL_THEN `!B. ?N:num. B < expectation (p:A prob_space) + (\x:A. sum(0..N) (\i. (Y:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [X_GEN_TAC `B:real` THEN + MP_TAC(SPEC `\n:num. variance (p:A prob_space) ((Y:num->A->real) n)` + NONNEG_PARTIAL_SUMS_UNBOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `B + &1`) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN + SUBGOAL_THEN `variance (p:A prob_space) (\x:A. sum(0..N) (\i. (Y:num->A->real) i x)) <= + expectation p (\x. sum(0..N) (\i. Y i x) pow 2)` ASSUME_TAC THENL + [SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. sum(0..N) (\i. (Y:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. sum(0..N) (\i. (Y:num->A->real) i x)`] + VARIANCE_ALT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ARITH `a - b <= a <=> &0 <= b`; REAL_LE_POW_2]; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..N) (\n:num. variance (p:A prob_space) ((Y:num->A->real) n)) = + variance p (\x. sum(0..N) (\i. Y i x))` ASSUME_TAC THENL + [ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN MATCH_MP_TAC VARIANCE_SUM_UNCORRELATED THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Y:num->A->real`; `C:real`] + BIDVD_EVENTUALLY) THEN + ASM_REWRITE_TAC[] THEN + EXISTS_TAC `N0:num` THEN ASM_REWRITE_TAC[]);; + +(* E[X^m * Y^k] = E[X^m] * E[Y^k] for bounded independent X, Y *) +let EXPECTATION_PRODUCT_POW_BOUNDED_INDEP = prove + (`!p:A prob_space (X:A->real) (Y:A->real) m k B_X B_Y. + random_variable p X /\ random_variable p Y /\ + (!x. x IN prob_carrier p ==> abs(X x) <= B_X) /\ + (!x. x IN prob_carrier p ==> abs(Y x) <= B_Y) /\ + indep_rv p X Y + ==> expectation p (\x. X x pow m * Y x pow k) = + expectation p (\x. X x pow m) * expectation p (\x. Y x pow k)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* prob_carrier nonempty, B_X >= 0, B_Y >= 0 *) + SUBGOAL_THEN `?z:A. z IN prob_carrier p` STRIP_ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= B_X /\ &0 <= B_Y` STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs((X:A->real) z)` THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs((Y:A->real) z)` THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Shift to nonneg: U = X + B_X, V = Y + B_Y *) + ABBREV_TAC `U = \x:A. (X:A->real) x + B_X` THEN + ABBREV_TAC `V = \x:A. (Y:A->real) x + B_Y` THEN + SUBGOAL_THEN `indep_rv (p:A prob_space) U V` ASSUME_TAC THENL + [EXPAND_TAC "U" THEN EXPAND_TAC "V" THEN + MATCH_MP_TAC INDEP_RV_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) U /\ + random_variable p V` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "U" THEN EXPAND_TAC "V" THEN + CONJ_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= U x` ASSUME_TAC THENL + [EXPAND_TAC "U" THEN X_GEN_TAC `w:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `abs((X:A->real) w) <= B_X` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= V x` ASSUME_TAC THENL + [EXPAND_TAC "V" THEN X_GEN_TAC `w:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `abs((Y:A->real) w) <= B_Y` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + (* nsfa approx shifted back: Wn = nsfa(U) - B_X, Zn = nsfa(V) - B_Y *) + ABBREV_TAC `Wn = \n:num. \x:A. nonneg_simple_fn_approx p U n x - B_X` THEN + ABBREV_TAC `Zn = \n:num. \x:A. nonneg_simple_fn_approx p V n x - B_Y` THEN + (* simple_rv for Wn, Zn *) + SUBGOAL_THEN `!n:num. simple_rv (p:A prob_space) ((Wn:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Wn" THEN BETA_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `nonneg_simple_fn_approx (p:A prob_space) (U:A->real) n`; + `\t:real. t - B_X`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. simple_rv (p:A prob_space) ((Zn:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Zn" THEN BETA_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `nonneg_simple_fn_approx (p:A prob_space) (V:A->real) n`; + `\t:real. t - B_Y`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* indep_rv for Wn, Zn *) + SUBGOAL_THEN `!n:num. indep_rv (p:A prob_space) ((Wn:num->A->real) n) + ((Zn:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Wn" THEN EXPAND_TAC "Zn" THEN BETA_TAC THEN + REWRITE_TAC[real_sub] THEN MATCH_MP_TAC INDEP_RV_SHIFT THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC INDEP_RV_NSFA THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* Pointwise convergence: Wn -> X, Zn -> Y *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> ((\n. (Wn:num->A->real) n x) ---> (X:A->real) x) sequentially` + ASSUME_TAC THENL + [X_GEN_TAC `w:A` THEN DISCH_TAC THEN EXPAND_TAC "Wn" THEN BETA_TAC THEN + SUBGOAL_THEN `(X:A->real) w = U w - B_X` SUBST1_TAC THENL + [EXPAND_TAC "U" THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_SUB THEN REWRITE_TAC[REALLIM_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; `U:A->real`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_CONVERGES) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> ((\n. (Zn:num->A->real) n x) ---> (Y:A->real) x) sequentially` + ASSUME_TAC THENL + [X_GEN_TAC `w:A` THEN DISCH_TAC THEN EXPAND_TAC "Zn" THEN BETA_TAC THEN + SUBGOAL_THEN `(Y:A->real) w = V w - B_Y` SUBST1_TAC THENL + [EXPAND_TAC "V" THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_SUB THEN REWRITE_TAC[REALLIM_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; `V:A->real`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_CONVERGES) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Bounds: |Wn| <= B_X, |Zn| <= B_Y *) + SUBGOAL_THEN `!n w:A. w IN prob_carrier p + ==> abs((Wn:num->A->real) n w) <= B_X` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN EXPAND_TAC "Wn" THEN BETA_TAC THEN + SUBGOAL_THEN `nonneg_simple_fn_approx (p:A prob_space) U n w <= U w` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `U:A->real`; `n:num`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_LE) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= nonneg_simple_fn_approx (p:A prob_space) U n w` + ASSUME_TAC THENL + [REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; ALL_TAC] THEN + SUBGOAL_THEN `(U:A->real) w <= &2 * B_X` ASSUME_TAC THENL + [EXPAND_TAC "U" THEN + SUBGOAL_THEN `abs((X:A->real) w) <= B_X` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n w:A. w IN prob_carrier p + ==> abs((Zn:num->A->real) n w) <= B_Y` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN EXPAND_TAC "Zn" THEN BETA_TAC THEN + SUBGOAL_THEN `nonneg_simple_fn_approx (p:A prob_space) V n w <= V w` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `V:A->real`; `n:num`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_LE) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= nonneg_simple_fn_approx (p:A prob_space) V n w` + ASSUME_TAC THENL + [REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; ALL_TAC] THEN + SUBGOAL_THEN `(V:A->real) w <= &2 * B_Y` ASSUME_TAC THENL + [EXPAND_TAC "V" THEN + SUBGOAL_THEN `abs((Y:A->real) w) <= B_Y` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Per-step formula: E[Wn^m * Zn^k] = E[Wn^m] * E[Zn^k] *) + SUBGOAL_THEN `!n:num. expectation (p:A prob_space) + (\x. (Wn:num->A->real) n x pow m * (Zn:num->A->real) n x pow k) = + expectation p (\x. Wn n x pow m) * expectation p (\x. Zn n x pow k)` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. (Wn:num->A->real) n x pow m)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(Wn:num->A->real) n`; + `\t:real. t pow m`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. (Zn:num->A->real) n x pow k)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(Zn:num->A->real) n`; + `\t:real. t pow k`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x:A. (Wn:num->A->real) n x pow m * (Zn:num->A->real) n x pow k)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(Wn:num->A->real) n`; + `(Zn:num->A->real) n`; `\t:real. t pow m`; `\t:real. t pow k`] + SIMPLE_EXPECTATION_PRODUCT_COMPOSE_INDEP) THEN + BETA_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* Main argument: REALLIM_UNIQUE with BCT *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) (\x:A. + (Wn:num->A->real) n x pow m * (Zn:num->A->real) n x pow k)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [(* LHS: E[Wn^m * Zn^k] -> E[X^m * Y^k] by BCT *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `(B_X:real) pow m * (B_Y:real) pow k` THEN + REPEAT CONJ_TAC THENL + [(* rv: Wn^m * Zn^k *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MP_TAC(SPEC `n:num` (ASSUME `!n. indep_rv (p:A prob_space) + ((Wn:num->A->real) n) ((Zn:num->A->real) n)`)) THEN + REWRITE_TAC[indep_rv] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + (* rv: X^m * Y^k *) + MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + (* bound: |Wn^m * Zn^k| <= B_X^m * B_Y^k *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + SUBGOAL_THEN `abs((Wn:num->A->real) n x) pow m <= B_X pow m /\ + abs((Zn:num->A->real) n x) pow k <= B_Y pow k` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THEN MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]]; + (* bound: |X^m * Y^k| <= B_X^m * B_Y^k *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + SUBGOAL_THEN `abs((X:A->real) x) pow m <= B_X pow m /\ + abs((Y:A->real) x) pow k <= B_Y pow k` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THEN MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]]; + (* conv: Wn^m * Zn^k -> X^m * Y^k *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_SIMP_TAC[]]; + (* RHS: E[Wn^m] * E[Zn^k] -> E[X^m] * E[Y^k] *) + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REALLIM_MUL THEN CONJ_TAC THENL + [(* X factor: E[Wn^m] -> E[X^m] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `(B_X:real) pow m` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MP_TAC(SPEC `n:num` (ASSUME `!n. indep_rv (p:A prob_space) + ((Wn:num->A->real) n) ((Zn:num->A->real) n)`)) THEN + REWRITE_TAC[indep_rv] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_SIMP_TAC[]]; + (* Y factor: E[Zn^k] -> E[Y^k] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `(B_Y:real) pow k` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MP_TAC(SPEC `n:num` (ASSUME `!n. indep_rv (p:A prob_space) + ((Wn:num->A->real) n) ((Zn:num->A->real) n)`)) THEN + REWRITE_TAC[indep_rv] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_SIMP_TAC[]]]]);; + +(* ------------------------------------------------------------------------- *) +(* THREE_SERIES_CONDITION1: tail probability summability from a.s. *) +(* convergence + independence of tail events. *) +(* Proof: By contradiction via Second Borel-Cantelli. If not summable, *) +(* P(limsup) = 1 by 2nd B-C. But a.s. convergence => sum converges a.e. *) +(* => X_n -> 0 a.e. => limsup subset of null set => P(limsup) = 0. *) +(* Contradiction. *) +(* ------------------------------------------------------------------------- *) + +let THREE_SERIES_CONDITION1 = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + (!n. random_variable p (X n)) /\ + indep_events_seq p + (\n. {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c})`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* By contradiction *) + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + (* Extract events membership from indep_events_seq *) + SUBGOAL_THEN + `!n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c} + IN prob_events p` + ASSUME_TAC THENL + [UNDISCH_TAC `indep_events_seq (p:A prob_space) + (\n. {x | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})` THEN + REWRITE_TAC[indep_events_seq] THEN SIMP_TAC[]; + ALL_TAC] THEN + (* 2nd Borel-Cantelli: P(limsup) = 1 *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c}`] + SECOND_BOREL_CANTELLI) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + (* almost_surely gives null set n *) + UNDISCH_TAC `almost_surely (p:A prob_space) + {x | ?L. ((\n. sum(0..n) (\i. (X:num->A->real) i x)) ---> L) sequentially}` THEN + REWRITE_TAC[almost_surely] THEN STRIP_TAC THEN + (* Show limsup subset n *) + SUBGOAL_THEN + `limsup_events + (\k. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) k x) > c}) + SUBSET n` + ASSUME_TAC THENL + [MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + ~(x IN {x | ?L. ((\n. sum(0..n) (\i. (X:num->A->real) i x)) ---> L) + sequentially})}` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[LIMSUP_EVENTS_ALT; SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Show x not in convergence set: X_n(x) doesn't tend to 0 *) + DISCH_THEN(X_CHOOSE_THEN `L:real` ASSUME_TAC) THEN + (* X_n -> 0 from convergent series *) + SUBGOAL_THEN `((\k. (X:num->A->real) k x) ---> &0) sequentially` + ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC `\i:num. (X:num->A->real) i x` + REAL_SERIES_TERMS_TOZERO) THEN + EXISTS_TAC `L:real` THEN EXISTS_TAC `0` THEN + REWRITE_TAC[real_sums; FROM_INTER_NUMSEG] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Contradiction: X_n -> 0 but infinitely many |X_n| > c *) + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `c:real`) THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN + DISCH_THEN(X_CHOOSE_THEN `N1:num` ASSUME_TAC) THEN + UNDISCH_TAC `!m:num. ?n:num. n >= m /\ (x:A) IN prob_carrier p /\ + abs((X:num->A->real) n x) > c` THEN + DISCH_THEN(MP_TAC o SPEC `N1:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `n1:num` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n1:num`) THEN + UNDISCH_TAC `n1:num >= N1` THEN REWRITE_TAC[GE] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `abs((X:num->A->real) n1 x) > c` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* prob(limsup) = 0 from limsup subset null *) + SUBGOAL_THEN + `limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c}) + IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `null_event (p:A prob_space) (n:A->bool)` THEN + REWRITE_TAC[null_event] THEN STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})`; + `n:A->bool`] PROB_MONO) THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})`] + PROB_POSITIVE) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* ------------------------------------------------------------------------- *) +(* Zero covariance from bounded independence. *) +(* covariance(X,Y) = E[XY] - E[X]E[Y] = 0 for independent bounded X, Y. *) +(* ------------------------------------------------------------------------- *) + +let COVARIANCE_BOUNDED_INDEP = prove + (`!p:A prob_space X Y B_X B_Y. + random_variable p X /\ random_variable p Y /\ + (!x. x IN prob_carrier p ==> abs(X x) <= B_X) /\ + (!x. x IN prob_carrier p ==> abs(Y x) <= B_Y) /\ + indep_rv p X Y + ==> covariance p X Y = &0`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (X:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `B_X:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (Y:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `B_Y:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:A->real) x * (Y:A->real) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `B_X * B_Y:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_SIMP_TAC[REAL_ABS_POS]]; + ALL_TAC] THEN + ASM_SIMP_TAC[COVARIANCE_ALT] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `Y:A->real`; + `B_X:real`; `B_Y:real`] EXPECTATION_PRODUCT_BOUNDED_INDEP) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* Truncation helper: clamp is identity when value is within bounds *) +let CLAMP_EQ_WHEN_BOUNDED = prove + (`!x c. &0 < c /\ abs x <= c ==> min (max x (--c)) c = x`, + REPEAT GEN_TAC THEN REWRITE_TAC[real_min; real_max] THEN REAL_ARITH_TAC);; + +(* Truncated partial sums converge when the original series converges *) +(* and eventually all terms are bounded by c *) +let AS_CONVERGENCE_TRUNCATED = prove + (`!X c L (N:num). + &0 < c /\ + (!n. n >= N ==> abs(X n) <= c) /\ + ((\n. sum(0..n) (\i. X i)) ---> L) sequentially + ==> ?L2. ((\n. sum(0..n) (\i. min (max (X i) (--c)) c)) ---> L2) + sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + EXISTS_TAC `L + sum(0..N-1) + (\i. min(max((X:num->real) i) (--c)) c - X i)` THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_TRANSFORM_EVENTUALLY) THEN + EXISTS_TAC `\n. sum(0..n) (\i. (X:num->real) i) + + sum(0..N-1) (\i. min(max(X i) (--c)) c - X i)` THEN + REWRITE_TAC[BETA_THM] THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `N:num` THEN + X_GEN_TAC `m:num` THEN DISCH_TAC THEN + ONCE_REWRITE_TAC[REAL_ARITH `a + b = c <=> c - a = b:real`] THEN + REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + SUBGOAL_THEN `!i:num. i >= N ==> + min (max ((X:num->real) i) (--c)) c - X i = &0` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `min (max ((X:num->real) i) (--c)) c = X i` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + MATCH_MP_TAC CLAMP_EQ_WHEN_BOUNDED THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + ASM_CASES_TAC `N = 0` THENL + [SUBGOAL_THEN `!i:num. min (max ((X:num->real) i) (--c)) c - X i = &0` + (fun th -> REWRITE_TAC[th; SUM_0]) THEN + GEN_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..m) (\i. min (max ((X:num->real) i) (--c)) c - X i) = + sum(0..N-1) (\i. min (max (X i) (--c)) c - X i) + + sum(N..m) (\i. min (max (X i) (--c)) c - X i)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_L) THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum(N..m) + (\i. min (max ((X:num->real) i) (--c)) c - X i) = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN REPEAT STRIP_TAC THEN + UNDISCH_TAC `!i:num. i >= N ==> + min (max ((X:num->real) i) (--c)) c - X i = &0` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + MATCH_MP_TAC REALLIM_ADD THEN ASM_REWRITE_TAC[REALLIM_CONST; ETA_AX]]);; + +(* ========================================================================= *) +(* A1: Weaken INTEGRABLE_CLT -- replace char_fn identity with same CDF *) +(* ========================================================================= *) + +(* Cosine is Lipschitz with constant 1 *) +let COS_LIPSCHITZ = prove + (`!a b. abs(cos a - cos b) <= abs(a - b)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `!u v. cos(u + v) - cos(u - v) = -- &2 * sin u * sin v` + (fun th -> MP_TAC(SPECL [`(a + b) / &2`; `(a - b) / &2`] th)) THENL + [REPEAT GEN_TAC THEN REWRITE_TAC[COS_ADD; COS_SUB] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(a + b) / &2 + (a - b) / &2 = a /\ + (a + b) / &2 - (a - b) / &2 = b` + (fun th -> REWRITE_TAC[th]) THENL + [CONV_TAC REAL_FIELD; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NEG; REAL_ABS_NUM] THEN + MP_TAC(SPEC `(a + b) / &2` SIN_BOUND) THEN + MP_TAC(SPEC `(a - b) / &2` REAL_ABS_SIN_BOUND_LE) THEN + REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_NUM] THEN + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * &1 * (abs(a - b) / &2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REAL_ARITH_TAC]);; + +(* Same CDF implies same CDF of clamped versions *) +let CLAMP_DISTRIBUTION_EQ = prove + (`!p:A prob_space (X:A->real) (Y:A->real) c. + random_variable p X /\ random_variable p Y /\ &0 < c /\ + (!x. distribution_fn p X x = distribution_fn p Y x) + ==> !x. distribution_fn p (\a. min (max (X a) (--c)) c) x = + distribution_fn p (\a. min (max (Y a) (--c)) c) x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `x:real` THEN + REWRITE_TAC[distribution_fn] THEN + ASM_CASES_TAC `x < --c` THENL + [SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((X:A->real) a) (--c)) c <= x} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `a:A` THEN STRIP_TAC THEN + UNDISCH_TAC `x < --c` THEN REWRITE_TAC[REAL_NOT_LT; real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((Y:A->real) a) (--c)) c <= x} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `a:A` THEN STRIP_TAC THEN + UNDISCH_TAC `x < --c` THEN REWRITE_TAC[REAL_NOT_LT; real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC; + REFL_TAC]; + ALL_TAC] THEN + ASM_CASES_TAC `x >= c` THENL + [SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((X:A->real) a) (--c)) c <= x} = prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + EQ_TAC THENL [SIMP_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((Y:A->real) a) (--c)) c <= x} = prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + EQ_TAC THENL [SIMP_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC]; + REFL_TAC]; + ALL_TAC] THEN + (* Middle case: --c <= x < c. Both sets = {a | X/Y a <= x} *) + SUBGOAL_THEN `--c <= x /\ x < c` STRIP_ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((X:A->real) a) (--c)) c <= x} = + {a | a IN prob_carrier p /\ X a <= x}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [UNDISCH_TAC `min (max ((X:A->real) a) (--c)) c <= x` THEN + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `{a:A | a IN prob_carrier p /\ + min (max ((Y:A->real) a) (--c)) c <= x} = + {a | a IN prob_carrier p /\ Y a <= x}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [UNDISCH_TAC `min (max ((Y:A->real) a) (--c)) c <= x` THEN + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN ASM_REAL_ARITH_TAC]; + ASM_MESON_TAC[distribution_fn]]);; + +(* Partition existence for step function approximation *) +let PARTITION_EXISTENCE = prove + (`!N u. ~(N = 0) /\ &0 <= u /\ u <= &N ==> + ?j. j < N /\ &j <= u /\ u <= &(j + 1)`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPEC `\k:num. u <= &k` num_WOP) THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `?n:num. u <= &n` (fun th -> REWRITE_TAC[th]) THENL + [EXISTS_TAC `N:num` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(k:num) <= N` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + FIRST_ASSUM(MP_TAC o SPEC `N:num`) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + ASM_CASES_TAC `k = 0` THENL + [SUBGOAL_THEN `u = &0` ASSUME_TAC THENL + [UNDISCH_TAC `u <= &k` THEN UNDISCH_TAC `&0 <= u` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + EXISTS_TAC `0` THEN ASM_SIMP_TAC[LT_NZ] THEN + ASM_REWRITE_TAC[REAL_LE_REFL; REAL_OF_NUM_ADD; REAL_OF_NUM_LE] THEN + ARITH_TAC; + ALL_TAC] THEN + EXISTS_TAC `k - 1` THEN + SUBGOAL_THEN `k = (k - 1) + 1` ASSUME_TAC THENL + [UNDISCH_TAC `~(k = 0)` THEN ARITH_TAC; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [UNDISCH_TAC `(k:num) <= N` THEN UNDISCH_TAC `~(k = 0)` THEN ARITH_TAC; + SUBGOAL_THEN `k - 1 < k` ASSUME_TAC THENL + [UNDISCH_TAC `~(k = 0)` THEN ARITH_TAC; ALL_TAC] THEN + FIRST_ASSUM(fun th -> MP_TAC(MATCH_MP + (ASSUME `!m:num. m < k ==> ~(u <= &m)`) th)) THEN + REWRITE_TAC[REAL_NOT_LE] THEN REAL_ARITH_TAC; + SUBGOAL_THEN `&(k - 1 + 1) = &k` (fun th -> ASM_REWRITE_TAC[th]) THEN + REWRITE_TAC[REAL_OF_NUM_EQ] THEN + UNDISCH_TAC `k = k - 1 + 1` THEN ARITH_TAC]);; + +(* sin is Lipschitz with constant 1 *) +let SIN_LIPSCHITZ = prove + (`!a b. abs(sin a - sin b) <= abs(a - b)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `!u v. sin(u + v) - sin(u - v) = &2 * cos u * sin v` + (fun th -> MP_TAC(SPECL [`(a + b) / &2`; `(a - b) / &2`] th)) THENL + [REPEAT GEN_TAC THEN REWRITE_TAC[SIN_ADD; SIN_SUB] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(a + b) / &2 + (a - b) / &2 = a /\ + (a + b) / &2 - (a - b) / &2 = b` + (fun th -> REWRITE_TAC[th]) THENL + [CONV_TAC REAL_FIELD; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NUM] THEN + MP_TAC(SPEC `(a + b) / &2` COS_BOUND) THEN + MP_TAC(SPEC `(a - b) / &2` REAL_ABS_SIN_BOUND_LE) THEN + REWRITE_TAC[REAL_ABS_DIV; REAL_ABS_NUM] THEN + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * &1 * (abs(a - b) / &2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REAL_ARITH_TAC]);; + +(* Bounded equidistributed RVs have same expectation of Lipschitz functions *) +let EQUIDIST_BOUNDED_LIPSCHITZ = prove + (`!p:A prob_space X Y (g:real->real) L c. + random_variable p X /\ random_variable p Y /\ + (!x. x IN prob_carrier p ==> abs(X x) <= c) /\ + (!x. x IN prob_carrier p ==> abs(Y x) <= c) /\ + (!a. distribution_fn p X a = distribution_fn p Y a) /\ + &0 < c /\ &0 < L /\ + (!a b. abs(g a - g b) <= L * abs(a - b)) /\ + integrable p (\x. g(X x)) /\ integrable p (\x. g(Y x)) + ==> expectation p (\x. g(X x)) = expectation p (\x. g(Y x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(SPECL [`expectation (p:A prob_space) (\x:A. (g:real->real) ((X:A->real) x))`; + `expectation (p:A prob_space) (\x:A. (g:real->real) ((Y:A->real) x))`; + `&4 * L * c`] REAL_EQ_SQUEEZE_DIV) THEN + ANTS_TAC THENL [ALL_TAC; SIMP_TAC[]] THEN + CONJ_TAC THENL + [REPEAT(MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC) THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + X_GEN_TAC `N:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `1 <= N` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + (* Abbreviate partition point function *) + ABBREV_TAC `ak = \k:num. --c + &(2 * k) * c / &N` THEN + (* Indicator integrability for any random_variable Z *) + SUBGOAL_THEN `!Z:A->real k. random_variable p Z ==> + integrable p (\x:A. if Z x > (ak:num->real) k then &1 else &0)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:A->real`; `(ak:num->real) k`; `&1`] + EXPECTATION_IF_GT) THEN ASM_REWRITE_TAC[REAL_POS] THEN SIMP_TAC[]; + ALL_TAC] THEN + (* Indicator expectation = probability *) + SUBGOAL_THEN `!Z:A->real k. random_variable p Z ==> + expectation p (\x:A. if Z x > (ak:num->real) k then &1 else &0) = + prob p {x:A | x IN prob_carrier p /\ Z x > ak k}` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:A->real`; `(ak:num->real) k`; `&1`] + EXPECTATION_IF_GT) THEN ASM_REWRITE_TAC[REAL_POS] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[REAL_MUL_LID]; + ALL_TAC] THEN + (* Tail probability equality *) + SUBGOAL_THEN `!a. prob p {x:A | x IN prob_carrier p /\ X x > a} = + prob p {x | x IN prob_carrier p /\ Y x > a}` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC EQUIDIST_TAIL_PROB_GT THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step function definition *) + ABBREV_TAC `step = \z:real. (g:real->real)(--c) + + sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if z > ak(k+1) then &1 else &0))` THEN + (* Step function integrability *) + SUBGOAL_THEN `!Z:A->real. random_variable p Z ==> + integrable p (\x:A. (step:real->real)(Z x))` ASSUME_TAC THENL + [X_GEN_TAC `Z:A->real` THEN DISCH_TAC THEN + EXPAND_TAC "step" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if (Z:A->real) x > ak(k+1) then &1 else &0))) = + (\x. sum(0..N-2) + (\k. (\k x. (g(ak(k+1)) - g(ak k)) * + (if Z x > ak(k+1) then &1 else &0)) k x))` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN X_GEN_TAC `k:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step function expectation equality: E[step(X)] = E[step(Y)] *) + SUBGOAL_THEN + `expectation p (\x:A. (step:real->real)((X:A->real) x)) = + expectation p (\x. step((Y:A->real) x))` ASSUME_TAC THENL + [EXPAND_TAC "step" THEN REWRITE_TAC[] THEN + (* E[g(-c) + sum(...)] = g(-c) + E[sum(...)] for both X and Y *) + SUBGOAL_THEN `!Z:A->real. random_variable p Z ==> + expectation p (\x. (g:real->real)(--c) + + sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if Z x > ak(k+1) then &1 else &0))) = + g(--c) + sum(0..N-2) (\k. (g(ak(k+1)) - g(ak k)) * + prob p {x:A | x IN prob_carrier p /\ Z x > ak(k+1)})` + (fun th -> SIMP_TAC[MATCH_MP th (ASSUME `random_variable (p:A prob_space) (X:A->real)`); + MATCH_MP th (ASSUME `random_variable (p:A prob_space) (Y:A->real)`)]) THENL + [X_GEN_TAC `Z:A->real` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. (g:real->real)(--c)`; + `\x:A. sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if (Z:A->real) x > ak(k+1) then &1 else &0))`] EXPECTATION_ADD) THEN + REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN ANTS_TAC THENL + [SUBGOAL_THEN + `(\x:A. sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if (Z:A->real) x > ak(k+1) then &1 else &0))) = + (\x. sum(0..N-2) + (\k. (\k x. (g(ak(k+1)) - g(ak k)) * + (if Z x > ak(k+1) then &1 else &0)) k x))` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN X_GEN_TAC `k:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[REAL_EQ_ADD_LCANCEL] THEN + (* E[sum(...)] = sum(E[...]) *) + SUBGOAL_THEN + `(\x:A. sum(0..N-2) (\k. (g((ak:num->real)(k+1)) - g(ak k)) * + (if (Z:A->real) x > ak(k+1) then &1 else &0))) = + (\x. sum(0..N-2) (\k. (\k x. (g(ak(k+1)) - g(ak k)) * + (if Z x > ak(k+1) then &1 else &0)) k x))` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k:num (x:A). (g((ak:num->real)(k+1)) - g(ak k)) * + (if (Z:A->real) x > ak(k+1) then &1 else &0)`; + `N - 2`] EXPECTATION_SUM) THEN REWRITE_TAC[] THEN ANTS_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(g:real->real)((ak:num->real)(k+1)) - g(ak k)`; + `\x:A. if (Z:A->real) x > (ak:num->real)(k+1) then &1 else &0`] + EXPECTATION_CMUL) THEN + ANTS_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o BETA_RULE) THEN AP_TERM_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Now both sides have form g(-c) + sum(d_k * P(Z > a_k)) *) + REWRITE_TAC[REAL_EQ_ADD_LCANCEL] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[REAL_EQ_MUL_LCANCEL] THEN DISJ2_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Pointwise bound: |g(z) - step(z)| <= 2*L*c/N for |z| <= c *) + SUBGOAL_THEN `!z. abs z <= c ==> + abs((g:real->real) z - (step:real->real) z) <= &2 * L * c / &N` + ASSUME_TAC THENL + [X_GEN_TAC `z:real` THEN DISCH_TAC THEN + EXPAND_TAC "step" THEN REWRITE_TAC[] THEN + (* Use PARTITION_EXISTENCE to find interval containing z *) + SUBGOAL_THEN `&0 < &2 * c / &N` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_DIV THEN + ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= (z + c) / (&2 * c / &N) /\ + (z + c) / (&2 * c / &N) <= &N` ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + SUBGOAL_THEN `&N * (&2 * c / &N) = &2 * c` SUBST1_TAC THENL + [SUBGOAL_THEN `~(&N = &0)` MP_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC; ALL_TAC] THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(SPECL [`N:num`; `(z + c) / (&2 * c / &N)`] PARTITION_EXISTENCE) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + (* z is in [ak j, ak(j+1)] *) + SUBGOAL_THEN `(ak:num->real) j <= z /\ z <= ak(j + 1)` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + SUBGOAL_THEN `&(2 * j) * c / &N = &j * (&2 * c / &N) /\ + &(2 * (j + 1)) * c / &N = &(j + 1) * (&2 * c / &N)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_ADD] THEN + CONJ_TAC THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + UNDISCH_TAC `&j <= (z + c) / (&2 * c / &N)` THEN + UNDISCH_TAC `(z + c) / (&2 * c / &N) <= &(j + 1)` THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_LE_RDIV_EQ] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Case split: z > ak j (strict) vs z = ak j (boundary) *) + ASM_CASES_TAC `z > (ak:num->real) j` THENL + [(* Case 1: z > ak j -- indicators are 1 iff k+1 <= j *) + SUBGOAL_THEN + `sum(0..N-2) (\k. ((g:real->real)((ak:num->real)(k+1)) - g(ak k)) * + (if z > ak(k+1) then &1 else &0)) = + sum(0..N-2) (\k. if k + 1 <= j + then g(ak(k+1)) - g(ak k) else &0)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + BETA_TAC THEN ASM_CASES_TAC `k + 1 <= j` THENL + [SUBGOAL_THEN `z > (ak:num->real)(k + 1)` ASSUME_TAC THENL + [SUBGOAL_THEN `ak(k + 1) <= ak j` MP_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE; GSYM REAL_OF_NUM_MUL] THEN + ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `~(z > (ak:num->real)(k + 1))` ASSUME_TAC THENL + [REWRITE_TAC[real_gt; REAL_NOT_LT] THEN + SUBGOAL_THEN `ak(j + 1) <= ak(k + 1)` MP_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE; GSYM REAL_OF_NUM_MUL] THEN + ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Handle j = 0 separately: all conditional terms are 0 *) + ASM_CASES_TAC `j = 0` THENL + [ASM_REWRITE_TAC[ARITH_RULE `k + 1 <= 0 <=> F`] THEN + REWRITE_TAC[SUM_0; REAL_ADD_RID] THEN + SUBGOAL_THEN `(ak:num->real) 0 = --c` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[MULT_CLAUSES; REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&2 * L * c / &N = L * (&2 * c / &N)` SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `L * abs(z - --(c:real))` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + SUBGOAL_THEN `(ak:num->real)(0 + 1) = --c + &2 * c / &N` + ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[ARITH] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + UNDISCH_TAC `(ak:num->real) j <= z /\ z <= ak(j + 1)` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* j >= 1: Telescoping via SUM_RESTRICT_SET *) + REWRITE_TAC[GSYM SUM_RESTRICT_SET] THEN + SUBGOAL_THEN `{k | k IN 0..N-2 /\ k + 1 <= j} = 0..j-1` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_NUMSEG] THEN + X_GEN_TAC `k:num` THEN ASM_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[SUM_DIFFS_ALT; LE_0; ADD_CLAUSES] THEN + SUBGOAL_THEN `j - 1 + 1 = j` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `(ak:num->real) 0 = --c` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[MULT_CLAUSES; REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `!x y z:real. x - (y + (z - y)) = x - z`] THEN + SUBGOAL_THEN `(ak:num->real)(j + 1) = ak j + &2 * c / &N` + ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_ADD; real_div] THEN + CONV_TAC REAL_RING; ALL_TAC] THEN + SUBGOAL_THEN `&2 * L * c / &N = L * (&2 * c / &N)` SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `L * abs(z - (ak:num->real) j)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + SUBGOAL_THEN `abs(z - (ak:num->real) j) <= &2 * c / &N` MP_TAC THENL + [ASM_REAL_ARITH_TAC; REAL_ARITH_TAC]; + (* Case 2: ~(z > ak j), so z = ak j *) + SUBGOAL_THEN `z = (ak:num->real) j` SUBST_ALL_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_CASES_TAC `j = 0` THENL + [(* j = 0: ak 0 = --c, all indicators are false *) + SUBGOAL_THEN `(ak:num->real) 0 = --c` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[MULT_CLAUSES; REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `!k. k IN 0..N-2 ==> + ((g:real->real)((ak:num->real)(k+1)) - g(ak k)) * + (if --c > ak(k+1) then &1 else &0) = &0` MP_TAC THENL + [REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `~(--c > (ak:num->real)(k + 1))` ASSUME_TAC THENL + [REWRITE_TAC[real_gt; REAL_NOT_LT] THEN + EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> --c <= --c + x`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + DISCH_TAC THEN + ASM_SIMP_TAC[SUM_EQ_0] THEN + REWRITE_TAC[REAL_ADD_RID; REAL_SUB_REFL; REAL_ABS_0] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* j >= 1: indicators are 1 iff k+2 <= j (i.e., ak j > ak(k+1)) *) + SUBGOAL_THEN `1 <= j` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `sum(0..N-2) (\k. ((g:real->real)((ak:num->real)(k+1)) - g(ak k)) * + (if (ak:num->real) j > ak(k+1) then &1 else &0)) = + sum(0..N-2) (\k. if k + 2 <= j + then g(ak(k+1)) - g(ak k) else &0)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + BETA_TAC THEN ASM_CASES_TAC `k + 2 <= j` THENL + [SUBGOAL_THEN `(ak:num->real) j > ak(k + 1)` ASSUME_TAC THENL + [REWRITE_TAC[real_gt] THEN EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `!c a b:real. --c + a < --c + b <=> a < b`] THEN + MATCH_MP_TAC REAL_LT_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT; GSYM REAL_OF_NUM_MUL] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LT_DIV THEN + ASM_SIMP_TAC[REAL_OF_NUM_LT; LE_1]]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `~((ak:num->real) j > ak(k + 1))` ASSUME_TAC THENL + [REWRITE_TAC[real_gt; REAL_NOT_LT] THEN + EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE; GSYM REAL_OF_NUM_MUL] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* k+2 <= j iff k+1 <= j-1 *) + SUBGOAL_THEN `!k:num. k + 2 <= j <=> k + 1 <= j - 1` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + (* Telescoping via SUM_RESTRICT_SET *) + (* Handle j - 1 = 0, i.e., j = 1 separately *) + ASM_CASES_TAC `j - 1 = 0` THENL + [(* j = 1: use Lipschitz bound on g(ak 1) - g(ak 0) *) + ASM_REWRITE_TAC[ARITH_RULE `k + 1 <= 0 <=> F`] THEN + REWRITE_TAC[SUM_0] THEN + SUBGOAL_THEN `(ak:num->real) 0 = --c` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[MULT_CLAUSES; REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `j = 1` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_ADD_RID] THEN + SUBGOAL_THEN `&2 * L * c / &N = L * (&2 * c / &N)` SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `L * abs((ak:num->real) 1 - ak 0)` THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + SUBGOAL_THEN `(ak:num->real) 1 = --c + &2 * c / &N` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[ARITH] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&0 <= &2 * c / &N` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* j >= 2: telescope via SUM_RESTRICT_SET *) + REWRITE_TAC[GSYM SUM_RESTRICT_SET] THEN + SUBGOAL_THEN `{k | k IN 0..N-2 /\ k + 1 <= j - 1} = 0..j-1-1` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_NUMSEG] THEN + X_GEN_TAC `k:num` THEN ASM_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[SUM_DIFFS_ALT; LE_0; ADD_CLAUSES] THEN + SUBGOAL_THEN `j - 1 - 1 + 1 = j - 1` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `(ak:num->real) 0 = --c` ASSUME_TAC THENL + [EXPAND_TAC "ak" THEN + REWRITE_TAC[MULT_CLAUSES; REAL_MUL_LZERO; real_div; REAL_MUL_LZERO] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `!x y z:real. x - (y + (z - y)) = x - z`] THEN + (* |g(ak j) - g(ak(j-1))| <= L * |ak j - ak(j-1)| <= 2Lc/N *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `L * abs((ak:num->real) j - ak(j - 1))` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&2 * L * c / &N = L * (&2 * c / &N)` SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + EXPAND_TAC "ak" THEN REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `!c a b:real. (--c + a) - (--c + b) = a - b`] THEN + SUBGOAL_THEN `2 * (j - 1) <= 2 * j` ASSUME_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&(2 * j) * c / &N - &(2 * (j - 1)) * c / &N = + &(2 * j - 2 * (j - 1)) * c / &N` SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `2 * j - 2 * (j - 1) = 2` SUBST1_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= &2 * c / &N` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; MATCH_MP_TAC REAL_LE_DIV THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 <= x ==> abs x <= x`]]; + ALL_TAC] THEN + (* Combine: |E[g(X)] - E[g(Y)]| <= 4Lc/N via EXPECTATION_MONO *) + SUBGOAL_THEN `!Z:A->real. random_variable p Z /\ + integrable p (\x. (g:real->real)(Z x)) /\ + (!x. x IN prob_carrier p ==> abs(Z x) <= c) ==> + abs(expectation p (\x. g(Z x)) - + expectation p (\x. (step:real->real)(Z x))) <= &2 * L * c / &N` + ASSUME_TAC THENL + [X_GEN_TAC `Z:A->real` THEN STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ARITH `--a <= b - c <=> c <= b + a`] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. (g:real->real)(Z x) + &2 * L * c / &N)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(SPEC `(Z:A->real) x` (ASSUME `!z. abs z <= c ==> + abs((g:real->real) z - (step:real->real) z) <= &2 * L * c / &N`)) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. (g:real->real)((Z:A->real) x)`; + `\x:A. &2 * L * c / &N`] EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN + REAL_ARITH_TAC]; + REWRITE_TAC[REAL_ARITH `b - c <= a <=> b <= c + a`] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. (step:real->real)((Z:A->real) x) + &2 * L * c / &N)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_SIMP_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; REWRITE_TAC[INTEGRABLE_CONST]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(SPEC `(Z:A->real) x` (ASSUME `!z. abs z <= c ==> + abs((g:real->real) z - (step:real->real) z) <= &2 * L * c / &N`)) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. (step:real->real)((Z:A->real) x)`; + `\x:A. &2 * L * c / &N`] EXPECTATION_ADD) THEN + ASM_SIMP_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Final: two-term bound using step equality *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(expectation p (\x:A. (g:real->real)((X:A->real) x)) - + expectation p (\x. (step:real->real)(X x))) + + abs(expectation p (\x. (g:real->real)((Y:A->real) x)) - + expectation p (\x. (step:real->real)(Y x)))` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `expectation p (\x:A. (g:real->real)((X:A->real) x)) - + expectation p (\x. g((Y:A->real) x)) = + (expectation p (\x. g(X x)) - expectation p (\x. (step:real->real)(X x))) - + (expectation p (\x. g(Y x)) - expectation p (\x. step(Y x)))` SUBST1_TAC THENL + [MP_TAC(ASSUME `expectation p (\x:A. (step:real->real)((X:A->real) x)) = + expectation p (\x. step((Y:A->real) x))`) THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * L * c / &N + &2 * L * c / &N` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_ARITH `&2 * L * c / N + &2 * L * c / N = + &4 * L * c / N`] THEN REAL_ARITH_TAC]);; + +(* Same CDF implies same characteristic function *) +let CHAR_FN_EQ_OF_SAME_DIST = prove + (`!p:A prob_space (X:A->real) (Y:A->real) t. + random_variable p X /\ random_variable p Y /\ + (!x. distribution_fn p X x = distribution_fn p Y x) + ==> char_fn_re p X t = char_fn_re p Y t /\ + char_fn_im p X t = char_fn_im p Y t`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[char_fn_re; char_fn_im] THEN BETA_TAC THEN + (* Bounded case: for each M, clamped expectations agree *) + SUBGOAL_THEN + `!M. expectation (p:A prob_space) + (\a:A. cos(t * min (max ((X:A->real) a) (-- &(SUC M))) (&(SUC M)))) = + expectation p + (\a. cos(t * min (max ((Y:A->real) a) (-- &(SUC M))) (&(SUC M)))) /\ + expectation p + (\a:A. sin(t * min (max ((X:A->real) a) (-- &(SUC M))) (&(SUC M)))) = + expectation p + (\a. sin(t * min (max ((Y:A->real) a) (-- &(SUC M))) (&(SUC M))))` + (LABEL_TAC "bounded") THENL + [GEN_TAC THEN CONJ_TAC THENL + [(* cos case: apply EQUIDIST_BOUNDED_LIPSCHITZ to clamped RVs *) + MP_TAC(ISPECL [ + `p:A prob_space`; + `\a:A. min (max ((X:A->real) a) (-- &(SUC M))) (&(SUC M))`; + `\a:A. min (max ((Y:A->real) a) (-- &(SUC M))) (&(SUC M))`; + `\x:real. cos(t * x)`; + `abs(t) + &1`; + `&(SUC M)`] EQUIDIST_BOUNDED_LIPSCHITZ) THEN + BETA_TAC THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC CLAMP_BOUND THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC CLAMP_BOUND THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + MATCH_MP_TAC CLAMP_DISTRIBUTION_EQ THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + MP_TAC(SPEC `t:real` REAL_ABS_POS) THEN REAL_ARITH_TAC; + REPEAT GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(t * a - t * b)` THEN CONJ_TAC THENL + [MATCH_ACCEPT_TAC COS_LIPSCHITZ; + REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN + REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL] THEN REAL_ARITH_TAC]; + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_COS THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[COS_BOUND]]; + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_COS THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[COS_BOUND]]]; + SIMP_TAC[]]; + (* sin case: same structure *) + MP_TAC(ISPECL [ + `p:A prob_space`; + `\a:A. min (max ((X:A->real) a) (-- &(SUC M))) (&(SUC M))`; + `\a:A. min (max ((Y:A->real) a) (-- &(SUC M))) (&(SUC M))`; + `\x:real. sin(t * x)`; + `abs(t) + &1`; + `&(SUC M)`] EQUIDIST_BOUNDED_LIPSCHITZ) THEN + BETA_TAC THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC CLAMP_BOUND THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC CLAMP_BOUND THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + MATCH_MP_TAC CLAMP_DISTRIBUTION_EQ THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + MP_TAC(SPEC `t:real` REAL_ABS_POS) THEN REAL_ARITH_TAC; + REPEAT GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(t * a - t * b)` THEN CONJ_TAC THENL + [MATCH_ACCEPT_TAC SIN_LIPSCHITZ; + REWRITE_TAC[GSYM REAL_SUB_LDISTRIB; REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN + REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL] THEN REAL_ARITH_TAC]; + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SIN THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[SIN_BOUND]]; + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SIN THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[SIN_BOUND]]]; + SIMP_TAC[]]]; + ALL_TAC] THEN + (* DCT: clamp(Z,M) --> Z implies E[trig(t*clamp(Z,M))] --> E[trig(t*Z)] *) + SUBGOAL_THEN + `!Z:A->real. random_variable p Z ==> + ((\n. expectation (p:A prob_space) + (\a. cos(t * min (max (Z a) (-- &(SUC n))) (&(SUC n))))) + ---> expectation p (\a. cos(t * Z a))) sequentially /\ + ((\n. expectation (p:A prob_space) + (\a. sin(t * min (max (Z a) (-- &(SUC n))) (&(SUC n))))) + ---> expectation p (\a. sin(t * Z a))) sequentially` + (LABEL_TAC "dct") THENL + [X_GEN_TAC `Z:A->real` THEN DISCH_TAC THEN CONJ_TAC THENL + [MP_TAC(ISPECL + [`p:A prob_space`; + `\n:num (a:A). cos(t * min (max ((Z:A->real) a) (-- &(SUC n))) (&(SUC n)))`; + `\a:A. cos(t * (Z:A->real) a)`; + `\a:A. &1`] DOMINATED_CONVERGENCE) THEN + BETA_TAC THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_COS THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[COS_BOUND]]; + REWRITE_TAC[INTEGRABLE_CONST]; + REPEAT STRIP_TAC THEN REWRITE_TAC[COS_BOUND]; + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. cos(t * (Z:A->real) a)` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + MP_TAC(SPEC `abs((Z:A->real) a)` REAL_ARCH_SIMPLE) THEN + STRIP_TAC THEN EXISTS_TAC `n:num` THEN + X_GEN_TAC `m:num` THEN DISCH_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + SUBGOAL_THEN `&n <= &(SUC m)` MP_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN + ASM_REAL_ARITH_TAC; + REWRITE_TAC[REALLIM_CONST]]]; + SIMP_TAC[]]; + (* sin part: same proof structure *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\n:num (a:A). sin(t * min (max ((Z:A->real) a) (-- &(SUC n))) (&(SUC n)))`; + `\a:A. sin(t * (Z:A->real) a)`; + `\a:A. &1`] DOMINATED_CONVERGENCE) THEN + BETA_TAC THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SIN THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[SIN_BOUND]]; + REWRITE_TAC[INTEGRABLE_CONST]; + REPEAT STRIP_TAC THEN REWRITE_TAC[SIN_BOUND]; + X_GEN_TAC `a:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. sin(t * (Z:A->real) a)` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + MP_TAC(SPEC `abs((Z:A->real) a)` REAL_ARCH_SIMPLE) THEN + STRIP_TAC THEN EXISTS_TAC `n:num` THEN + X_GEN_TAC `m:num` THEN DISCH_TAC THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + SUBGOAL_THEN `&n <= &(SUC m)` MP_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_min; real_max] THEN + REPEAT(COND_CASES_TAC THEN ASM_REWRITE_TAC[]) THEN + ASM_REAL_ARITH_TAC; + REWRITE_TAC[REALLIM_CONST]]]; + SIMP_TAC[]]]; + ALL_TAC] THEN + (* Combine: REALLIM_UNIQUE + REALLIM_TRANSFORM_EVENTUALLY *) + CONJ_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) + (\a:A. cos(t * min (max ((X:A->real) a) (-- &(SUC n))) (&(SUC n))))` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [USE_THEN "dct" (fun th -> MP_TAC(CONJUNCT1(MATCH_MP th + (ASSUME `random_variable (p:A prob_space) (X:A->real)`)))) THEN + REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) + (\a:A. cos(t * min (max ((Y:A->real) a) (-- &(SUC n))) (&(SUC n))))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN + USE_THEN "bounded" (fun th -> REWRITE_TAC[CONJUNCT1(SPEC `n:num` th)]); + USE_THEN "dct" (fun th -> MP_TAC(CONJUNCT1(MATCH_MP th + (ASSUME `random_variable (p:A prob_space) (Y:A->real)`)))) THEN + REWRITE_TAC[]]]; + (* sin part *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) + (\a:A. sin(t * min (max ((X:A->real) a) (-- &(SUC n))) (&(SUC n))))` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [USE_THEN "dct" (fun th -> MP_TAC(CONJUNCT2(MATCH_MP th + (ASSUME `random_variable (p:A prob_space) (X:A->real)`)))) THEN + REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) + (\a:A. sin(t * min (max ((Y:A->real) a) (-- &(SUC n))) (&(SUC n))))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN CONV_TAC SYM_CONV THEN + USE_THEN "bounded" (fun th -> REWRITE_TAC[CONJUNCT2(SPEC `n:num` th)]); + USE_THEN "dct" (fun th -> MP_TAC(CONJUNCT2(MATCH_MP th + (ASSUME `random_variable (p:A prob_space) (Y:A->real)`)))) THEN + REWRITE_TAC[]]]]);; + +(* CLT with same-distribution hypothesis instead of char_fn identity *) +let INTEGRABLE_CLT_IID = prove + (`!p:A prob_space (X:num->A->real). + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!i. expectation p (X i) = &0) /\ + &0 < variance p (X 0) /\ + (!i. variance p (X i) = variance p (X 0)) /\ + (!i j:num. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!i a. distribution_fn p (X i) a = distribution_fn p (X 0) a) /\ + (!n k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) + ==> !x:real. ((\n. cdf p + (\a. sum(0..n) (\i. X i a) / + (sqrt(variance p (X 0)) * sqrt(&(SUC n)))) x) + ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN + DISCH_THEN(fun th -> + let ths = CONJUNCTS th in + MAP_EVERY ASSUME_TAC (List.filteri (fun i _ -> i <> 6) ths) THEN + LABEL_TAC "dist_eq" (List.nth ths 6)) THEN + SUBGOAL_THEN `!i t. char_fn_re (p:A prob_space) ((X:num->A->real) i) t = + char_fn_re p (X 0) t /\ char_fn_im p (X i) t = char_fn_im p (X 0) t` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC CHAR_FN_EQ_OF_SAME_DIST THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_MESON_TAC[]; + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_MESON_TAC[]; + GEN_TAC THEN USE_THEN "dist_eq" (fun th -> + MATCH_ACCEPT_TAC(SPECL [`i:num`; `a:real`] th))]]; + ALL_TAC] THEN + REMOVE_THEN "dist_eq" (fun _ -> ALL_TAC) THEN + MATCH_MP_TAC INTEGRABLE_CLT THEN + REPEAT CONJ_TAC THEN FIRST_ASSUM MATCH_ACCEPT_TAC);; + +(* ======================================================================== *) +(* General Levy Continuity Theorem *) +(* ======================================================================== *) + +(* GENERAL_TRIG_POLY_WEAK_CONVERGENCE: + Generalizes TRIG_POLY_WEAK_CONVERGENCE to arbitrary char fn limits + phi_re, phi_im instead of exp(-t^2/2) and 0. *) +let GENERAL_TRIG_POLY_WEAK_CONVERGENCE = prove + (`!p:A prob_space (X:num->A->real) (phi_re:real->real) (phi_im:real->real) + m (a:num->real) (b:num->real) (freq:num->real). + (!n. random_variable p (X n)) /\ + (!t. ((\n. char_fn_re p (X n) t) ---> phi_re t) sequentially) /\ + (!t. ((\n. char_fn_im p (X n) t) ---> phi_im t) sequentially) + ==> ((\n. expectation p + (\x. sum(0..m) (\k. a k * cos(freq k * X n x) + + b k * sin(freq k * X n x)))) ---> + sum(0..m) (\k. a k * phi_re(freq k) + b k * phi_im(freq k))) + sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: Decompose expectation of trig poly into char fn terms *) + SUBGOAL_THEN + `!n:num. expectation (p:A prob_space) + (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x))) = + sum(0..m) (\k. a k * char_fn_re p (X n) (freq k) + + b k * char_fn_im p (X n) (freq k))` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `!i:num. i <= m ==> + integrable (p:A prob_space) + (\x:A. (a:num->real) i * cos((freq:num->real) i * (X:num->A->real) n x) + + (b:num->real) i * sin(freq i * X n x))` ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_SIN_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. sum(0..m) (\k. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x))) = + sum(0..m) (\k. expectation p + (\x. a k * cos(freq k * X n x) + b k * sin(freq k * X n x)))` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x)`; + `m:num`] EXPECTATION_SUM) THEN + ANTS_TAC THENL + [GEN_TAC THEN REWRITE_TAC[] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + X_GEN_TAC `k:num` THEN STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. cos((freq:num->real) k * (X:num->A->real) n x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. sin((freq:num->real) k * (X:num->A->real) n x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SIN_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x:A. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x)) = + a k * expectation p (\x. cos(freq k * X n x)) + + b k * expectation p (\x. sin(freq k * X n x))` + SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) (\x:A. (a:num->real) k * cos((freq:num->real) k * (X:num->A->real) n x) + + (b:num->real) k * sin(freq k * X n x)) = + expectation p (\x. a k * cos(freq k * X n x)) + + expectation p (\x. b k * sin(freq k * X n x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + BINOP_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[char_fn_re; char_fn_im]; + ALL_TAC] THEN + (* Step 2: Apply limit decomposition *) + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. sum(0..m) (\k. (a:num->real) k * char_fn_re (p:A prob_space) ((X:num->A->real) n) ((freq:num->real) k) + + (b:num->real) k * char_fn_im p (X n) (freq k))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: Sum of convergent sequences converges *) + MATCH_MP_TAC REALLIM_SUM THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN + BETA_TAC THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; + +(* Helper: if |a - b| < e for all e > 0, then a = b *) +let REAL_EQ_OF_ABS_LT_ALL = prove + (`(!e. &0 < e ==> abs(a - b) < e) ==> a = b`, + DISCH_TAC THEN + SUBGOAL_THEN `abs(a - b:real) = &0` MP_TAC THENL + [REWRITE_TAC[GSYM REAL_LE_ANTISYM; REAL_ABS_POS] THEN + REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `abs(a - b:real)`) THEN + ASM_REWRITE_TAC[REAL_LT_REFL]; + SIMP_TAC[REAL_ABS_ZERO; REAL_SUB_0]]);; + +(* GENERAL_WEAK_CONVERGENCE_CONVERGENT: + Under char fn convergence + bounded second moments, + E[g(X_n)] converges for any bounded continuous g. + Key new result enabling the general Levy theorem. *) +let GENERAL_WEAK_CONVERGENCE_CONVERGENT = prove + (`!p:A prob_space (X:num->A->real) (phi_re:real->real) (phi_im:real->real) + (g:real->real) BB. + (!n. random_variable p (X n)) /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (?C. &0 < C /\ !n. expectation p (\x. X n x pow 2) <= C) /\ + (!t. ((\n. char_fn_re p (X n) t) ---> phi_re t) sequentially) /\ + (!t. ((\n. char_fn_im p (X n) t) ---> phi_im t) sequentially) /\ + (!y. g real_continuous atreal y) /\ + &0 < BB /\ (!y. abs(g y) <= BB) /\ + (!n. integrable p (\a. g(X n a))) + ==> ?l. ((\n. expectation p (\a:A. g(X n a))) ---> l) sequentially`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `CC:real` STRIP_ASSUME_TAC) MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN + (* Strategy: REALLIM_SUBSEQ_SAME_LIMIT. + First get ONE convergent subsequence via BW to determine the limit, + then show every sub-subsequential limit equals it. *) + (* BW gives a convergent subsequence *) + MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g:real->real) ((X:num->A->real) n a))`; + `BB:real`] BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\a:A. abs((g:real->real) ((X:num->A->real) n a)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `expectation (p:A prob_space) (\a:A. BB)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\a:A. (g:real->real)((X:num->A->real) n a)`] INTEGRABLE_ABS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EXPECTATION_CONST] THEN + UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `L0:real` + (X_CHOOSE_THEN `r0:num->num` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `L0:real` THEN + (* Now show full sequence converges to L0 via REALLIM_SUBSEQ_SAME_LIMIT *) + MATCH_MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g:real->real) ((X:num->A->real) n a))`; + `L0:real`; `BB:real`] REALLIM_SUBSEQ_SAME_LIMIT) THEN + BETA_TAC THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\a:A. abs((g:real->real) ((X:num->A->real) n a)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `expectation (p:A prob_space) (\a:A. BB)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\a:A. (g:real->real)((X:num->A->real) n a)`] INTEGRABLE_ABS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EXPECTATION_CONST] THEN + UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* For any subseq r, find sub-sub s with E[g(X_{r(s(k))})] -> L0 *) + X_GEN_TAC `r:num->num` THEN DISCH_TAC THEN + (* BW on the subsequence gives convergent sub-sub *) + MP_TAC(ISPECL + [`\k:num. expectation (p:A prob_space) + (\a:A. (g:real->real) ((X:num->A->real) ((r:num->num) k) a))`; + `BB:real`] BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\a:A. abs((g:real->real) ((X:num->A->real) ((r:num->num) n) a)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `expectation (p:A prob_space) (\a:A. BB)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\a:A. (g:real->real)((X:num->A->real) ((r:num->num) n) a)`] + INTEGRABLE_ABS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EXPECTATION_CONST] THEN + UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `L':real` + (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `s:num->num` THEN ASM_REWRITE_TAC[] THEN + (* Must show L' = L0, then we're done *) + SUBGOAL_THEN `L':real = L0` + (fun th -> SUBST1_TAC(SYM th) THEN ASM_REWRITE_TAC[]) THEN + (* Key uniqueness argument: both L0 and L' are within eps of the same + trig poly limit, for all eps > 0 *) + MATCH_MP_TAC REAL_EQ_OF_ABS_LT_ALL THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Choose M large enough *) + ABBREV_TAC `M = sqrt(&12 * BB * (CC + &1) / e) + &1` THEN + SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN + MATCH_MP_TAC SQRT_POS_LE THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]]; ALL_TAC] THEN + SUBGOAL_THEN `&2 * BB * (CC + &1) / M pow 2 < e / &6` ASSUME_TAC THENL + [SUBGOAL_THEN `~(e = &0) /\ ~(BB = &0) /\ ~(CC + &1 = &0)` STRIP_ASSUME_TAC + THENL + [UNDISCH_TAC `&0 < e` THEN UNDISCH_TAC `&0 < BB` THEN + UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &12 * BB * (CC + &1) / e` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_DIV THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < CC` THEN REAL_ARITH_TAC]]; ALL_TAC] THEN + SUBGOAL_THEN `&12 * BB * (CC + &1) / e < M pow 2` ASSUME_TAC THENL + [SUBGOAL_THEN `&0 <= &12 * BB * (CC + &1) / e` ASSUME_TAC THENL + [UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `sqrt(&12 * BB * (CC + &1) / e) pow 2 = + &12 * BB * (CC + &1) / e` (SUBST1_TAC o GSYM) THENL + [ASM_SIMP_TAC[SQRT_POW2]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= sqrt(&12 * BB * (CC + &1) / e)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN + UNDISCH_TAC `&0 < &12 * BB * (CC + &1) / e` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN + MATCH_MP_TAC REAL_LT_MUL2 THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `sqrt (&12 * BB * (CC + &1) / e) + &1 = M` THEN + UNDISCH_TAC `&0 <= sqrt(&12 * BB * (CC + &1) / e)` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[real_div] THEN + SUBGOAL_THEN + `e * inv(&6) = &2 * BB * (CC + &1) * inv(&12 * BB * (CC + &1) * inv e)` + SUBST1_TAC THENL + [UNDISCH_TAC `~(e = &0)` THEN UNDISCH_TAC `~(BB = &0)` THEN + UNDISCH_TAC `~(CC + &1 = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LT_LMUL_EQ; REAL_LT_MUL; + REAL_ARITH `&0 < CC ==> &0 < CC + &1`; + REAL_OF_NUM_LT; ARITH] THEN + MATCH_MP_TAC REAL_LT_INV2 THEN + ASM_REWRITE_TAC[GSYM real_div]; + ALL_TAC] THEN + (* Get trig poly approximation *) + MP_TAC(SPECL [`g:real->real`; `BB:real`; `M:real`; `e / &6`] + BOUNDED_CONTINUOUS_TRIG_APPROX) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` + (X_CHOOSE_THEN `aa:num->real` + (X_CHOOSE_THEN `bb:num->real` + (X_CHOOSE_THEN `ff:num->real` STRIP_ASSUME_TAC)))) THEN + (* E[T(X_n)] converges to a limit determined by phi *) + ABBREV_TAC `Tphi = sum(0..nn) + (\k. (aa:num->real) k * (phi_re:real->real)((ff:num->real) k) + + (bb:num->real) k * (phi_im:real->real)(ff k))` THEN + SUBGOAL_THEN + `((\n. expectation (p:A prob_space) + (\x:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n x) + + (bb:num->real) k * sin(ff k * X n x)))) ---> + Tphi) sequentially` + ASSUME_TAC THENL + [EXPAND_TAC "Tphi" THEN + MATCH_MP_TAC GENERAL_TRIG_POLY_WEAK_CONVERGENCE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* STEP_C_BOUND gives |E[g(X_n)] - E[T(X_n)]| < e/3 for all n *) + SUBGOAL_THEN + `!n:num. abs(expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) n a)) - + expectation p + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * X n a) + + (bb:num->real) k * sin(ff k * X n a)))) < + e / &3` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `!n:num. integrable (p:A prob_space) + (\a:A. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * (X:num->A->real) n a) + + (bb:num->real) k * sin(ff k * X n a)))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUM THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_SIN_CMUL THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `e / &6 + &2 * BB * CC / M pow 2` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL + [`p:A prob_space`; `X:num->A->real`; `g:real->real`; + `\y:real. sum(0..nn) + (\k. (aa:num->real) k * cos((ff:num->real) k * y) + + (bb:num->real) k * sin(ff k * y))`; + `BB:real`; `CC:real`; `e:real`; `M:real`] STEP_C_BOUND) THEN + BETA_TAC THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[]; + MATCH_MP_TAC(REAL_ARITH `x < e / &6 ==> e / &6 + x < e / &3`) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `&2 * BB * (CC + &1) / M pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < BB` THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LE_DIV2_EQ; REAL_POW_LT] THEN + REAL_ARITH_TAC]]]; + ALL_TAC] THEN + (* Along r0: |L0 - Tphi| <= e/3 *) + SUBGOAL_THEN `abs(L0 - Tphi) <= e / &3` ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. abs(expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) ((r0:num->num) k) a)) - + expectation p + (\a:A. sum(0..nn) + (\j. (aa:num->real) j * cos((ff:num->real) j * X (r0 k) a) + + (bb:num->real) j * sin(ff j * X (r0 k) a))))` THEN + EXISTS_TAC `\k:num. e / &3` THEN BETA_TAC THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_ABS THEN + MATCH_MP_TAC REALLIM_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\x:A. sum(0..nn) + (\j. (aa:num->real) j * cos((ff:num->real) j * (X:num->A->real) n x) + + (bb:num->real) j * sin(ff j * X n x)))`; + `Tphi:real`; `r0:num->num`] REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* Along r o s: |L' - Tphi| <= e/3 *) + SUBGOAL_THEN `abs(L' - Tphi) <= e / &3` ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. abs(expectation (p:A prob_space) + (\a:A. (g:real->real)((X:num->A->real) ((r:num->num) ((s:num->num) k)) a)) - + expectation p + (\a:A. sum(0..nn) + (\j. (aa:num->real) j * cos((ff:num->real) j * X (r (s k)) a) + + (bb:num->real) j * sin(ff j * X (r (s k)) a))))` THEN + EXISTS_TAC `\k:num. e / &3` THEN BETA_TAC THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_ABS THEN + MATCH_MP_TAC REALLIM_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\x:A. sum(0..nn) + (\j. (aa:num->real) j * cos((ff:num->real) j * (X:num->A->real) n x) + + (bb:num->real) j * sin(ff j * X n x)))`; + `Tphi:real`; `\k:num. (r:num->num) ((s:num->num) k)`] REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + ASM_REWRITE_TAC[]]; + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +(* Bounded second moments imply tightness and Helly proper limit *) +let PROHOROV_FORWARD = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + &0 < C /\ + (!n. expectation p (\x. (X n x) pow 2) <= C) + ==> ?r H. (!m n. m < n ==> r m < r n) /\ + (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!x. H real_continuous (atreal x) + ==> ((\k. distribution_fn p (X (r k)) x) ---> H x) + sequentially) /\ + (!e. &0 < e ==> ?M. &0 < M /\ H(--M) < e /\ &1 - e < H M)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC TIGHT_HELLY_LIMIT_PROPER THEN + REWRITE_TAC[tight_sequence] THEN CONJ_TAC THENL + [(* dist_fn_seq *) + REWRITE_TAC[dist_fn_seq] THEN BETA_TAC THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC DIST_FN_MONO THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC DIST_FN_NONNEG THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC DIST_FN_LE_1 THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]]]; + (* tightness bounds *) + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `C:real`] + TIGHTNESS_FROM_SECOND_MOMENTS) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `M:real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `n:num` THEN + MATCH_MP_TAC CDF_BOUNDS_FROM_TIGHTNESS THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC ABS_GE_IN_EVENTS THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]]);; + +(* LEVY_CONTINUITY_GENERAL: + General Levy Continuity Theorem. Under pointwise char fn convergence + and uniformly bounded second moments, CDFs converge at all continuity + points to a proper CDF-like limit H. + + This generalizes LEVY_CONTINUITY_CLT which is specific to N(0,1). *) +let LEVY_CONTINUITY_GENERAL = prove + (`!p:A prob_space (X:num->A->real) (phi_re:real->real) (phi_im:real->real). + (!n. random_variable p (X n)) /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (?C. &0 < C /\ !n. expectation p (\x. X n x pow 2) <= C) /\ + (!t. ((\n. char_fn_re p (X n) t) ---> phi_re t) sequentially) /\ + (!t. ((\n. char_fn_im p (X n) t) ---> phi_im t) sequentially) + ==> ?H. (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!e. &0 < e ==> ?M. &0 < M /\ H(--M) < e /\ &1 - e < H M) /\ + (!x. H real_continuous atreal x + ==> ((\n. cdf p (X n) x) ---> H x) sequentially)`, + REPEAT GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `CC:real` STRIP_ASSUME_TAC) MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC ASSUME_TAC) THEN + (* Step 1: PROHOROV_FORWARD gives Helly subsequence r0 with limit H *) + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `CC:real`] + PROHOROV_FORWARD) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `r0:num->num` + (X_CHOOSE_THEN `H:real->real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `H:real->real` THEN + ASM_REWRITE_TAC[] THEN + (* Step 2: Full-sequence convergence at continuity points *) + X_GEN_TAC `x:real` THEN DISCH_TAC THEN + REWRITE_TAC[cdf; GSYM distribution_fn] THEN + REWRITE_TAC[ETA_AX] THEN + (* Use REALLIM_SUBSEQ_SAME_LIMIT with target H(x) *) + MATCH_MP_TAC(ISPECL + [`\n:num. distribution_fn (p:A prob_space) ((X:num->A->real) n) x`; + `(H:real->real) x`; `&1`] REALLIM_SUBSEQ_SAME_LIMIT) THEN + BETA_TAC THEN CONJ_TAC THENL + [(* Boundedness: |distribution_fn p (X n) x| <= 1 *) + GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC DIST_FN_NONNEG THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC DIST_FN_LE_1 THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* For any subseq r, find sub-sub s with dist_fn(X_{r(s(k))}, x) -> H(x) *) + X_GEN_TAC `r:num->num` THEN DISCH_TAC THEN + (* BW gives sub-sub with dist_fn convergent to some l *) + MP_TAC(ISPECL + [`\k:num. distribution_fn (p:A prob_space) ((X:num->A->real) ((r:num->num) k)) x`; + `&1`] BOUNDED_REAL_SEQ_HAS_CONVERGENT_SUBSEQ) THEN + BETA_TAC THEN ANTS_TAC THENL + [GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= &1 ==> abs a <= &1`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC DIST_FN_NONNEG THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC DIST_FN_LE_1 THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `l:real` + (X_CHOOSE_THEN `s:num->num` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `s:num->num` THEN ASM_REWRITE_TAC[] THEN + (* Step 3: Show l = H(x) via CONTINUOUS_LIMIT_SANDWICH *) + SUBGOAL_THEN `(H:real->real) x = l:real` (fun th -> ASM_REWRITE_TAC[th]) THEN + ONCE_REWRITE_TAC[EQ_SYM_EQ] THEN + MATCH_MP_TAC CONTINUOUS_LIMIT_SANDWICH THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `h:real` THEN DISCH_TAC THEN + (* Find continuity points y0 in (x-h, x) and y1 in (x, x+h) *) + MP_TAC(ISPECL [`H:real->real`; `x - h:real`; `x:real`] + MONOTONE_CONTINUITY_DENSE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `y0:real` STRIP_ASSUME_TAC) THEN + MP_TAC(ISPECL [`H:real->real`; `x:real`; `x + h:real`] + MONOTONE_CONTINUITY_DENSE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `y1:real` STRIP_ASSUME_TAC) THEN + CONJ_TAC THENL + [(* ---- H(x - h) <= l ---- *) + (* H(x-h) <= H(y0) by monotonicity, then H(y0) <= l via ramp *) + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(H:real->real) y0` THEN + CONJ_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + (* Ramp from y0 to x *) + ABBREV_TAC + `g_low = \y:real. max (&0) (min (&1) (&1 - (y - y0) / (x - y0)))` THEN + SUBGOAL_THEN `&0 < x - y0` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* g_low is bounded continuous, so E[g_low(X_n)] converges *) + SUBGOAL_THEN `!y:real. abs((g_low:real->real) y) <= &1` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_low" THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!y:real. (g_low:real->real) real_continuous atreal y` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_low" THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + UNDISCH_TAC `&0 < x - y0` THEN REAL_ARITH_TAC]]]]]; ALL_TAC] THEN + SUBGOAL_THEN `!n:num. integrable (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) n a))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&1` THEN CONJ_TAC THENL + [EXPAND_TAC "g_low" THEN + MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + X_GEN_TAC `a:A` THEN DISCH_TAC THEN BETA_TAC THEN + EXPAND_TAC "g_low" THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* E[g_low(X_n)] converges by GENERAL_WEAK_CONVERGENCE_CONVERGENT *) + MP_TAC(ISPECL + [`p:A prob_space`; `X:num->A->real`; + `phi_re:real->real`; `phi_im:real->real`; + `g_low:real->real`; `&1`] + GENERAL_WEAK_CONVERGENCE_CONVERGENT) THEN + BETA_TAC THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[REAL_LT_01] THEN + EXISTS_TAC `CC:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `Llow:real`) THEN + EXISTS_TAC `Llow:real` THEN CONJ_TAC THENL + [(* H(y0) <= Llow via Helly convergence at continuity point y0 *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. distribution_fn (p:A prob_space) + ((X:num->A->real) ((r0:num->num) k)) y0` THEN + EXISTS_TAC `\k:num. expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) ((r0:num->num) k) a))` THEN + BETA_TAC THEN REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `y0:real` o + check (fun th -> free_in `r0:num->num` (concl th))) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) n a))`; + `Llow:real`; `r0:num->num`] REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[distribution_fn; GSYM cdf] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC CDF_LE_EXPECTATION THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN + SUBGOAL_THEN `&1 <= &1 - (y - y0) / (x - y0)` MP_TAC THENL + [REWRITE_TAC[REAL_ARITH `&1 <= &1 - z <=> z <= &0`] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN REAL_ARITH_TAC]]]; + (* Llow <= l *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) + ((r:num->num) ((s:num->num) k)) a))` THEN + EXISTS_TAC `\k:num. distribution_fn (p:A prob_space) + ((X:num->A->real) ((r:num->num) ((s:num->num) k))) x` THEN + BETA_TAC THEN REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g_low:real->real) ((X:num->A->real) n a))`; + `Llow:real`; `\k:num. (r:num->num) ((s:num->num) k)`] + REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[distribution_fn; GSYM cdf] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC EXPECTATION_LE_CDF THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_low" THEN + SUBGOAL_THEN `&1 - (y - y0) / (x - y0) <= &0` MP_TAC THENL + [SUBGOAL_THEN `&1 <= (y - y0) / (x - y0)` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + REAL_ARITH_TAC]]]]]; + (* ---- l <= H(x + h) ---- *) + (* l <= H(y1) via ramp, then H(y1) <= H(x+h) by monotonicity *) + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(H:real->real) y1` THEN + CONJ_TAC THENL + [ALL_TAC; + ASM_MESON_TAC[REAL_LT_IMP_LE]] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + ABBREV_TAC + `g_up = \y:real. max (&0) (min (&1) (&1 - (y - x) / (y1 - x)))` THEN + SUBGOAL_THEN `&0 < y1 - x` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!y:real. abs((g_up:real->real) y) <= &1` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_up" THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!y:real. (g_up:real->real) real_continuous atreal y` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "g_up" THEN + MATCH_MP_TAC REAL_CONTINUOUS_MAX THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_MIN THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + MATCH_MP_TAC REAL_CONTINUOUS_DIV_ATREAL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_CONTINUOUS_SUB THEN + REWRITE_TAC[REAL_CONTINUOUS_AT_ID; REAL_CONTINUOUS_CONST]; + CONJ_TAC THENL + [REWRITE_TAC[REAL_CONTINUOUS_CONST]; + UNDISCH_TAC `&0 < y1 - x` THEN REAL_ARITH_TAC]]]]]; ALL_TAC] THEN + SUBGOAL_THEN `!n:num. integrable (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) n a))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&1` THEN CONJ_TAC THENL + [EXPAND_TAC "g_up" THEN + MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + X_GEN_TAC `a:A` THEN DISCH_TAC THEN BETA_TAC THEN + EXPAND_TAC "g_up" THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* E[g_up(X_n)] converges *) + MP_TAC(ISPECL + [`p:A prob_space`; `X:num->A->real`; + `phi_re:real->real`; `phi_im:real->real`; + `g_up:real->real`; `&1`] + GENERAL_WEAK_CONVERGENCE_CONVERGENT) THEN + BETA_TAC THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[REAL_LT_01] THEN + EXISTS_TAC `CC:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `Lup:real`) THEN + (* l <= Lup *) + EXISTS_TAC `Lup:real` THEN + CONJ_TAC THENL + [(* l <= Lup: along r o s *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. distribution_fn (p:A prob_space) + ((X:num->A->real) ((r:num->num) ((s:num->num) k))) x` THEN + EXISTS_TAC `\k:num. expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) + ((r:num->num) ((s:num->num) k)) a))` THEN + BETA_TAC THEN REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) n a))`; + `Lup:real`; `\k:num. (r:num->num) ((s:num->num) k)`] + REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN + FIRST_X_ASSUM(fun th -> MATCH_MP_TAC th) THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[distribution_fn; GSYM cdf] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC CDF_LE_EXPECTATION THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN + SUBGOAL_THEN `&1 <= &1 - (y - x) / (y1 - x)` MP_TAC THENL + [REWRITE_TAC[REAL_ARITH `&1 <= &1 - z <=> z <= &0`] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN REAL_ARITH_TAC]]]; + (* Lup <= H(y1): along Helly subseq r0 *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\k:num. expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) ((r0:num->num) k) a))` THEN + EXISTS_TAC `\k:num. distribution_fn (p:A prob_space) + ((X:num->A->real) ((r0:num->num) k)) y1` THEN + BETA_TAC THEN REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + CONJ_TAC THENL + [MP_TAC(ISPECL + [`\n:num. expectation (p:A prob_space) + (\a:A. (g_up:real->real) ((X:num->A->real) n a))`; + `Lup:real`; `r0:num->num`] REALLIM_SUBSEQUENCE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `y1:real` o + check (fun th -> free_in `r0:num->num` (concl th))) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[distribution_fn; GSYM cdf] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC EXPECTATION_LE_CDF THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN REAL_ARITH_TAC; + X_GEN_TAC `y:real` THEN DISCH_TAC THEN + EXPAND_TAC "g_up" THEN + SUBGOAL_THEN `&1 - (y - x) / (y1 - x) <= &0` MP_TAC THENL + [SUBGOAL_THEN `&1 <= (y - x) / (y1 - x)` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + REAL_ARITH_TAC]]]]]]);; + +(* LEVY_CONTINUITY_GENERAL_CID: + Same as LEVY_CONTINUITY_GENERAL but conclusion uses + converges_in_distribution definition. *) +let LEVY_CONTINUITY_GENERAL_CID = prove + (`!p:A prob_space (X:num->A->real) (phi_re:real->real) (phi_im:real->real). + (!n. random_variable p (X n)) /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (?C. &0 < C /\ !n. expectation p (\x. X n x pow 2) <= C) /\ + (!t. ((\n. char_fn_re p (X n) t) ---> phi_re t) sequentially) /\ + (!t. ((\n. char_fn_im p (X n) t) ---> phi_im t) sequentially) + ==> ?H. (!x. &0 <= H x /\ H x <= &1) /\ + (!x y. x <= y ==> H x <= H y) /\ + (!e. &0 < e ==> ?M. &0 < M /\ H(--M) < e /\ &1 - e < H M) /\ + converges_in_distribution p X H`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; + `phi_re:real->real`; `phi_im:real->real`] + LEVY_CONTINUITY_GENERAL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `H:real->real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `H:real->real` THEN ASM_REWRITE_TAC[converges_in_distribution]);; + +(* ================================================================== *) +(* LINDEBERG-FELLER CLT *) +(* ================================================================== *) + +(* L1: Telescoping product inequality *) +let PRODUCT_DIFF_SUM_BOUND = prove + (`!n (a:num->real) (b:num->real). + (!i. i <= n ==> abs(a i) <= &1) /\ + (!i. i <= n ==> abs(b i) <= &1) + ==> abs(product(0..n) a - product(0..n) b) + <= sum(0..n) (\i. abs(a i - b i))`, + INDUCT_TAC THENL + [REWRITE_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; LE_0; LE; ARITH] THEN + BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SIMP_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; + ARITH_RULE `0 <= SUC n`] THEN BETA_TAC THEN + ABBREV_TAC `Pa = product(0..n) (a:num->real)` THEN + ABBREV_TAC `Pb = product(0..n) (b:num->real)` THEN + SUBGOAL_THEN `Pa * (a:num->real)(SUC n) - Pb * b(SUC n) = + a(SUC n) * (Pa - Pb) + (a(SUC n) - b(SUC n)) * Pb` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs((a:num->real)(SUC n)) <= &1` ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(Pa - Pb) <= + sum(0..n) (\i. abs((a:num->real) i - b i))` ASSUME_TAC THENL + [EXPAND_TAC "Pa" THEN EXPAND_TAC "Pb" THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[ARITH_RULE `i <= n ==> i <= SUC n`]; + ALL_TAC] THEN + SUBGOAL_THEN `abs Pb <= &1` ASSUME_TAC THENL + [EXPAND_TAC "Pb" THEN + MP_TAC(ISPECL [`b:num->real`; `0..n`] PRODUCT_ABS) THEN + REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `product(0..n) (\i:num. &1)` THEN CONJ_TAC THENL + [MATCH_MP_TAC PRODUCT_LE_NUMSEG THEN GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_POS] THEN + UNDISCH_TAC `!i. i <= SUC n ==> abs ((b:num->real) i) <= &1` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_ARITH_TAC; + REWRITE_TAC[PRODUCT_CONST_NUMSEG; REAL_POW_ONE; REAL_LE_REFL]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((a:num->real)(SUC n)) * abs(Pa - Pb) + + abs(a(SUC n) - b(SUC n)) * abs Pb` THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_ABS_MUL] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&1 * sum(0..n) (\i. abs((a:num->real) i - b i)) + + abs(a(SUC n) - b(SUC n)) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL] THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN GEN_TAC THEN STRIP_TAC THEN + BETA_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[REAL_ABS_POS]]; + REAL_ARITH_TAC]);; + +(* L2: Upper bound: product(1-c_i) <= exp(-sum c_i) *) +let PRODUCT_1_MINUS_LE_EXP = prove + (`!n (c:num->real). (!i. i <= n ==> &0 <= c i /\ c i <= &1) + ==> product(0..n) (\i. &1 - c i) <= exp(--(sum(0..n) c))`, + INDUCT_TAC THENL + [GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; LE_0; LE; ARITH] THEN + BETA_TAC THEN + MP_TAC(SPEC `--((c:num->real) 0)` REAL_EXP_LE_X) THEN REAL_ARITH_TAC; + ALL_TAC] THEN + GEN_TAC THEN STRIP_TAC THEN + SIMP_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; + ARITH_RULE `0 <= SUC n`] THEN BETA_TAC THEN + REWRITE_TAC[REAL_NEG_ADD; REAL_EXP_ADD] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC PRODUCT_POS_LE_NUMSEG THEN + GEN_TAC THEN STRIP_TAC THEN BETA_TAC THEN + FIRST_ASSUM(MP_TAC o SPEC `x:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REAL_ARITH_TAC]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_MESON_TAC[ARITH_RULE `i <= n ==> i <= SUC n`]; + FIRST_ASSUM(MP_TAC o SPEC `SUC n`) THEN + REWRITE_TAC[LE_REFL] THEN REAL_ARITH_TAC; + MP_TAC(SPEC `--((c:num->real)(SUC n))` REAL_EXP_LE_X) THEN + REAL_ARITH_TAC]);; + +(* Helper: exp(-c/(1-delta)) <= 1-c when 0 <= c <= delta < 1 *) +(* From LOG_LOWER_BOUND: log(1-c) >= 1-1/(1-c) = -c/(1-c) >= -c/(1-delta) *) +let EXP_NEG_DIV_LE_1_MINUS = prove + (`!c delta. &0 <= c /\ c <= delta /\ delta < &1 + ==> exp(--(c / (&1 - delta))) <= &1 - c`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < &1 - c` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &1 - delta` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp(log(&1 - c))` THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_EXP_MONO_LE] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&1 - inv(&1 - c)` THEN CONJ_TAC THENL + [SUBGOAL_THEN `&1 - inv(&1 - c) = --(c / (&1 - c))` + SUBST1_TAC THENL + [SUBGOAL_THEN `~(&1 - c = &0)` MP_TAC THENL + [ASM_REAL_ARITH_TAC; CONV_TAC REAL_FIELD]; ALL_TAC] THEN + REWRITE_TAC[REAL_LE_NEG2; real_div] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REAL_ARITH_TAC]; + MATCH_MP_TAC LOG_LOWER_BOUND THEN ASM_REWRITE_TAC[]]; + ASM_SIMP_TAC[EXP_LOG; REAL_LE_REFL]]);; + +(* L3: Lower bound: exp(-sum c_i/(1-delta)) <= product(1-c_i) *) +let EXP_LE_PRODUCT_1_MINUS = prove + (`!n (c:num->real) delta. + (!i. i <= n ==> &0 <= c i /\ c i <= delta) /\ delta < &1 + ==> exp(--(sum(0..n) c / (&1 - delta))) + <= product(0..n) (\i. &1 - c i)`, + INDUCT_TAC THENL + [REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; LE_0; LE; ARITH] THEN + BETA_TAC THEN MATCH_MP_TAC EXP_NEG_DIV_LE_1_MINUS THEN + FIRST_ASSUM(MP_TAC o SPEC `0`) THEN REWRITE_TAC[LE_0] THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SIMP_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; + ARITH_RULE `0 <= SUC n`] THEN BETA_TAC THEN + SUBGOAL_THEN `&0 < &1 - delta` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(sum(0..n) (c:num->real) + c(SUC n)) / (&1 - delta) = + sum(0..n) c / (&1 - delta) + c(SUC n) / (&1 - delta)` + SUBST1_TAC THENL + [SUBGOAL_THEN `~(&1 - delta = &0)` MP_TAC THENL + [ASM_REAL_ARITH_TAC; CONV_TAC REAL_FIELD]; + ALL_TAC] THEN + REWRITE_TAC[REAL_NEG_ADD; REAL_EXP_ADD] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[REAL_EXP_POS_LE]; + FIRST_X_ASSUM(MP_TAC o SPECL [`c:num->real`; `delta:real`]) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[ARITH_RULE `i <= n ==> i <= SUC n`]; SIMP_TAC[]]; + REWRITE_TAC[REAL_EXP_POS_LE]; + MATCH_MP_TAC EXP_NEG_DIV_LE_1_MINUS THEN + FIRST_ASSUM(MP_TAC o SPEC `SUC n`) THEN + REWRITE_TAC[LE_REFL] THEN ASM_REAL_ARITH_TAC]);; + +(* L4: Non-IID generalization of CHAR_FN_SUM_IID_RE_BOUND. + Telescoping product inequality for characteristic function real parts. + |Re(char_fn(S_n)) - prod(Re(char_fn(X_i)))| <= sum(|Im(char_fn(X_i))|) *) +let CHAR_FN_SUM_RE_PRODUCT_BOUND = prove + (`!p:A prob_space (X:num->A->real) n t. + (!i. random_variable p (X i)) /\ + (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) + ==> abs(char_fn_re p (\x. sum(0..n) (\i. X i x)) t - + product(0..n) (\i. char_fn_re p (X i) t)) + <= sum(0..n) (\i. abs(char_fn_im p (X i) t))`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [(* Base case *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..0) (\i. (X:num->A->real) i x)) = X 0` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; SUM_SING_NUMSEG] THEN GEN_TAC THEN BETA_TAC THEN + REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; + LE_0; LE; ARITH] THEN + BETA_TAC THEN + REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_NUM; REAL_ADD_RID; REAL_ABS_POS]; + ALL_TAC] THEN + (* Step case *) + GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..SUC n) (\i. (X:num->A->real) i x)) = + (\x. sum(0..n) (\i. X i x) + X (SUC n) x)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN BETA_TAC THEN + SIMP_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x))` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `indep_rv (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) (X (SUC n))` + ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; + `(X:num->A->real) (SUC n)`; `t:real`] + CHAR_FN_ADD_INDEP_RE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + BETA_TAC THEN DISCH_TAC THEN + SIMP_TAC[PRODUCT_CLAUSES_NUMSEG; SUM_CLAUSES_NUMSEG; + ARITH_RULE `0 <= SUC n`] THEN BETA_TAC THEN + ONCE_ASM_REWRITE_TAC[] THEN + ABBREV_TAC `Rn = char_fn_re (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN + ABBREV_TAC `Sn = char_fn_im (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t` THEN + ABBREV_TAC `rn1 = char_fn_re (p:A prob_space) + ((X:num->A->real) (SUC n)) t` THEN + ABBREV_TAC `sn1 = char_fn_im (p:A prob_space) + ((X:num->A->real) (SUC n)) t` THEN + ABBREV_TAC `Pn = product(0..n) + (\i. char_fn_re (p:A prob_space) ((X:num->A->real) i) t)` THEN + SUBGOAL_THEN `abs rn1 <= &1` ASSUME_TAC THENL + [EXPAND_TAC "rn1" THEN MATCH_MP_TAC CHAR_FN_RE_BOUND THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `abs Sn <= &1` ASSUME_TAC THENL + [EXPAND_TAC "Sn" THEN MATCH_MP_TAC CHAR_FN_IM_BOUND THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `abs(Rn - Pn) <= + sum(0..n) (\i. abs(char_fn_im (p:A prob_space) + ((X:num->A->real) i) t))` + ASSUME_TAC THENL + [EXPAND_TAC "Rn" THEN EXPAND_TAC "Pn" THEN + FIRST_X_ASSUM(MP_TAC o SPEC `t:real`) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[ARITH_RULE `k < n ==> k < SUC n`]; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `Rn * rn1 - Sn * sn1 - Pn * rn1 = + (Rn - Pn) * rn1 + (-- &1) * (Sn * sn1)` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_SUB_RDISTRIB] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((Rn - Pn) * rn1) + abs(-- &1 * Sn * sn1)` THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_NEG; REAL_ABS_NUM; + REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs(char_fn_im (p:A prob_space) + ((X:num->A->real) i) t)) * &1 + &1 * abs sn1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN GEN_TAC THEN STRIP_TAC THEN + BETA_TAC THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_LE_MUL2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL]]; + REAL_ARITH_TAC]);; + +(* Pointwise bound: cos Taylor remainder split by truncation threshold d. + Case |x|<=d: cos(sx)-1+(sx)^2/2 <= s^4*d^2*x^2/6 (from COS_TAYLOR_BOUND_4) + Case |x|>d: cos(sx)-1+(sx)^2/2 <= s^2*x^2/2 (from COS_TAYLOR_UPPER) *) +let TAYLOR_COS_SPLIT_BOUND = prove + (`!x s d. &0 <= d + ==> cos(s * x) - &1 + (s * x) pow 2 / &2 + <= s pow 4 * d pow 2 * x pow 2 / &6 + + s pow 2 * x pow 2 / &2 * (if abs(x) > d then &1 else &0)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= s pow 4` ASSUME_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; REAL_LE_POW_2]; + ALL_TAC] THEN + DISJ_CASES_TAC (REAL_ARITH `abs x <= d \/ abs x > d`) THENL + [SUBGOAL_THEN `~(abs x > d)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(s * x) pow 4 / &6` THEN + REWRITE_TAC[COS_TAYLOR_BOUND_4; REAL_POW_MUL] THEN + REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 + 2`; REAL_POW_ADD] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_MUL_RID] THEN + MP_TAC(SPEC `s * x:real` COS_TAYLOR_UPPER) THEN + REWRITE_TAC[REAL_POW_MUL] THEN + SUBGOAL_THEN `&0 <= s pow 4 * d pow 2 * x pow 2 / &6` MP_TAC THENL + [REWRITE_TAC[real_div] THEN + REPEAT(MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC) THEN + ASM_REWRITE_TAC[REAL_LE_POW_2] THEN + TRY(MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC); + REAL_ARITH_TAC]]);; + +(* Pointwise bound: |sin(sx)-sx| split by truncation threshold d. + Case |x|<=d: |sin(sx)-sx| <= |s|^3*d*x^2/2 (from SIN_APPROX_BOUND) + Case |x|>d: |sin(sx)-sx| <= s^2*x^2 (from SIN_MINUS_X_SQ_BOUND) *) +let SIN_MINUS_X_SPLIT_BOUND = prove + (`!x s d. &0 <= d + ==> abs(sin(s * x) - s * x) + <= abs(s) pow 3 * d * x pow 2 / &2 + + s pow 2 * x pow 2 * (if abs(x) > d then &1 else &0)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + DISJ_CASES_TAC (REAL_ARITH `abs x <= d \/ abs x > d`) THENL + [SUBGOAL_THEN `~(abs x > d)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(s * x) pow 3 / &2` THEN + REWRITE_TAC[SIN_APPROX_BOUND] THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_POW_MUL] THEN + REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `abs x pow 3 = abs x * x pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[ARITH_RULE `3 = 1 + 2`; REAL_POW_ADD; REAL_POW_1; + REAL_POW2_ABS]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(s * x:real) pow 2` THEN CONJ_TAC THENL + [REWRITE_TAC[SIN_MINUS_X_SQ_BOUND]; + REWRITE_TAC[REAL_POW_MUL] THEN + SUBGOAL_THEN `&0 <= abs s pow 3 * d * x pow 2 / &2` MP_TAC THENL + [REWRITE_TAC[real_div] THEN + REPEAT(MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC) THEN + ASM_REWRITE_TAC[REAL_LE_POW_2] THEN + TRY(MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC) THEN + TRY(MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC); + REAL_ARITH_TAC]]]);; + +(* Indicator function is a random variable when the threshold test + involves a random variable *) +let RANDOM_VARIABLE_INDICATOR_GT = prove + (`!p:A prob_space X d. + random_variable p X /\ &0 <= d + ==> random_variable p (\x. if abs(X x) > d then &1 else &0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[random_variable] THEN + X_GEN_TAC `c:real` THEN BETA_TAC THEN + ASM_CASES_TAC `c < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (if abs (X x) > d then &1 else &0) <= c} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC SIGMA_ALGEBRA_EMPTY THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA]]; + ALL_TAC] THEN + ASM_CASES_TAC `&1 <= c` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (if abs (X x) > d then &1 else &0) <= c} = prob_carrier p` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + GEN_TAC THEN EQ_TAC THENL [SIMP_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MP_TAC(ISPEC `prob_events(p:A prob_space)` SIGMA_ALGEBRA_CARRIER) THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA] THEN + REWRITE_TAC[GSYM prob_carrier]]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (if abs (X x) > d then &1 else &0) <= c} = + {x | x IN prob_carrier p /\ X x <= d} INTER + {x | x IN prob_carrier p /\ --X x <= d}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC(ISPEC `prob_events(p:A prob_space)` SIGMA_ALGEBRA_INTER) THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN REWRITE_TAC[]; + MP_TAC(MATCH_MP RANDOM_VARIABLE_NEG (ASSUME `random_variable p (X:A->real)`)) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN BETA_TAC THEN REWRITE_TAC[]]]);; + +(* Indicator of {abs(X) <= d} is a random variable *) +let RANDOM_VARIABLE_INDICATOR_LE = prove + (`!p:A prob_space X d. + random_variable p X /\ &0 <= d + ==> random_variable p (\x. if abs(X x) <= d then &1 else &0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[random_variable] THEN + X_GEN_TAC `c:real` THEN BETA_TAC THEN + ASM_CASES_TAC `c < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (if abs ((X:A->real) x) <= d then &1 else &0) <= c} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC SIGMA_ALGEBRA_EMPTY THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA]]; + ALL_TAC] THEN + ASM_CASES_TAC `&1 <= c` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (if abs ((X:A->real) x) <= d then &1 else &0) <= c} = prob_carrier p` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + GEN_TAC THEN EQ_TAC THENL [SIMP_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MP_TAC(ISPEC `prob_events(p:A prob_space)` SIGMA_ALGEBRA_CARRIER) THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA] THEN + REWRITE_TAC[GSYM prob_carrier]]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (if abs ((X:A->real) x) <= d then &1 else &0) <= c} = + prob_carrier p DIFF + ({x | x IN prob_carrier p /\ X x <= d} INTER + {x | x IN prob_carrier p /\ --X x <= d})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF; IN_INTER] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + MATCH_MP_TAC(ISPEC `prob_events(p:A prob_space)` SIGMA_ALGEBRA_INTER) THEN + REWRITE_TAC[PROB_SPACE_SIGMA_ALGEBRA] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN REWRITE_TAC[]; + MP_TAC(MATCH_MP RANDOM_VARIABLE_NEG + (ASSUME `random_variable p (X:A->real)`)) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN + BETA_TAC THEN REWRITE_TAC[]]]);; + +(* X^2 * indicator(abs X > d) is integrable when X^2 is integrable *) +let INTEGRABLE_INDICATOR_WEIGHTED_POW2 = prove + (`!p:A prob_space X d. + random_variable p X /\ integrable p (\x. X x pow 2) /\ &0 <= d + ==> integrable p (\x. X x pow 2 * (if abs(X x) > d then &1 else &0))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. (X:A->real) x pow 2` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_INDICATOR_GT THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs(X(x:A) pow 2) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]);; + +let INTEGRABLE_INDICATOR_WEIGHTED_POW2_LE = prove + (`!p:A prob_space X d. + random_variable p X /\ integrable p (\x. X x pow 2) /\ &0 <= d + ==> integrable p (\x. X x pow 2 * (if abs(X x) <= d then &1 else &0))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. (X:A->real) x pow 2` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_INDICATOR_LE THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `abs(X(x:A) pow 2) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]);; + +(* Per-component bound on real part of char fn Taylor remainder. + char_fn_re p X s - (1 - s^2*E[X^2]/2) <= s^4*d^2*E[X^2]/6 + s^2/2*E[X^2*I(abs X>d)] + Uses COS_TAYLOR_BOUND_4 for |X|<=d part, COS_TAYLOR_UPPER for |X|>d part. *) +let CHAR_FN_RE_COMPONENT_BOUND = prove + (`!p:A prob_space X s d. + integrable p X /\ integrable p (\x. X x pow 2) /\ + expectation p X = &0 /\ &0 <= d + ==> char_fn_re p X s - (&1 - s pow 2 * expectation p (\x. X x pow 2) / &2) + <= s pow 4 * d pow 2 * expectation p (\x. X x pow 2) / &6 + + s pow 2 / &2 * expectation p (\x. X x pow 2 * + (if abs(X x) > d then &1 else &0))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `random_variable p (X:A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. X x pow 2 * (if abs(X x) > d then &1 else &0))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `char_fn_re p X s - (&1 - s pow 2 * expectation p (\x:A. X x pow 2) / &2) = + expectation p (\x. cos(s * X x) - &1 + s pow 2 * X x pow 2 / &2)` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; `s:real`] + TAYLOR_REMAINDER_EXPECTATION) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. s pow 4 * d pow 2 / &6 * X x pow 2 + + s pow 2 / &2 * (X x pow 2 * (if abs(X x) > d then &1 else &0)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_SIMP_TAC[INTEGRABLE_TAYLOR_REMAINDER] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(X:A->real) x`; `s:real`; `d:real`] TAYLOR_COS_SPLIT_BOUND) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_POW_MUL] THEN + REAL_ARITH_TAC]; + SUBGOAL_THEN `integrable p (\x:A. s pow 4 * d pow 2 / &6 * X x pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. s pow 2 / &2 * (X x pow 2 * (if abs(X x) > d then &1 else &0)))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_ADD] THEN + ASM_SIMP_TAC[EXPECTATION_CMUL; INTEGRABLE_CMUL] THEN + REAL_ARITH_TAC]);; + +(* Per-component bound on imaginary part of char fn. + |char_fn_im p X s| <= |s|^3*d*E[X^2]/2 + s^2*E[X^2*I(abs X>d)] + Uses E[X]=0, SIN_APPROX_BOUND for |X|<=d, SIN_MINUS_X_SQ_BOUND for |X|>d. *) +let CHAR_FN_IM_COMPONENT_BOUND = prove + (`!p:A prob_space X s d. + integrable p X /\ integrable p (\x. X x pow 2) /\ + expectation p X = &0 /\ &0 <= d + ==> abs(char_fn_im p X s) + <= abs(s) pow 3 * d * expectation p (\x. X x pow 2) / &2 + + s pow 2 * expectation p (\x. X x pow 2 * + (if abs(X x) > d then &1 else &0))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `random_variable p (X:A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. X x pow 2 * (if abs(X x) > d then &1 else &0))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. sin(s * X x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SIN_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. s * X x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `char_fn_im p X s = expectation p (\x:A. sin(s * X x) - s * X x)` + SUBST1_TAC THENL + [REWRITE_TAC[char_fn_im] THEN + ASM_SIMP_TAC[EXPECTATION_SUB; EXPECTATION_CMUL] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. abs(sin(s * X x) - s * X x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. abs s pow 3 * d / &2 * X x pow 2 + + s pow 2 * (X x pow 2 * (if abs(X x) > d then &1 else &0)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_SIMP_TAC[INTEGRABLE_ABS; INTEGRABLE_SUB] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`(X:A->real) x`; `s:real`; `d:real`] SIN_MINUS_X_SPLIT_BOUND) THEN + ASM_REWRITE_TAC[REAL_ABS_MUL; REAL_POW_MUL] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `integrable p (\x:A. abs s pow 3 * d / &2 * X x pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. s pow 2 * (X x pow 2 * (if abs(X x) > d then &1 else &0)))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_ADD] THEN + ASM_SIMP_TAC[EXPECTATION_CMUL; INTEGRABLE_CMUL] THEN + REAL_ARITH_TAC]);; + +(* L4_IM: Imaginary part analog of CHAR_FN_SUM_RE_PRODUCT_BOUND. + |char_fn_im(sum X_i)| <= sum |char_fn_im(X_i)| *) +let CHAR_FN_SUM_IM_BOUND = prove + (`!p:A prob_space (X:num->A->real) n t. + (!i. random_variable p (X i)) /\ + (!k. k < n ==> indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) + ==> abs(char_fn_im p (\x. sum(0..n) (\i. X i x)) t) + <= sum(0..n) (\i. abs(char_fn_im p (X i) t))`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [(* Base case *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..0) (\i. (X:num->A->real) i x)) = X 0` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; SUM_SING_NUMSEG] THEN GEN_TAC THEN BETA_TAC THEN + REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_SING_NUMSEG] THEN BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..SUC n) (\i. (X:num->A->real) i x)) = + (\x. sum(0..n) (\i. X i x) + X (SUC n) x)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN BETA_TAC THEN + SIMP_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x))` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `indep_rv (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) (X (SUC n))` + ASSUME_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`; + `(X:num->A->real) (SUC n)`; `t:real`] + CHAR_FN_ADD_INDEP_IM) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + BETA_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[] THEN + SIMP_TAC[SUM_CLAUSES_NUMSEG; ARITH_RULE `0 <= SUC n`] THEN BETA_TAC THEN + SUBGOAL_THEN `abs(char_fn_re (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t) <= &1` ASSUME_TAC THENL + [MATCH_MP_TAC CHAR_FN_RE_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `abs(char_fn_re (p:A prob_space) + ((X:num->A->real) (SUC n)) t) <= &1` ASSUME_TAC THENL + [MATCH_MP_TAC CHAR_FN_RE_BOUND THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `abs(char_fn_im (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t) <= + sum(0..n) (\i. abs(char_fn_im p (X i) t))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `t:real`) THEN + ANTS_TAC THENL + [ASM_MESON_TAC[ARITH_RULE `k < n ==> k < SUC n`]; SIMP_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(char_fn_re (p:A prob_space) + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) t) * + abs(char_fn_im p (X (SUC n)) t) + + abs(char_fn_im p (\x. sum(0..n) (\i. X i x)) t) * + abs(char_fn_re p (X (SUC n)) t)` THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_ABS_MUL] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&1 * abs(char_fn_im (p:A prob_space) + ((X:num->A->real) (SUC n)) t) + + sum(0..n) (\i. abs(char_fn_im p (X i) t)) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL]; + MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN GEN_TAC THEN STRIP_TAC THEN + BETA_TAC THEN REWRITE_TAC[REAL_ABS_POS]]; + REAL_ARITH_TAC]);; + +(* ===================================================================== *) +(* Lindeberg-Feller Central Limit Theorem *) +(* ===================================================================== *) + +(* LOCAL_ASM_REAL_ARITH_TAC: filters foralls, existentials, + ABBREV_TAC equations (where one side is a plain variable), + and assumptions containing lambda abstractions (which + REAL_ARITH cannot handle, e.g. sum/expectation terms) *) +let LOCAL_ASM_REAL_ARITH_TAC = + let is_abbrev_eq c = + try let l,r = dest_eq c in is_var r || is_var l + with Failure _ -> false in + let rec has_abs tm = + if is_abs tm then true + else if is_comb tm then + let f,x = dest_comb tm in has_abs f || has_abs x + else false in + REPEAT(FIRST_X_ASSUM(MP_TAC o check (fun th -> + let c = concl th in + not(is_forall c) && not(is_exists c) && + not(is_abbrev_eq c) && not(has_abs c)))) THEN + REAL_ARITH_TAC;; + +(* Main theorem: Lindeberg-Feller CLT + For independent (not necessarily identically distributed) random + variables with zero mean and finite second moments, if the Lindeberg + condition holds then the standardized partial sums converge in + distribution to the standard normal. *) +let REAL_EQ_SUB_RADD = prove + (`!a b c:real. a = b - c ==> b = c + a`, + REPEAT GEN_TAC THEN DISCH_THEN SUBST1_TAC THEN REAL_ARITH_TAC);; + +let REAL_POW2_ABS_LE = prove + (`!x y:real. abs x <= y ==> x pow 2 <= y pow 2`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + GEN_REWRITE_TAC LAND_CONV [GSYM REAL_POW2_ABS] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN + ASM_REWRITE_TAC[REAL_ABS_POS]);; + +let LINDEBERG_FELLER_CLT = prove + (`!p:A prob_space (X:num->A->real). + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!i. expectation p (X i) = &0) /\ + (!i j:num. ~(i = j) ==> indep_rv p (X i) (X j)) /\ + (!n k. k < n ==> + indep_rv p (\x. sum(0..k) (\i. X i x)) (X (SUC k))) /\ + (!n. &0 < sum(0..n) (\i. expectation p (\x. X i x pow 2))) /\ + (!eps. &0 < eps ==> + ((\n. sum(0..n) (\i. expectation p (\x. X i x pow 2 * + (if abs(X i x) > + eps * sqrt(sum(0..n) (\j. expectation p (\y. X j y pow 2))) + then &1 else &0))) / + sum(0..n) (\i. expectation p (\x. X i x pow 2))) + ---> &0) sequentially) + ==> + !x. ((\n. cdf p (\a. sum(0..n) (\i. X i a) / + sqrt(sum(0..n) (\j. expectation p (\y. X j y pow 2)))) x) + ---> std_normal_cdf x) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Abbreviate sn2 n = sum(0..n) E[X_i^2] *) + ABBREV_TAC `sn2 = \n:num. sum(0..n) + (\i. expectation p (\x. (X:num->A->real) i x pow 2))` THEN + (* Abbreviate Y_n = standardized partial sum *) + ABBREV_TAC `Y = \n:num. \a:A. sum(0..n) (\i. (X:num->A->real) i a) / + sqrt((sn2:num->real) n)` THEN + (* random_variable for each X_i *) + SUBGOAL_THEN `!i:num. random_variable p ((X:num->A->real) i)` ASSUME_TAC + THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + (* sn2 n > 0 *) + SUBGOAL_THEN `!n:num. &0 < (sn2:num->real) n` ASSUME_TAC THENL + [EXPAND_TAC "sn2" THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + (* sqrt(sn2 n) > 0 *) + SUBGOAL_THEN `!n:num. &0 < sqrt((sn2:num->real) n)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SQRT_POS_LT THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* sqrt(sn2 n) != 0 *) + SUBGOAL_THEN `!n:num. ~(sqrt((sn2:num->real) n) = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN + (* Rewrite conclusion in terms of Y *) + SUBGOAL_THEN `!n x:real. cdf p ((Y:num->A->real) n) x = + cdf p (\a. sum(0..n) (\i. (X:num->A->real) i a) / + sqrt((sn2:num->real) n)) x` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + EXPAND_TAC "Y" THEN REFL_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `!n x:real. cdf p (\a. sum(0..n) + (\i. (X:num->A->real) i a) / + sqrt(sum(0..n) (\j. expectation p (\y. X j y pow 2)))) x = + cdf p ((Y:num->A->real) n) x` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN ASM_REWRITE_TAC[ETA_AX] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN EXPAND_TAC "sn2" THEN REFL_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[ETA_AX] THEN + (* Apply LEVY_CONTINUITY_CLT to Y *) + MATCH_MP_TAC LEVY_CONTINUITY_CLT THEN + (* Fold sn2 abbreviation back into goal -- MATCH_MP_TAC expanded it *) + SUBGOAL_THEN `!n. sum(0..n) + (\j. expectation p (\y:A. (X:num->A->real) j y pow 2)) = + (sn2:num->real) n` (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN EXPAND_TAC "sn2" THEN REWRITE_TAC[]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [(* random_variable p (expanded form) *) + X_GEN_TAC `n:num` THEN + SUBGOAL_THEN `(\a:A. sum(0..n) (\i. (X:num->A->real) i a) / + sqrt((sn2:num->real) n)) = + (\a. inv(sqrt(sn2 n)) * sum(0..n) (\i. X i a))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[ETA_AX]]; + (* Bounded second moments: ?C. ... *) + EXISTS_TAC `&2` THEN CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `n:num` THEN BETA_TAC THEN + (* Goal: expectation p (\x. (sum/sqrt(sn2)) pow 2) <= &2 *) + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1` THEN + CONJ_TAC THENL [ALL_TAC; REAL_ARITH_TAC] THEN + (* Suffices to show E[(sum/sqrt(sn2))^2] = 1 *) + REWRITE_TAC[REAL_POW_DIV] THEN + SUBGOAL_THEN + `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) pow 2 / + sqrt((sn2:num->real) n) pow 2) = + (\x. inv(sqrt(sn2 n) pow 2) * sum(0..n) (\i. X i x) pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. inv(sqrt((sn2:num->real) n) pow 2) * + sum(0..n) (\i. (X:num->A->real) i x) pow 2) = + inv(sqrt(sn2 n) pow 2) * + expectation p (\x. sum(0..n) (\i. X i x) pow 2)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN + MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + (* E[sum^2] = sn2 n *) + SUBGOAL_THEN `expectation p + (\x:A. sum(0..n) (\i. (X:num->A->real) i x) pow 2) = + (sn2:num->real) n` SUBST1_TAC THENL + [SUBGOAL_THEN `expectation p + (\x:A. sum(0..n) (\i. (X:num->A->real) i x) pow 2) = + variance p (\x. sum(0..n) (\i. X i x))` SUBST1_TAC THENL + [MATCH_MP_TAC VARIANCE_MEAN_ZERO THEN ASM_REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_SIMP_TAC[]; + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN ASM_SIMP_TAC[]; + ASM_SIMP_TAC[EXPECTATION_SUM] THEN ASM_REWRITE_TAC[SUM_0]]]; + ALL_TAC] THEN + SUBGOAL_THEN `variance p + (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) = + sum(0..n) (\i. variance p (X i))` SUBST1_TAC THENL + [MATCH_MP_TAC VARIANCE_SUM_UNCORRELATED THEN ASM_SIMP_TAC[] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC COVARIANCE_INDEP THEN + ASM_SIMP_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_MUL_SQUARE THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; + ALL_TAC] THEN + SUBGOAL_THEN `!i:num. variance p ((X:num->A->real) i) = + expectation p (\x:A. X i x pow 2)` (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC VARIANCE_MEAN_ZERO THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + EXPAND_TAC "sn2" THEN REFL_TAC; + ALL_TAC] THEN + (* inv(sn2 n) * sn2 n = 1 *) + SUBGOAL_THEN `~((sn2:num->real) n = &0)` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN + CONV_TAC REAL_FIELD; + (* integrable p (expanded form) *) + X_GEN_TAC `n:num` THEN + REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_SIMP_TAC[]; + (* integrable p (\x. (expanded form) pow 2) *) + X_GEN_TAC `n:num` THEN BETA_TAC THEN + REWRITE_TAC[REAL_POW_DIV; real_div] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN ASM_SIMP_TAC[]; + (* ============================================================ *) + (* char_fn_re convergence: *) + (* char_fn_re p (Y n) t ---> exp(-t^2/2) *) + (* Decomposition: [A]+[B]+[C] where *) + (* [A] = |char_fn_re(Y_n) - prod r_i| by L4 *) + (* [B] = |prod r_i - prod(1-c_i)| by L1 *) + (* [C] = |prod(1-c_i) - exp(-t^2/2)| by L2+L3 *) + (* ============================================================ *) + X_GEN_TAC `t:real` THEN + ((* Scaling: char_fn_re p (\a. sum/sqrt(sn2)) t = + char_fn_re p (\a. sum) (t/sqrt(sn2)) *) + SUBGOAL_THEN `!n. char_fn_re p + (\a:A. sum(0..n) (\i. (X:num->A->real) i a) / + sqrt((sn2:num->real) n)) t = + char_fn_re p (\a. sum(0..n) (\i. X i a)) + (t / sqrt(sn2 n))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[char_fn_re] THEN + BETA_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN BETA_TAC THEN AP_TERM_TAC THEN + (SUBGOAL_THEN `!a b:real. a / b = inv(b) * a` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[real_div] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `eta:real` THEN DISCH_TAC THEN + ((* Handle t = 0 case *) + ASM_CASES_TAC `t = &0` THENL + [EXISTS_TAC `0` THEN GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; char_fn_re; COS_0; + EXPECTATION_CONST; REAL_POW_2; REAL_MUL_LZERO; + REAL_NEG_0; REAL_EXP_0; REAL_SUB_REFL; REAL_ABS_NUM] THEN + LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (* For eta >= 2, bound is trivial: |char_fn_re - exp| <= 1+1 = 2 < eta *) + (ASM_CASES_TAC `&2 <= eta` THENL + [EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `abs a <= &1 /\ &0 <= b /\ b < &1 /\ &2 <= e + ==> abs(a - b) < e`) THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC CHAR_FN_RE_BOUND THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN ASM_MESON_TAC[]; + REWRITE_TAC[REAL_EXP_POS_LE]; + REWRITE_TAC[GSYM REAL_EXP_0; REAL_EXP_MONO_LT] THEN + SUBGOAL_THEN `&0 < (t:real) pow 2` MP_TAC THENL + [REWRITE_TAC[REAL_ARITH `&0 < x <=> &0 <= x /\ ~(x = &0)`] THEN + REWRITE_TAC[REAL_LE_POW_2; REAL_POW_EQ_0; ARITH_EQ] THEN + ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]]; ALL_TAC]) THEN + (* Now eta < 2 *) + (* t != 0 *) + (* Abbreviate Lindeberg tail as Ln *) + ABBREV_TAC `Ln = \(eps:real) (n:num). + sum(0..n) (\i. expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n` THEN + (* Choose eps for the constant terms *) + ABBREV_TAC `eps = min (&1) + (eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1)))` THEN + (SUBGOAL_THEN `&0 < eps` ASSUME_TAC THENL + [EXPAND_TAC "eps" THEN REWRITE_TAC[REAL_LT_MIN] THEN + (CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]]; ALL_TAC]) THEN + (SUBGOAL_THEN `eps <= &1` ASSUME_TAC THENL + [EXPAND_TAC "eps" THEN REAL_ARITH_TAC; ALL_TAC]) THEN + ((* Bound: |t|^3 * eps / 2 < eta/4 *) + SUBGOAL_THEN `abs(t:real) pow 3 * eps / &2 < eta / &5` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(t:real) pow 3 * + (eta / (&5 * (abs t pow 3 + t pow 4 + &1))) / &2` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + EXPAND_TAC "eps" THEN REAL_ARITH_TAC]; ALL_TAC]) THEN + (* abs(t)^3 * eta/(4*D) / 2 < eta / 4 where D = abs(t)^3+t^4+1 *) + (SUBGOAL_THEN `&0 < abs(t:real) pow 3 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]; ALL_TAC]) THEN + (SUBGOAL_THEN `abs(t:real) pow 3 / (abs t pow 3 + t pow 4 + &1) < &1` + ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a < a + b + &1`) THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `eta / &10` THEN + (CONJ_TAC THENL [ALL_TAC; LOCAL_ASM_REAL_ARITH_TAC]) THEN + SUBGOAL_THEN + `abs(t:real) pow 3 * eta / + (&5 * (abs t pow 3 + t pow 4 + &1)) / &2 = + (eta / &10) * + (abs t pow 3 / (abs t pow 3 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `&0 < abs(t:real) pow 3 + t pow 4 + &1` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN LOCAL_ASM_REAL_ARITH_TAC; + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC]) THEN + ((* Bound: t^4 * eps^2 / 6 < eta/4 *) + SUBGOAL_THEN `t pow 4 * eps pow 2 / &6 < eta / &5` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 4 * eps / &6` THEN CONJ_TAC THENL + [(* eps^2 <= eps since eps <= 1 *) + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; REAL_LE_POW_2]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_POW_2] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]; + MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* t^4 * eps / 6 < eta / 4 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 4 * + (eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1))) / &6` THEN + CONJ_TAC THENL + [(* eps <= eta/(4*D) *) + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; REAL_LE_POW_2]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [EXPAND_TAC "eps" THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* eta * t^4/(24*D) < eta/4 *) + (SUBGOAL_THEN `&0 < abs(t:real) pow 3 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]; ALL_TAC]) THEN + SUBGOAL_THEN + `t pow 4 * eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1)) / &6 = + (eta / &30) * (t pow 4 / (abs t pow 3 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `&0 < abs(t:real) pow 3 + t pow 4 + &1` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `eta / &30` THEN + CONJ_TAC THENL [ALL_TAC; LOCAL_ASM_REAL_ARITH_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> b < a + b + &1`) THEN + SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + ALL_TAC]) THEN + ((* By Lindeberg at eps, Ln(eps) -> 0 *) + SUBGOAL_THEN `((Ln:real->num->real) eps ---> &0) sequentially` + ASSUME_TAC THENL + [EXPAND_TAC "Ln" THEN BETA_TAC THEN + UNDISCH_TAC `!eps. &0 < eps ==> + ((\n. sum (0..n) (\i. expectation (p:A prob_space) + (\x. (X:num->A->real) i x pow 2 * + (if abs (X i x) > eps * sqrt (sum (0..n) + (\j. expectation p (\y. X j y pow 2))) then &1 else &0))) / + sum (0..n) (\i. expectation p (\x. X i x pow 2))) + ---> &0) sequentially` THEN + DISCH_THEN(MP_TAC o SPEC `eps:real`) THEN ASM_REWRITE_TAC[ETA_AX] THEN + EXPAND_TAC "sn2" THEN SIMP_TAC[]; ALL_TAC]) THEN + (* Get N from Lindeberg *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC + `eta / (&5 * (t pow 2 + t pow 4 + &1))`) THEN + (ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]]; ALL_TAC]) THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + DISCH_THEN(X_CHOOSE_THEN `N1:num` ASSUME_TAC) THEN + ((* Get N2 from max variance vanishing: eventually max c_i <= 1/2 *) + (* Use a fresh Lindeberg invocation with eps2 = sqrt(inv(4t^2+4)) *) + (* Then sigma_i^2/sn2 < 2*inv(4t^2+4) = inv(2t^2+2) *) + (* So ci = t^2*sigma_i^2/(2*sn2) < t^2/(2*(2t^2+2)) = t^2/(4t^2+4) <= 1/4 *) + SUBGOAL_THEN `?N2. !n. N2 <= n ==> + !i. i <= n ==> t pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / + (&2 * (sn2:num->real) n) <= &1 / &2` + (X_CHOOSE_THEN `N2:num` ASSUME_TAC) THENL + [ABBREV_TAC `eps2 = sqrt(inv(&4 * t pow 2 + &4))` THEN + (SUBGOAL_THEN `&0 < &4 * t pow 2 + &4` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 < &4 * a + &4`) THEN + REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < eps2` ASSUME_TAC THENL + [EXPAND_TAC "eps2" THEN MATCH_MP_TAC SQRT_POS_LT THEN + MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `eps2 pow 2 = inv(&4 * t pow 2 + &4)` ASSUME_TAC THENL + [EXPAND_TAC "eps2" THEN MATCH_MP_TAC SQRT_POW_2 THEN + MATCH_MP_TAC REAL_LE_INV THEN LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (* Get Lindeberg at eps2: keep universal condition as well *) + UNDISCH_TAC `!eps. &0 < eps ==> + ((\n. sum (0..n) (\i. expectation (p:A prob_space) + (\x. (X:num->A->real) i x pow 2 * + (if abs (X i x) > eps * sqrt (sum (0..n) + (\j. expectation p (\y. X j y pow 2))) then &1 else &0))) / + sum (0..n) (\i. expectation p (\x. X i x pow 2))) + ---> &0) sequentially` THEN + DISCH_THEN(fun th -> ASSUME_TAC th THEN + MP_TAC(SPEC `eps2:real` th)) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY; REAL_SUB_RZERO] THEN + DISCH_THEN(MP_TAC o SPEC `inv(&4 * t pow 2 + &4)`) THEN + (ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + DISCH_THEN(X_CHOOSE_THEN `M:num` ASSUME_TAC) THEN + EXISTS_TAC `M:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + (* Get Ln(eps2,n) bound in sn2 terms *) + SUBGOAL_THEN `abs(sum(0..n) (\i'. expectation (p:A prob_space) + (\x:A. (X:num->A->real) i' x pow 2 * + (if abs(X i' x) > eps2 * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n) < inv(&4 * t pow 2 + &4)` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[ETA_AX] THEN EXPAND_TAC "sn2" THEN SIMP_TAC[]; + ALL_TAC] THEN + ((* sigma_i^2/sn2 < 2*inv(4t^2+4) via decomposition *) + SUBGOAL_THEN `expectation p (\x:A. (X:num->A->real) i x pow 2) / + (sn2:num->real) n < &2 * inv(&4 * t pow 2 + &4)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `eps2 pow 2 + abs(sum(0..n) (\i'. expectation (p:A prob_space) + (\x:A. (X:num->A->real) i' x pow 2 * + (if abs(X i' x) > eps2 * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n)` THEN + CONJ_TAC THENL + [ALL_TAC; ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC(REAL_ARITH `x < y ==> y + x < &2 * y`) THEN + FIRST_X_ASSUM MATCH_ACCEPT_TAC] THEN + ((* sigma_i^2/sn2 <= eps2^2 + |sum/sn2| -- decomposition *) + SUBGOAL_THEN `expectation p (\x:A. (X:num->A->real) i x pow 2) = + expectation p (\x. X i x pow 2 * + (if abs(X i x) <= eps2 * sqrt((sn2:num->real) n) then &1 else &0)) + + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps2 * sqrt(sn2 n) then &1 else &0))` + SUBST1_TAC THENL + [(SUBGOAL_THEN `(\x:A. (X:num->A->real) i x pow 2) = + (\x. X i x pow 2 * + (if abs(X i x) <= eps2 * sqrt((sn2:num->real) n) then &1 else &0) + + X i x pow 2 * + (if abs(X i x) > eps2 * sqrt(sn2 n) then &1 else &0))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN BETA_TAC THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. (X:num->A->real) i x pow 2` THEN + ASM_REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) i`; + `eps2 * sqrt((sn2:num->real) n)`] + RANDOM_VARIABLE_INDICATOR_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + BETA_TAC THEN SIMP_TAC[]]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((X:num->A->real) i (x:A) pow 2) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]; + MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + (* E[Xi^2*1_small] <= eps2^2 * sn2 *) + SUBGOAL_THEN `expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) <= eps2 * sqrt((sn2:num->real) n) then &1 else &0)) <= + eps2 pow 2 * sn2 n` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p + (\x:A. (eps2 * sqrt((sn2:num->real) n)) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. (X:num->A->real) i x pow 2` THEN + ASM_REWRITE_TAC[ETA_AX] THEN (CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC RANDOM_VARIABLE_INDICATOR_LE THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((X:num->A->real) i (x:A) pow 2) * &1` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ( CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC]) THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + (COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_POW2_ABS_LE THEN ASM_REWRITE_TAC[]; ALL_TAC]) THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_POW_2]]; + REWRITE_TAC[EXPECTATION_CONST; REAL_POW_MUL] THEN + SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + REAL_ARITH_TAC]; ALL_TAC] THEN + ((* E[Xi^2*1_big]/sn2 <= |sum/sn2| *) + SUBGOAL_THEN + `expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs (X i x) > eps2 * sqrt ((sn2:num->real) n) + then &1 else &0)) / sn2 n <= + abs(sum(0..n) (\i'. expectation p + (\x:A. (X:num->A->real) i' x pow 2 * + (if abs(X i' x) > eps2 * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n)` ASSUME_TAC THENL + [REWRITE_TAC[real_div; REAL_ABS_MUL] THEN + SUBGOAL_THEN `abs(inv((sn2:num->real) n)) = inv(sn2 n)` + SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + MATCH_MP_TAC REAL_LE_INV THEN + ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN (CONJ_TAC THENL + [ALL_TAC; MATCH_MP_TAC REAL_LE_INV THEN + ASM_MESON_TAC[REAL_LT_IMP_LE]]) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> x <= abs y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i'. expectation p + (\x:A. (X:num->A->real) i' x pow 2 * + (if abs(X i' x) > eps2 * sqrt((sn2:num->real) n) + then &1 else &0)))` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`\i'. expectation (p:A prob_space) + (\x:A. (X:num->A->real) i' x pow 2 * + (if abs(X i' x) > eps2 * sqrt((sn2:num->real) n) + then &1 else &0))`; `0..n`; `i:num`] + SUM_DELETE) THEN + REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN + (ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC]) THEN BETA_TAC THEN + DISCH_THEN(SUBST1_TAC o + MATCH_MP REAL_EQ_SUB_RADD) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= s ==> x <= x + s`) THEN + MATCH_MP_TAC SUM_POS_LE THEN + REWRITE_TAC[FINITE_DELETE; FINITE_NUMSEG] THEN + GEN_TAC THEN STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; + REAL_ARITH_TAC]]; ALL_TAC]) THEN + GEN_REWRITE_TAC LAND_CONV [real_div] THEN + REWRITE_TAC[REAL_ADD_RDISTRIB; GSYM real_div] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN ASM_MESON_TAC[]; + ASM_MESON_TAC[]]; ALL_TAC]) THEN + (* ci = t^2 * sigma_i^2/(2*sn2) < t^2 * inv(2t^2+2) *) + (* = t^2/(4t^2+4) <= 1/4 <= 1/2 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `t pow 2 / (&4 * t pow 2 + &4)` THEN + (CONJ_TAC THENL + [(* t^2 * E[Xi^2]/(2*sn2) <= t^2/(4t^2+4) *) + SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN + SUBGOAL_THEN `t pow 2 * expectation p + (\x:A. (X:num->A->real) i x pow 2) / (&2 * (sn2:num->real) n) = + t pow 2 * (expectation p (\x. X i x pow 2) / sn2 n) / &2` + SUBST1_TAC THENL + [UNDISCH_TAC `~((sn2:num->real) n = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_INV_MUL; GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * inv (&4 * t pow 2 + &4) * inv(&2)` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_MUL_ASSOC] THEN MATCH_MP_TAC REAL_LE_RMUL THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_MESON_TAC[real_div]; + MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]; + MATCH_MP_TAC(REAL_ARITH `x = y ==> x <= y`) THEN + CONV_TAC REAL_RING]; + (* t^2/(4t^2+4) <= 1/2 *) + ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN + MP_TAC(SPEC `t:real` REAL_LE_POW_2) THEN REAL_ARITH_TAC]); + ALL_TAC]) THEN + (* Take N = max(N1, N2) *) + EXISTS_TAC `MAX N1 N2` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (SUBGOAL_THEN `N1 <= n /\ N2 <= (n:num)` STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC]) THEN + ((* Key bound: abs(Ln eps n) < delta *) + SUBGOAL_THEN `abs((Ln:real->num->real) eps n) < + eta / (&5 * (t pow 2 + t pow 4 + &1))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(fun th -> + if free_in `Ln:real->num->real` (concl th) + then MP_TAC(SPEC `n:num` th) + else FAIL_TAC "") THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < eta / (&5 * (t pow 2 + t pow 4 + &1))` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]]; ALL_TAC]) THEN + (* Abbreviate s = t/sqrt(sn2 n) and d = eps * sqrt(sn2 n) *) + ABBREV_TAC `s = t / sqrt((sn2:num->real) n)` THEN + ABBREV_TAC `d = eps * sqrt((sn2:num->real) n)` THEN + (SUBGOAL_THEN `&0 <= (d:real)` ASSUME_TAC THENL + [EXPAND_TAC "d" THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (* Abbreviate c_i = t^2 * sigma_i^2 / (2 * sn2) *) + ABBREV_TAC `ci = \i:num. t pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / + (&2 * (sn2:num->real) n)` THEN + ((* sum c_i = t^2/2 *) + SUBGOAL_THEN `sum(0..n) (ci:num->real) = t pow 2 / &2` + ASSUME_TAC THENL + [EXPAND_TAC "ci" THEN BETA_TAC THEN + REWRITE_TAC[real_div] THEN + (SUBGOAL_THEN `!i. t pow 2 * expectation p + (\x:A. (X:num->A->real) i x pow 2) * inv(&2 * (sn2:num->real) n) = + (t pow 2 * inv(&2 * sn2 n)) * expectation p (\x. X i x pow 2)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2)) = (sn2:num->real) n` + SUBST1_TAC THENL + [EXPAND_TAC "sn2" THEN REFL_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `~(&2 * (sn2:num->real) n = &0)` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&2 * x = &0)`) THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + UNDISCH_TAC `~(&2 * (sn2:num->real) n = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + ((* 0 <= c_i *) + SUBGOAL_THEN `!i:num. &0 <= (ci:num->real) i` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "ci" THEN BETA_TAC THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[ETA_AX] THEN + SIMP_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LE_INV THEN + MATCH_MP_TAC(REAL_ARITH `&0 < x ==> &0 <= &2 * x`) THEN + ASM_REWRITE_TAC[ETA_AX]]]; ALL_TAC]) THEN + ((* c_i <= 1/2 for i <= n (from N2 bound) *) + SUBGOAL_THEN `!i:num. i <= n ==> (ci:num->real) i <= &1 / &2` + ASSUME_TAC THENL + [EXPAND_TAC "ci" THEN BETA_TAC THEN ASM_MESON_TAC[]; ALL_TAC]) THEN + ((* c_i <= 1 for i <= n *) + SUBGOAL_THEN `!i:num. i <= n ==> (ci:num->real) i <= &1` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&1 / &2` THEN + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + ((* [A]: |char_fn_re(Y_n, t) - prod r_i| <= sum |s_i| *) + SUBGOAL_THEN + `abs(char_fn_re p (\a:A. sum(0..n) (\i. (X:num->A->real) i a)) + (t / sqrt((sn2:num->real) n)) - + product(0..n) (\i. char_fn_re p (X i) (t / sqrt(sn2 n)))) + <= sum(0..n) (\i. abs(char_fn_im p (X i) (t / sqrt(sn2 n))))` + ASSUME_TAC THENL + [MATCH_MP_TAC CHAR_FN_SUM_RE_PRODUCT_BOUND THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + ((* [B]: |prod r_i - prod(1-c_i)| <= sum |r_i - (1-c_i)| *) + SUBGOAL_THEN + `abs(product(0..n) (\i. char_fn_re p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n))) - + product(0..n) (\i. &1 - (ci:num->real) i)) + <= sum(0..n) (\i. abs(char_fn_re p (X i) (t / sqrt(sn2 n)) - + (&1 - ci i)))` + ASSUME_TAC THENL + [MATCH_MP_TAC PRODUCT_DIFF_SUM_BOUND THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC CHAR_FN_RE_BOUND THEN ASM_REWRITE_TAC[ETA_AX]; + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_BOUNDS] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 <= c /\ c <= &1 ==> + -- &1 <= &1 - c /\ &1 - c <= &1`]]; ALL_TAC]) THEN + ((* [C]: |prod(1-c_i) - exp(-t^2/2)| by squeeze *) + SUBGOAL_THEN + `abs(product(0..n) (\i. &1 - (ci:num->real) i) - + exp(--(t pow 2 / &2))) < eta / &5` + ASSUME_TAC THENL + [(SUBGOAL_THEN + `product(0..n) (\i. &1 - (ci:num->real) i) <= + exp(--(sum(0..n) ci))` + ASSUME_TAC THENL + [MATCH_MP_TAC PRODUCT_1_MINUS_LE_EXP THEN + GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[]; ALL_TAC]) THEN + SUBGOAL_THEN + `exp(--(sum(0..n) (ci:num->real) / (&1 - &1 / &2))) <= + product(0..n) (\i. &1 - ci i)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXP_LE_PRODUCT_1_MINUS THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + ASM_REWRITE_TAC[ETA_AX] THEN + (SUBGOAL_THEN `sum(0..n) (ci:num->real) / (&1 - &1 / &2) = + t pow 2` SUBST1_TAC THENL + [ASM_REWRITE_TAC[ETA_AX] THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + ((* prod(1-c_i) is between exp(-t^2) and exp(-t^2/2) *) + (* so |prod - exp(-t^2/2)| = exp(-t^2/2) - prod <= exp(-t^2/2) - exp(-t^2) *) + SUBGOAL_THEN + `exp(--(t pow 2)) <= + product(0..n) (\i. &1 - (ci:num->real) i) /\ + product(0..n) (\i. &1 - ci i) <= exp(--(t pow 2 / &2))` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [UNDISCH_TAC `exp (--(sum (0..n) (ci:num->real) / (&1 - &1 / &2))) <= + product (0..n) (\i. &1 - ci i)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `a = b ==> a <= p ==> b <= p`) THEN + AP_TERM_TAC THEN AP_TERM_TAC THEN CONV_TAC REAL_FIELD; + UNDISCH_TAC `product (0..n) (\i. &1 - (ci:num->real) i) <= + exp (--sum (0..n) ci)` THEN + ASM_REWRITE_TAC[]]; ALL_TAC]) THEN + (* Two cases based on eta *) + (ASM_CASES_TAC `&2 <= eta` THENL + [(* Case eta >= 2: gap <= u(1-u) <= 1/4 < eta/5 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `exp(--(t pow 2 / &2)) - exp(--(t pow 2))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `el <= p /\ p <= eh ==> abs(p - eh) <= eh - el`) THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + SUBGOAL_THEN `exp(--(t pow 2)) = exp(--(t pow 2 / &2)) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_EXP_N] THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ABBREV_TAC `u = exp(--(t pow 2 / &2))` THEN + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&1 / &4` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `u * (&1 - u) <= &1 / &4 ==> u - u pow 2 <= &1 / &4`) THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= (u - &1 / &2) pow 2 ==> u * (&1 - u) <= &1 / &4`) THEN + REWRITE_TAC[REAL_LE_POW_2]; + LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + ((* Case eta < 2: tighter squeeze via Lindeberg *) + (* Convert abs(p - eh) to eh - p since p <= eh *) + MATCH_MP_TAC(REAL_ARITH + `p <= eh /\ eh - p < e ==> abs(p - eh) < e`) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + (* Step 1: Bound each ci tightly *) + SUBGOAL_THEN `!i:num. i <= n ==> (ci:num->real) i <= + t pow 2 * (eps pow 2 + abs((Ln:real->num->real) eps n)) / &2` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + EXPAND_TAC "ci" THEN BETA_TAC THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `t pow 2 * + ((eps pow 2 + abs((Ln:real->num->real) eps n)) * + (sn2:num->real) n) * inv(&2 * sn2 n)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN (CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + W(fun (_,w) -> + let l = rand(rator w) in + let r = rand w in + let x = rand(rator l) in + let z = rand l in + let y = rand(rator r) in + MP_TAC(SPECL [x; y; z] REAL_LE_RMUL)) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [ALL_TAC; + ASM_MESON_TAC[REAL_LE_INV; REAL_LT_IMP_LE; + REAL_ARITH `&0 < x ==> &0 <= &2 * x`]]; + DISCH_THEN(fun th -> REWRITE_TAC[th])] THEN + ((* E[Xi^2] <= (eps^2 + |Ln|) * sn2 *) + SUBGOAL_THEN `expectation p (\x:A. (X:num->A->real) i x pow 2) = + expectation p (\x. X i x pow 2 * + (if abs(X i x) <= eps * sqrt((sn2:num->real) n) + then &1 else &0)) + + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) + then &1 else &0))` SUBST1_TAC THENL + [(SUBGOAL_THEN `(\x:A. (X:num->A->real) i x pow 2) = + (\x. X i x pow 2 * + (if abs(X i x) <= eps * sqrt((sn2:num->real) n) + then &1 else &0) + + X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) + then &1 else &0))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN BETA_TAC THEN + REWRITE_TAC[real_gt] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2_LE THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + REWRITE_TAC[REAL_ADD_RDISTRIB] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [(* E[Xi^2 * I_small] <= eps^2 * sn2 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p + (\x:A. (eps * sqrt((sn2:num->real) n)) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2_LE THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC;( + CONJ_TAC THENL [REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC]) THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_POW2_ABS_LE THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_POW_2]]]; + REWRITE_TAC[EXPECTATION_CONST; REAL_POW_MUL] THEN + SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + REAL_ARITH_TAC]; + (* E[Xi^2 * I_big] <= |Ln|*sn2 n *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\j. expectation (p:A prob_space) + (\x:A. (X:num->A->real) j x pow 2 * + (if abs(X j x) > eps * sqrt((sn2:num->real) n) + then &1 else &0)))` THEN + CONJ_TAC THENL + [(* E_big_i <= sum(0..n) E_j_big *) + MP_TAC(ISPECL [`\j. expectation (p:A prob_space) + (\x:A. (X:num->A->real) j x pow 2 * + (if abs(X j x) > eps * sqrt((sn2:num->real) n) + then &1 else &0))`; `0..n`; `i:num`] SUM_DELETE) THEN + REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN + (ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC]) THEN BETA_TAC THEN + DISCH_THEN(SUBST1_TAC o + MATCH_MP REAL_EQ_SUB_RADD) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= s ==> x <= x + s`) THEN + MATCH_MP_TAC SUM_POS_LE THEN + REWRITE_TAC[FINITE_DELETE; FINITE_NUMSEG] THEN + GEN_TAC THEN STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; + (* sum(0..n) E_j_big <= |Ln|*sn2 n *) + EXPAND_TAC "Ln" THEN BETA_TAC THEN + (SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 <= sum(0..n) (\j. expectation p + (\x:A. (X:num->A->real) j x pow 2 * + (if abs(X j x) > eps * sqrt((sn2:num->real) n) + then &1 else &0)))` ASSUME_TAC THENL + [MATCH_MP_TAC SUM_POS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 <= sum(0..n) (\j. expectation p + (\x:A. (X:num->A->real) j x pow 2 * + (if abs(X j x) > eps * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + DISCH_THEN(SUBST1_TAC o MATCH_MP(REAL_ARITH + `&0 <= x ==> abs x = x`)) THEN + MATCH_MP_TAC(REAL_ARITH `x = y ==> x <= y`) THEN + UNDISCH_TAC `~((sn2:num->real) n = &0)` THEN + CONV_TAC REAL_FIELD]]; + (* C2: (eps^2+|Ln|)*sn2*inv(2*sn2) = (eps^2+|Ln|)*inv(2) *) + MATCH_MP_TAC(REAL_ARITH `x = y ==> x <= y`) THEN + (SUBGOAL_THEN `~(&2 * (sn2:num->real) n = &0)` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&2 * x = &0)`) THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + UNDISCH_TAC `~(&2 * (sn2:num->real) n = &0)` THEN + UNDISCH_TAC `~((sn2:num->real) n = &0)` THEN + CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + (* Step 2: Let delta' = t^2*(eps^2+|Ln|)/2 *) + ABBREV_TAC `delta' = t pow 2 * + (eps pow 2 + abs((Ln:real->num->real) eps n)) / &2` THEN + SUBGOAL_THEN `&0 <= delta'` ASSUME_TAC THENL + [EXPAND_TAC "delta'" THEN MATCH_MP_TAC REAL_LE_MUL THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD THEN + REWRITE_TAC[REAL_LE_POW_2; REAL_ABS_POS]; + REAL_ARITH_TAC]]; ALL_TAC] THEN + ((* Step 3: Show delta' < 1/2 *) + SUBGOAL_THEN `delta' < &1 / &2` ASSUME_TAC THENL + [EXPAND_TAC "delta'" THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `eta / &5` THEN + CONJ_TAC THENL [ALL_TAC; LOCAL_ASM_REAL_ARITH_TAC] THEN + (* Bound eps^2 by eps *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * (eps + abs((Ln:real->num->real) eps n)) / &2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> a + c <= b + c`) THEN + REWRITE_TAC[REAL_POW_2] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + ALL_TAC] THEN + (* Split into t^2*eps/2 + t^2*|Ln|/2 *) + SUBGOAL_THEN `t pow 2 * (eps + + abs((Ln:real->num->real) eps n)) / &2 = + t pow 2 * eps / &2 + + t pow 2 * abs((Ln:real->num->real) eps n) / &2` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `eta / &5 = eta / &10 + eta / &10` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_ADD2 THEN CONJ_TAC THENL + [(* t^2 * eps / 2 < eta/10 *) + (SUBGOAL_THEN + `eps <= eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1))` + ASSUME_TAC THENL + [EXPAND_TAC "eps" THEN REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * + (eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1))) / &2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (SUBGOAL_THEN `&0 < abs(t:real) pow 3 + t pow 4 + &1` + ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]]; ALL_TAC]) THEN + SUBGOAL_THEN + `t pow 2 * eta / + (&5 * (abs(t:real) pow 3 + t pow 4 + &1)) / &2 = + (eta / &10) * + (t pow 2 / (abs t pow 3 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `&0 < abs(t:real) pow 3 + t pow 4 + &1` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + SUBGOAL_THEN `t pow 2 = abs(t:real) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW2_ABS]; ALL_TAC] THEN + ASM_CASES_TAC `&1 <= abs(t:real)` THENL + [MATCH_MP_TAC(REAL_ARITH + `a <= b /\ &0 <= c ==> a < b + c + &1`) THEN + CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `3 = SUC 2`; real_pow] THEN + GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[REAL_LE_POW_2]]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]]; + MATCH_MP_TAC(REAL_ARITH + `a < &1 /\ &0 <= b /\ &0 <= c ==> a < b + c + &1`) THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_1_LT THEN + REWRITE_TAC[REAL_ABS_POS; ARITH_RULE `~(2 = 0)`] THEN + LOCAL_ASM_REAL_ARITH_TAC; + SIMP_TAC[REAL_POW_LE; REAL_ABS_POS]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]]]; + (* t^2 * |Ln| / 2 <= eta/10 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `t pow 2 * + (eta / (&5 * (t pow 2 + t pow 4 + &1))) / &2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (SUBGOAL_THEN `&0 < t pow 2 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]]; ALL_TAC]) THEN + SUBGOAL_THEN + `t pow 2 * eta / + (&5 * (t pow 2 + t pow 4 + &1)) / &2 = + (eta / &10) * + (t pow 2 / (t pow 2 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `&0 < t pow 2 + t pow 4 + &1` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + SUBGOAL_THEN + `t pow 2 / (t pow 2 + t pow 4 + &1) <= &1` + ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LE_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> b <= b + a + &1`) THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `eta / &10 * &1` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ASM_REWRITE_TAC[]]; + REAL_ARITH_TAC]]; ALL_TAC]) THEN + ((* Step 4: Apply EXP_LE_PRODUCT_1_MINUS with delta' *) + SUBGOAL_THEN `exp(--(sum(0..n) (ci:num->real) / (&1 - delta'))) <= + product(0..n) (\i. &1 - ci i)` ASSUME_TAC THENL + [MATCH_MP_TAC EXP_LE_PRODUCT_1_MINUS THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `delta':real` THEN + ASM_SIMP_TAC[]; + LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + ((* Simplify: sum/(1-delta') = t^2/(2*(1-delta')) *) + SUBGOAL_THEN `sum(0..n) (ci:num->real) / (&1 - delta') = + t pow 2 / (&2 * (&1 - delta'))` SUBST_ALL_TAC THENL + [ASM_REWRITE_TAC[ETA_AX] THEN + SUBGOAL_THEN `~(&1 - delta' = &0)` MP_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + (* Transit: use product >= exp(-t^2/(2(1-d'))) *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `exp(--(t pow 2 / &2)) - + exp(--(t pow 2 / (&2 * (&1 - delta'))))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= p ==> e - p <= e - a`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 5: Bound exp(-t^2/2)-exp(-t^2/(2(1-d'))) via EXP_DIFF_LE *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `(t:real) pow 2 * (delta':real)` THEN + (CONJ_TAC THENL + [(* exp(-t^2/2) - exp(-t^2/(2(1-d'))) <= t^2*d' *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `t pow 2 / (&2 * (&1 - delta')) - t pow 2 / &2` THEN + (CONJ_TAC THENL + [(* exp(-a) - exp(-b) <= b - a *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `exp(--(t pow 2 / &2)) * + (t pow 2 / (&2 * (&1 - delta')) - t pow 2 / &2)` THEN + (CONJ_TAC THENL + [(SUBGOAL_THEN `exp(--(t pow 2 / (&2 * (&1 - delta')))) = + exp(--((t pow 2 / &2) + + (t pow 2 / (&2 * (&1 - delta')) - t pow 2 / &2)))` + SUBST1_TAC THENL + [AP_TERM_TAC THEN SUBGOAL_THEN `~(&1 - delta' = &0)` MP_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + MP_TAC(SPECL [`t pow 2 / &2`; + `t pow 2 / (&2 * (&1 - delta')) - t pow 2 / &2`] + EXP_DIFF_LE) THEN + REWRITE_TAC[]; ALL_TAC]) THEN + (* exp(-t^2/2) * y <= 1 * y *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&1 * (t pow 2 / (&2 * (&1 - delta')) - + t pow 2 / &2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_EXP_0; REAL_EXP_MONO_LE] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> --(x / &2) <= &0`) THEN + REWRITE_TAC[REAL_LE_POW_2]; + (SUBGOAL_THEN `t pow 2 / &2 <= + t pow 2 / (&2 * (&1 - delta'))` MP_TAC THENL + [REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + REAL_ARITH_TAC]; REAL_ARITH_TAC]; ALL_TAC]) THEN + ((* t^2/(2(1-d))-t^2/2 = t^2*d/(2(1-d)) <= t^2*d *) + SUBGOAL_THEN `~(&1 - delta' = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `t pow 2 / (&2 * (&1 - delta')) - t pow 2 / &2 = + t pow 2 * delta' / (&2 * (&1 - delta'))` SUBST1_TAC THENL + [UNDISCH_TAC `~(&1 - delta' = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN (CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [EXPAND_TAC "delta'" THEN MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_LE_POW_2] THEN MATCH_MP_TAC REAL_LE_DIV THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD THEN + REWRITE_TAC[REAL_LE_POW_2; REAL_ABS_POS]; + REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_INV_LE_1 THEN LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + (* Step 6: t^2*delta' = t^4*(eps^2+|Ln|)/2 < eta/4 *) + EXPAND_TAC "delta'" THEN + (SUBGOAL_THEN `t pow 2 * (t pow 2 * + (eps pow 2 + abs((Ln:real->num->real) eps n)) / &2) = + t pow 4 * eps pow 2 / &2 + + t pow 4 * abs(Ln eps n) / &2` + SUBST1_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 + 2`; REAL_POW_ADD] THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `eta / &5 = &2 * (eta / &10)` SUBST1_TAC THENL + [CONV_TAC REAL_FIELD; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `a < e /\ b < e ==> a + b < &2 * e`) THEN + (CONJ_TAC THENL + [(* t^4*eps^2/2 < eta/8 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 4 * eps / &2` THEN (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN (CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]; ALL_TAC]) THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN (CONJ_TAC THENL + [ALL_TAC; MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC]) THEN + REWRITE_TAC[ARITH_RULE `2 = 1 + 1`; REAL_POW_ADD; REAL_POW_1] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 4 * + eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1)) / &2` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN (CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]; ALL_TAC]) THEN + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + EXPAND_TAC "eps" THEN REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < abs(t:real) pow 3 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]; ALL_TAC]) THEN + (SUBGOAL_THEN `~(abs(t:real) pow 3 + t pow 4 + &1 = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `t pow 4 * + eta / (&5 * (abs(t:real) pow 3 + t pow 4 + &1)) / &2 = + (eta / &10) * (t pow 4 / (abs t pow 3 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `~(abs(t:real) pow 3 + t pow 4 + &1 = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a < b + a + &1`) THEN + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC]; + (* t^4*|Ln|/2 < eta/8 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 4 * + eta / (&5 * (t pow 2 + t pow 4 + &1)) / &2` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN (CONJ_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]; ALL_TAC]) THEN + SIMP_TAC[REAL_LE_DIV2_EQ; REAL_ARITH `&0 < &2`] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < t pow 2 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THEN REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; + GSYM REAL_POW_POW; REAL_LE_POW_2]; ALL_TAC]) THEN + (SUBGOAL_THEN `~(t pow 2 + t pow 4 + &1 = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `t pow 4 * + eta / (&5 * (t pow 2 + t pow 4 + &1)) / &2 = + (eta / &10) * (t pow 4 / (t pow 2 + t pow 4 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `~(t pow 2 + t pow 4 + &1 = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a < b + a + &1`) THEN + REWRITE_TAC[REAL_LE_POW_2]]]); + ALL_TAC]) THEN + (* Bound sum |s_i| *) + SUBGOAL_THEN + `sum(0..n) (\i. abs(char_fn_im p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n)))) < eta / &5 + eta / &5` + ASSUME_TAC THENL + [(* Gap 2: sum |char_fn_im(Xi, s)| < eta/4 + eta/4 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. + abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2 + + (t / sqrt(sn2 n)) pow 2 * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0)))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN + BETA_TAC THEN + MATCH_MP_TAC CHAR_FN_IM_COMPONENT_BOUND THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC SQRT_POS_LE THEN LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + REWRITE_TAC[SUM_ADD_NUMSEG] THEN + (SUBGOAL_THEN `sum(0..n) (\i. + abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2) = + abs t pow 3 * eps / &2` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2 = + (abs(t / sqrt(sn2 n)) pow 3 * (eps * sqrt(sn2 n)) / &2) * + expectation p (\x. X i x pow 2)` (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2)) = (sn2:num->real) n` + SUBST1_TAC THENL + [EXPAND_TAC "sn2" THEN REFL_TAC; ALL_TAC]) THEN + MP_TAC(SPECL [`t:real`; `sqrt((sn2:num->real) n)`; `eps:real`] + (prove(`!t c e. &0 < c ==> + abs(t / c) pow 3 * e * c * c pow 2 / &2 = + abs(t) pow 3 * e / &2`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_DIV; REAL_POW_DIV] THEN + (SUBGOAL_THEN `abs c = c` SUBST1_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `~(c = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `~(c pow 3 = &0)` MP_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0] THEN ASM_ARITH_TAC; + CONV_TAC REAL_FIELD]))) THEN + ASM_REWRITE_TAC[ETA_AX] THEN DISCH_TAC THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + ASM_REWRITE_TAC[ETA_AX] THEN + EXPAND_TAC "s" THEN EXPAND_TAC "d" THEN + REWRITE_TAC[REAL_ABS_DIV; REAL_POW_DIV] THEN + (SUBGOAL_THEN `abs(sqrt((sn2:num->real) n)) = sqrt(sn2 n)` + SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + MATCH_MP_TAC SQRT_POS_LE THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` MP_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `~(sqrt((sn2:num->real) n) = &0)` MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC]) THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + (SUBGOAL_THEN `sum(0..n) (\i. + (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0))) = + t pow 2 * (sum(0..n) (\i. expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) + then &1 else &0))) / sn2 n)` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0)) = + (t pow 2 / (sn2 n)) * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_POW_DIV] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + REFL_TAC; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + UNDISCH_TAC `~((sn2:num->real) n = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + (SUBGOAL_THEN `sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n = (Ln:real->num->real) eps n` + SUBST1_TAC THENL + [EXPAND_TAC "Ln" THEN BETA_TAC THEN REFL_TAC; ALL_TAC]) THEN + MATCH_MP_TAC(REAL_ARITH + `a < e /\ &0 <= b /\ b < e ==> a + b < e + e`) THEN + ASM_REWRITE_TAC[ETA_AX] THEN (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + EXPAND_TAC "Ln" THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + LOCAL_ASM_REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * abs((Ln:real->num->real) eps n)` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * eta / (&5 * (t pow 2 + t pow 4 + &1))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < t pow 2 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]; ALL_TAC]) THEN + (SUBGOAL_THEN `~(t pow 2 + t pow 4 + &1 = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `t pow 2 * eta / (&5 * (t pow 2 + t pow 4 + &1)) = + (eta / &5) * (t pow 2 / (t pow 2 + t pow 4 + &1))` SUBST1_TAC THENL + [UNDISCH_TAC `~(t pow 2 + t pow 4 + &1 = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a < a + b + &1`) THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; + REAL_LE_POW_2]]; + ALL_TAC] THEN + (* Bound sum |r_i - (1-c_i)| *) + SUBGOAL_THEN + `sum(0..n) (\i. abs(char_fn_re p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n)) - (&1 - (ci:num->real) i))) < + eta / &5 + eta / &5` + ASSUME_TAC THENL + [((* Gap 3 proof: sum |char_fn_re(X_i, s) - (1 - ci i)| < eta/4 + eta/4 *) + (* Step 1: Remove abs by showing char_fn_re >= 1 - ci *) + SUBGOAL_THEN `!i:num. i <= n ==> + abs(char_fn_re p ((X:num->A->real) i) (t / sqrt((sn2:num->real) n)) - + (&1 - (ci:num->real) i)) = + char_fn_re p (X i) (t / sqrt(sn2 n)) - (&1 - ci i)` ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x - y ==> abs(x - y) = x - y`) THEN + ((* char_fn_re >= 1 - s^2*E[X^2]/2 = 1 - ci *) + SUBGOAL_THEN `&1 - (ci:num->real) i = + &1 - (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2` SUBST1_TAC THENL + [EXPAND_TAC "ci" THEN BETA_TAC THEN + REWRITE_TAC[REAL_POW_DIV] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + SUBGOAL_THEN `~(&2 * (sn2:num->real) n = &0)` MP_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&2 * x = &0)`) THEN + ASM_REWRITE_TAC[ETA_AX]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + REWRITE_TAC[char_fn_re] THEN + SUBGOAL_THEN `&1 - (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2 = + expectation p (\x. &1 - (t / sqrt(sn2 n)) pow 2 * X i x pow 2 / &2)` + SUBST1_TAC THENL + [(SUBGOAL_THEN `expectation p (\x:A. &1 - (t / sqrt((sn2:num->real) n)) pow 2 * + (X:num->A->real) i x pow 2 / &2) = + expectation p (\x. &1) - (t / sqrt(sn2 n)) pow 2 / &2 * + expectation p (\x. X i x pow 2)` SUBST1_TAC THENL + [SUBGOAL_THEN `(\x:A. &1 - (t / sqrt((sn2:num->real) n)) pow 2 * + (X:num->A->real) i x pow 2 / &2) = + (\x. (\x. &1) x + (-- ((t / sqrt(sn2 n)) pow 2 / &2)) * (\x. X i x pow 2) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN BETA_TAC THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[EXPECTATION_ADD; INTEGRABLE_CONST; INTEGRABLE_CMUL; + EXPECTATION_CMUL]]; ALL_TAC]) THEN + REWRITE_TAC[EXPECTATION_CONST; PROB_SPACE] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Now show E[cos(s*Xi)] - E[1 - s^2*Xi^2/2] >= 0 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&0` THEN + (CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `expectation p (\x:A. cos((t / sqrt((sn2:num->real) n)) * + (X:num->A->real) i x)) - + expectation p (\x. &1 - (t / sqrt(sn2 n)) pow 2 * X i x pow 2 / &2) = + expectation p (\x. cos((t / sqrt(sn2 n)) * X i x) - + (&1 - (t / sqrt(sn2 n)) pow 2 * X i x pow 2 / &2))` + SUBST1_TAC THENL + [ + MATCH_MP_TAC(GSYM EXPECTATION_SUB) THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[real_div] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[ETA_AX]]]; ALL_TAC]) THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_COS_CMUL THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN REWRITE_TAC[real_div] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[ETA_AX]]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MP_TAC(SPEC `(t / sqrt((sn2:num->real) n)) * (X:num->A->real) i x` + COS_LOWER_BOUND) THEN + REWRITE_TAC[REAL_POW_MUL] THEN REAL_ARITH_TAC]; ALL_TAC]) THEN + ((* Step 2: Replace abs with value and bound via CHAR_FN_RE_COMPONENT_BOUND *) + SUBGOAL_THEN `sum(0..n) (\i. abs(char_fn_re p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n)) - (&1 - (ci:num->real) i))) = + sum(0..n) (\i. char_fn_re p (X i) (t / sqrt(sn2 n)) - (&1 - ci i))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN + BETA_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC]) THEN + (* Upper bound via CHAR_FN_RE_COMPONENT_BOUND *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. + (t / sqrt((sn2:num->real) n)) pow 4 * + (eps * sqrt(sn2 n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &6 + + (t / sqrt(sn2 n)) pow 2 / &2 * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0)))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN + BETA_TAC THEN + ((* Show ci = s^2*E[Xi^2]/2 *) + SUBGOAL_THEN `char_fn_re p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n)) - (&1 - (ci:num->real) i) = + char_fn_re p (X i) (t / sqrt(sn2 n)) - + (&1 - (t / sqrt(sn2 n)) pow 2 * + expectation p (\x:A. X i x pow 2) / &2)` SUBST1_TAC THENL + [AP_TERM_TAC THEN AP_TERM_TAC THEN EXPAND_TAC "ci" THEN BETA_TAC THEN + REWRITE_TAC[REAL_POW_DIV] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + SUBGOAL_THEN `~(&2 * (sn2:num->real) n = &0)` MP_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < x ==> ~(&2 * x = &0)`) THEN + ASM_REWRITE_TAC[ETA_AX]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + MATCH_MP_TAC CHAR_FN_RE_COMPONENT_BOUND THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC SQRT_POS_LE THEN LOCAL_ASM_REAL_ARITH_TAC]; ALL_TAC]) THEN + (* Step 3: Split and simplify sums *) + REWRITE_TAC[SUM_ADD_NUMSEG] THEN + ((* First sum: s^4*d^2*E[Xi^2]/6 summed = t^4*eps^2/6 *) + SUBGOAL_THEN `sum(0..n) (\i. + (t / sqrt((sn2:num->real) n)) pow 4 * + (eps * sqrt(sn2 n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &6) = + t pow 4 * eps pow 2 / &6` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. (t / sqrt((sn2:num->real) n)) pow 4 * + (eps * sqrt(sn2 n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &6 = + (t pow 4 * eps pow 2 / (&6 * sn2 n)) * + expectation p (\x. X i x pow 2)` (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_POW_DIV; REAL_POW_MUL] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 4 = sn2 n pow 2` + SUBST1_TAC THENL + [(SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 4 = + (sqrt(sn2 n) pow 2) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW]; ALL_TAC]) THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + SUBGOAL_THEN `~((sn2:num->real) n = &0)` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2)) = (sn2:num->real) n` + SUBST1_TAC THENL + [EXPAND_TAC "sn2" THEN REFL_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `~((sn2:num->real) n = &0)` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + ((* Second sum: s^2/2 * E[Xi^2*I] summed = t^2/2 * Ln *) + SUBGOAL_THEN `sum(0..n) (\i. + (t / sqrt((sn2:num->real) n)) pow 2 / &2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0))) = + t pow 2 / &2 * (sum(0..n) (\i. expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) + then &1 else &0))) / sn2 n)` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. (t / sqrt((sn2:num->real) n)) pow 2 / &2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0)) = + (t pow 2 / (&2 * sn2 n)) * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps * sqrt(sn2 n) then &1 else &0))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_POW_DIV] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + SUBGOAL_THEN `~((sn2:num->real) n = &0)` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + SUBGOAL_THEN `~((sn2:num->real) n = &0)` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; CONV_TAC REAL_FIELD]; ALL_TAC]) THEN + ((* Step 4: Connect with Ln and bound *) + SUBGOAL_THEN `sum(0..n) (\i. expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n = (Ln:real->num->real) eps n` + SUBST1_TAC THENL + [EXPAND_TAC "Ln" THEN BETA_TAC THEN REFL_TAC; ALL_TAC]) THEN + (* Now goal: t^4*eps^2/6 + t^2/2*Ln < eta/4 + eta/4 *) + MATCH_MP_TAC(REAL_ARITH + `a < e /\ &0 <= b /\ b < e ==> a + b < e + e`) THEN + ASM_REWRITE_TAC[ETA_AX] THEN (CONJ_TAC THENL + [(* 0 <= t^2/2 * Ln *) + MATCH_MP_TAC REAL_LE_MUL THEN (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + EXPAND_TAC "Ln" THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR_WEIGHTED_POW2 THEN + ASM_REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN MATCH_MP_TAC SQRT_POS_LE THEN + ASM_MESON_TAC[REAL_LT_IMP_LE]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; + ASM_MESON_TAC[REAL_LT_IMP_LE]]; ALL_TAC]) THEN + (* t^2/2 * Ln < eta/4 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * abs((Ln:real->num->real) eps n)` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `t pow 2 / &2 * abs((Ln:real->num->real) eps n)` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REAL_ARITH_TAC; + REAL_ARITH_TAC]; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> a / &2 <= a`) THEN + REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * eta / (&5 * (t pow 2 + t pow 4 + &1))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (* t^2 * eta / (4*(t^2+t^4+1)) < eta/4 *) + SUBGOAL_THEN `&0 < t pow 2 + t pow 4 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 < a + b + &1`) THEN + CONJ_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; REAL_LE_POW_2]; + ALL_TAC] THEN + (SUBGOAL_THEN `~(t pow 2 + t pow 4 + &1 = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + SUBGOAL_THEN `t pow 2 * eta / (&5 * (t pow 2 + t pow 4 + &1)) = + (eta / &5) * (t pow 2 / (t pow 2 + t pow 4 + &1))` SUBST1_TAC THENL + [UNDISCH_TAC `~(t pow 2 + t pow 4 + &1 = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_RID] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [UNDISCH_TAC `&0 < eta` THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a < a + b + &1`) THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW; REAL_LE_POW_2]]; + ALL_TAC] THEN + (* Assembly: total error < eta *) + (* Expand s back to t / sqrt(sn2 n), then chain the 5 bounds *) + EXPAND_TAC "s" THEN + FIRST_X_ASSUM MP_TAC THEN (* sum re diffs < 2*eta/5 *) + FIRST_X_ASSUM MP_TAC THEN (* sum im parts < 2*eta/5 *) + FIRST_X_ASSUM MP_TAC THEN (* |prod_ci - exp| < eta/5 *) + FIRST_X_ASSUM MP_TAC THEN (* |prod_re - prod_ci| <= sum_re_diffs *) + FIRST_X_ASSUM MP_TAC THEN (* |re - prod_re| <= sum_im *) + REAL_ARITH_TAC; + (* ============================================================ *) + (* char_fn_im convergence: *) + (* char_fn_im p (Y n) t ---> &0 *) + (* Uses CHAR_FN_SUM_IM_BOUND + component bounds + Lindeberg *) + (* ============================================================ *) + X_GEN_TAC `t:real` THEN + ((* Scaling: char_fn_im p (\a. sum/sqrt(sn2)) t = + char_fn_im p (\a. sum) (t/sqrt(sn2)) *) + SUBGOAL_THEN `!n. char_fn_im p + (\a:A. sum(0..n) (\i. (X:num->A->real) i a) / + sqrt((sn2:num->real) n)) t = + char_fn_im p (\a. sum(0..n) (\i. X i a)) + (t / sqrt(sn2 n))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[char_fn_im] THEN + BETA_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN BETA_TAC THEN AP_TERM_TAC THEN + (SUBGOAL_THEN `!a b:real. a / b = inv(b) * a` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[real_div] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `eta:real` THEN DISCH_TAC THEN + ((* Handle t = 0 case *) + ASM_CASES_TAC `t = &0` THENL + [EXISTS_TAC `0` THEN GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[real_div; REAL_MUL_LZERO; char_fn_im; SIN_0; + EXPECTATION_CONST; REAL_SUB_RZERO; REAL_ABS_NUM] THEN + LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (* t != 0: use CHAR_FN_SUM_IM_BOUND + component bounds *) + (* Choose eps *) + ABBREV_TAC `eps' = min (&1) + (eta / (&2 * (abs(t:real) pow 3 + &1)))` THEN + (SUBGOAL_THEN `&0 < eps'` ASSUME_TAC THENL + [EXPAND_TAC "eps'" THEN REWRITE_TAC[REAL_LT_MIN] THEN + (CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 < a + &1`) THEN + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC]; ALL_TAC]) THEN + (SUBGOAL_THEN `eps' <= &1` ASSUME_TAC THENL + [EXPAND_TAC "eps'" THEN REAL_ARITH_TAC; ALL_TAC]) THEN + ((* |t|^3 * eps' / 2 < eta/2 *) + SUBGOAL_THEN `abs(t:real) pow 3 * eps' / &2 < eta / &2` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(t:real) pow 3 * + (eta / (&2 * (abs t pow 3 + &1))) / &2` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; + EXPAND_TAC "eps'" THEN REAL_ARITH_TAC]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < abs(t:real) pow 3 + &1` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 < a + &1`) THEN + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `~(abs(t:real) pow 3 + &1 = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `abs(t:real) pow 3 * + (eta / (&2 * (abs t pow 3 + &1))) / &2 = + eta * abs t pow 3 / (&4 * (abs t pow 3 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `~(abs(t:real) pow 3 + &1 = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + (* Goal: eta * abs t^3 / (4*(abs t^3+1)) < eta / 2 *) + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Goal: abs t^3 * inv(4*(abs t^3+1)) < inv(2) *) + SUBGOAL_THEN `inv(&2:real) = + (&2 * (abs(t:real) pow 3 + &1)) * inv(&4 * (abs t pow 3 + &1))` + SUBST1_TAC THENL + [UNDISCH_TAC `~(abs(t:real) pow 3 + &1 = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_RMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> a < &2 * (a + &1)`) THEN + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC REAL_LT_MUL THEN + CONJ_TAC THENL [REAL_ARITH_TAC; LOCAL_ASM_REAL_ARITH_TAC]]; + ALL_TAC]) THEN + ((* By Lindeberg at eps', get N *) + SUBGOAL_THEN `?N:num. !n. N <= n ==> + abs(sum(0..n) (\i. expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps' * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n) < eta / (&2 * t pow 2 + &2)` + (X_CHOOSE_THEN `N:num` ASSUME_TAC) THENL + [UNDISCH_TAC `!eps. &0 < eps ==> + ((\n. sum (0..n) (\i. expectation (p:A prob_space) + (\x. (X:num->A->real) i x pow 2 * + (if abs (X i x) > eps * sqrt (sum (0..n) + (\j. expectation p (\y. X j y pow 2))) then &1 else &0))) / + sum (0..n) (\i. expectation p (\x. X i x pow 2))) + ---> &0) sequentially` THEN + DISCH_THEN(MP_TAC o SPEC `eps':real`) THEN ASM_REWRITE_TAC[ETA_AX] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY; REAL_SUB_RZERO] THEN + DISCH_THEN(MP_TAC o SPEC `eta / (&2 * t pow 2 + &2)`) THEN + (ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 < &2 * a + &2`) THEN + REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + DISCH_THEN(X_CHOOSE_THEN `M:num` ASSUME_TAC) THEN + EXISTS_TAC `M:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[ETA_AX] THEN + EXPAND_TAC "sn2" THEN SIMP_TAC[]; ALL_TAC]) THEN + (* N works *) + EXISTS_TAC `N:num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + (* |char_fn_im(Y_n, t)| <= sum |s_i| by CHAR_FN_SUM_IM_BOUND *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs(char_fn_im p ((X:num->A->real) i) + (t / sqrt((sn2:num->real) n))))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC CHAR_FN_SUM_IM_BOUND THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (* Bound each |s_i| using CHAR_FN_IM_COMPONENT_BOUND *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. + abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps' * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2 + + (t / sqrt(sn2 n)) pow 2 * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps' * sqrt(sn2 n) then &1 else &0)))` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `i:num` THEN STRIP_TAC THEN + BETA_TAC THEN + MATCH_MP_TAC CHAR_FN_IM_COMPONENT_BOUND THEN + ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_LE]; + MATCH_MP_TAC SQRT_POS_LE THEN ASM_MESON_TAC[REAL_LT_IMP_LE]]; + ALL_TAC]) THEN + ((* Split sum and factor constants *) + SUBGOAL_THEN `!f g:num->real. + sum(0..n) (\i. f i + g i) = sum(0..n) f + sum(0..n) g` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[SUM_ADD_NUMSEG]; ALL_TAC]) THEN + ((* Factor out constants from each sum *) + SUBGOAL_THEN `sum(0..n) (\i. + abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps' * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2) = + abs t pow 3 * eps' / &2` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps' * sqrt(sn2 n)) * + expectation p (\x:A. (X:num->A->real) i x pow 2) / &2 = + (abs(t / sqrt(sn2 n)) pow 3 * (eps' * sqrt(sn2 n)) / &2) * + expectation p (\x. X i x pow 2)` (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2)) = (sn2:num->real) n` + SUBST1_TAC THENL + [EXPAND_TAC "sn2" THEN REFL_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `(abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps' * sqrt(sn2 n)) / &2) * sn2 n = abs t pow 3 * eps' / &2` + (fun th -> REWRITE_TAC[th]) THENL + [(SUBGOAL_THEN `(abs(t / sqrt((sn2:num->real) n)) pow 3 * + (eps' * sqrt(sn2 n)) / &2) * sn2 n = + abs(t / sqrt(sn2 n)) pow 3 * eps' * sqrt(sn2 n) * sn2 n / &2` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC]) THEN + MP_TAC(SPECL [`t:real`; `sqrt((sn2:num->real) n)`; `eps':real`] + (prove(`!t c e. &0 < c ==> + abs(t / c) pow 3 * e * c * c pow 2 / &2 = + abs(t) pow 3 * e / &2`, + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_DIV; REAL_POW_DIV] THEN + (SUBGOAL_THEN `abs c = c` SUBST1_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `~(c = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + SUBGOAL_THEN `~(c pow 3 = &0)` MP_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0] THEN ASM_ARITH_TAC; + CONV_TAC REAL_FIELD]))) THEN + ASM_REWRITE_TAC[ETA_AX] THEN DISCH_TAC THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + (fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; + ALL_TAC]) THEN + ASM_REWRITE_TAC[ETA_AX]]; ALL_TAC]) THEN + (SUBGOAL_THEN `sum(0..n) (\i. + (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps' * sqrt(sn2 n) then &1 else &0))) = + t pow 2 * (sum(0..n) (\i. expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps' * sqrt(sn2 n) + then &1 else &0))) / sn2 n)` + SUBST1_TAC THENL + [(SUBGOAL_THEN `!i. (t / sqrt((sn2:num->real) n)) pow 2 * + expectation p (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps' * sqrt(sn2 n) then &1 else &0)) = + (t pow 2 / (sn2 n)) * + expectation p (\x. X i x pow 2 * + (if abs(X i x) > eps' * sqrt(sn2 n) then &1 else &0))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_POW_DIV] THEN + (SUBGOAL_THEN `sqrt((sn2:num->real) n) pow 2 = sn2 n` + SUBST1_TAC THENL + [MATCH_MP_TAC SQRT_POW_2 THEN ASM_MESON_TAC[REAL_LT_IMP_LE]; ALL_TAC]) THEN + REFL_TAC; ALL_TAC]) THEN + REWRITE_TAC[SUM_LMUL] THEN + (SUBGOAL_THEN `~((sn2:num->real) n = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC]) THEN + UNDISCH_TAC `~((sn2:num->real) n = &0)` THEN + CONV_TAC REAL_FIELD; ALL_TAC]) THEN + (* Now bound: |t|^3 * eps'/2 + t^2 * Ln(eps') < eta *) + MATCH_MP_TAC(REAL_ARITH + `a < e / &2 /\ b < e / &2 ==> a + b < e`) THEN + ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ a * b < e ==> a * b < e`) THEN + (CONJ_TAC THENL [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + (SUBGOAL_THEN `abs(sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps' * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n) < + eta / (&2 * t pow 2 + &2)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `t pow 2 * abs(sum(0..n) (\i. expectation p + (\x:A. (X:num->A->real) i x pow 2 * + (if abs(X i x) > eps' * sqrt((sn2:num->real) n) + then &1 else &0))) / sn2 n)` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REAL_ARITH_TAC; ALL_TAC]) THEN + MATCH_MP_TAC REAL_LT_TRANS THEN + EXISTS_TAC `t pow 2 * eta / (&2 * t pow 2 + &2)` THEN + (CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + (SUBGOAL_THEN `&0 < t pow 2` ASSUME_TAC THENL + [REWRITE_TAC[REAL_LT_POW_2] THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC]) THEN + (SUBGOAL_THEN `&0 < &2 * t pow 2 + &2` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> &0 < &2 * a + &2`) THEN + REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC]) THEN + (SUBGOAL_THEN `~(&2 * t pow 2 + &2 = &0)` ASSUME_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC]) THEN + (SUBGOAL_THEN `t pow 2 * eta / (&2 * t pow 2 + &2) < eta / &2` + MP_TAC THENL + [(SUBGOAL_THEN `t pow 2 * eta / (&2 * t pow 2 + &2) = + eta * t pow 2 / (&2 * t pow 2 + &2)` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC]) THEN + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LT_LMUL THEN CONJ_TAC THENL + [LOCAL_ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `inv(&2:real) = + (t pow 2 + &1) * inv(&2 * t pow 2 + &2)` + SUBST1_TAC THENL + [UNDISCH_TAC `~(&2 * t pow 2 + &2 = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_RMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a ==> a < a + &1`) THEN + REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LT_INV THEN LOCAL_ASM_REAL_ARITH_TAC]; + ALL_TAC]) THEN + SIMP_TAC[]]);; + +(* Cr inequality: (x+y)^4 <= 8*(x^4 + y^4) *) +let FOURTH_POWER_SUM_BOUND = prove + (`!x y. (x + y) pow 4 <= &8 * (x pow 4 + y pow 4)`, + REPEAT GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= (x - y) pow 2 * (&7 * x pow 2 + &10 * x * y + &7 * y pow 2) + ==> (x + y) pow 4 <= &8 * (x pow 4 + y pow 4)`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= &7 * (&7 * x pow 2 + &10 * x * y + &7 * y pow 2)` + MP_TAC THENL + [SUBGOAL_THEN `&7 * (&7 * x pow 2 + &10 * x * y + &7 * y pow 2) = + (&7 * x + &5 * y) pow 2 + &24 * y pow 2` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REAL_ARITH_TAC]; + MP_TAC(REAL_ARITH `&0 < &7`) THEN + MESON_TAC[REAL_LE_MUL_EQ]]);; + +(* Bounded sum pow integrability *) +let INTEGRABLE_BOUNDED_SUM_POW = prove + (`!p:A prob_space (Y:num->A->real) c n k. + (!i. integrable p (Y i)) /\ + (!i w. w IN prob_carrier p ==> abs(Y i w) <= c) + ==> integrable p (\w. sum(0..n) (\i. Y i w) pow k)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `((&n + &1) * c) pow k` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Y:num->A->real) i w))` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. c:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[] THEN ASM_SIMP_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUC] THEN + REAL_ARITH_TAC]]]);; + +(* Nonneg bounded partial sums => summable *) +let NONNEG_BOUNDED_PARTIAL_SUMS_SUMMABLE = prove + (`!f M. (!n. &0 <= f n) /\ (!n. sum(0..n) f <= M) + ==> real_summable (from 0) f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[real_summable; real_sums; REALLIM_SEQUENTIALLY] THEN + SUBGOAL_THEN `!k:num. from 0 INTER (0..k) = (0..k)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[EXTENSION; IN_INTER; IN_NUMSEG; + from; IN_ELIM_THM] THEN ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`\k:num. sum(0..k) (f:num->real)`; `M:real`] + CONVERGENT_BOUNDED_INCREASING) THEN + REWRITE_TAC[] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`f:num->real`; `0`; `m:num`; `n:num`] SUM_COMBINE_R) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a <= a + b`) THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= s /\ s <= M ==> abs s <= M`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]]; + MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN + MESON_TAC[]]);; + +(* ================================================================== *) +(* SECOND_MOMENT_BOUNDED_FROM_AS_CONVERGENCE *) +(* If partial sums converge a.s. and have a 4th moment bound, then *) +(* the second moments are uniformly bounded. *) +(* ================================================================== *) + +(* Key idea: a.s. convergence => partial sums bounded a.s. *) +(* Define A_m = {x | exists n, |S_n(x)| >= m}. Then A_m decreasing, *) +(* INTERS A_m subset {divergent}, so P(A_m) -> 0. *) +(* Choose m with P(A_m) < 1/(4K). Then by Cauchy-Schwarz: *) +(* E[S_n^2*1(|S_n|>=m)] <= sqrt(E[S_n^4]*P(A_m)) < E[S_n^2]/2 *) +(* So E[S_n^2] <= m^2 + E[S_n^2]/2, giving E[S_n^2] <= 2*m^2. *) + +let PROB_LIM_HELPER = prove + (`!p:A prob_space Am. + (!m. Am m IN prob_events p) /\ + (!m. Am (SUC m) SUBSET Am m) /\ + prob p (INTERS {Am m | m IN (:num)}) = &0 + ==> ((\m. prob p (Am m)) ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC PROB_CONTINUITY_FROM_ABOVE THEN + ASM_REWRITE_TAC[]);; + +let SECOND_MOMENT_BOUNDED_FROM_AS_CONVERGENCE = prove + (`!p:A prob_space (Y:num->A->real) B K. + &0 < B /\ &1 <= K /\ + (!n. integrable p (Y n)) /\ + (!n x. x IN prob_carrier p ==> abs(Y n x) <= B) /\ + (!n. expectation p (\x. sum(0..n) (\i. Y i x) pow 4) <= + K * expectation p (\x. sum(0..n) (\i. Y i x) pow 2) pow 2) /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially} + ==> ?M. !n. expectation p (\x. sum(0..n) (\i. Y i x) pow 2) <= M`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Phase 0: Setup - establish random_variable, bounds, integrability *) + SUBGOAL_THEN `!i. random_variable p ((Y:num->A->real) i)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n x. x IN prob_carrier p + ==> abs(sum(0..n) (\i. (Y:num->A->real) i x)) <= &(n + 1) * B` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Y:num->A->real) i x))` THEN CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. B)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 2` THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 4)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 4` THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Phase 1: Events - show abs(S_n(x)) >= m is an event *) + SUBGOAL_THEN `!n m. {x | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m} IN prob_events p` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + SUBGOAL_THEN `{x | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m} = + {x | x IN prob_carrier p /\ sum(0..n) (\i. Y i x) >= &m} UNION + {x | x IN prob_carrier p /\ --sum(0..n) (\i. Y i x) >= &m}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM] THEN + GEN_TAC THEN ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + --sum(0..n) (\i. (Y:num->A->real) i x) >= &m} = + {x | x IN prob_carrier p /\ + (\x. --sum(0..n) (\i. Y i x)) x >= &m}` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_NEG THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Define Am = UNIONS of level sets *) + ABBREV_TAC `Am = \m. UNIONS {(\n. + {x | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m}) n | n IN (:num)}` THEN + SUBGOAL_THEN `!m. (Am:num->A->bool) m IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Am" THEN + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!m (x:A). x IN (Am:num->A->bool) m + ==> x IN prob_carrier p /\ ?n. abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "Am" THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + FIRST_X_ASSUM(X_CHOOSE_THEN `nn:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Phase 2: Am decreasing *) + SUBGOAL_THEN `!m. (Am:num->A->bool) (SUC m) SUBSET Am m` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Am" THEN REWRITE_TAC[SUBSET; IN_UNIONS] THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + FIRST_X_ASSUM(X_CHOOSE_THEN `t:A->bool` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(SUBST_ALL_TAC) THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m}` THEN + CONJ_TAC THENL [EXISTS_TAC `n:num` THEN REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `x >= &(SUC m) /\ &m <= &(SUC m) ==> x >= &m`) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC; + ALL_TAC] THEN + (* Phase 3: INTERS Am subset divergent *) + SUBGOAL_THEN `INTERS {(Am:num->A->bool) m | m IN (:num)} SUBSET + {x:A | x IN prob_carrier p /\ + ~(x IN {x | ?L. ((\n. sum(0..n) (\i. (Y:num->A->real) i x)) ---> L) + sequentially})}` ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_INTERS; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `!m. (y:A) IN (Am:num->A->bool) m` ASSUME_TAC THENL + [GEN_TAC THEN FIRST_X_ASSUM(MP_TAC o SPEC `(Am:num->A->bool) m`) THEN + DISCH_THEN MATCH_MP_TAC THEN EXISTS_TAC `m:num` THEN REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(y:A) IN prob_carrier p` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `!m. ?n. abs(sum(0..n) (\i. (Y:num->A->real) i y)) >= &m` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + MP_TAC(ISPECL [`(\n. sum(0..n) (\i. (Y:num->A->real) i y))`; `L:real`] + REAL_CONVERGENT_IMP_BOUNDED) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_BOUNDED_POS_LT; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `b:real` STRIP_ASSUME_TAC) THEN + MP_TAC(ISPEC `b:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `j:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `sum(0..j) (\i. (Y:num->A->real) i y)`) THEN + ANTS_TAC THENL [EXISTS_TAC `j:num` THEN REWRITE_TAC[]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Phase 3b: P(INTERS Am) = 0 *) + SUBGOAL_THEN `prob p (INTERS {(Am:num->A->bool) m | m IN (:num)}) = &0` + ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `almost_surely p + {x:A | ?L. ((\n. sum(0..n) (\i. (Y:num->A->real) i x)) ---> L) sequentially}` THEN + REWRITE_TAC[almost_surely] THEN + DISCH_THEN(X_CHOOSE_THEN `N:A->bool` STRIP_ASSUME_TAC) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob p (N:A->bool)` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[null_event]; ALL_TAC] THEN + ASM_MESON_TAC[SUBSET_TRANS]; + ASM_MESON_TAC[null_event; REAL_LE_REFL]]; + ALL_TAC] THEN + (* Phase 4: P(Am) -> 0 *) + SUBGOAL_THEN `&0 < inv(&4 * K)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN MATCH_MP_TAC REAL_LT_MUL THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ASSUME `&1 <= K`) THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Am:num->A->bool`] PROB_LIM_HELPER) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + FIRST_ASSUM(MP_TAC o REWRITE_RULE[REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `inv(&4 * K)`) THEN ASM_REWRITE_TAC[] THEN + (* Phase 5: Choose m0 *) + DISCH_THEN(X_CHOOSE_TAC `m0:num`) THEN + SUBGOAL_THEN `prob p ((Am:num->A->bool) m0) < inv(&4 * K)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `m0:num`) THEN + REWRITE_TAC[LE_REFL] THEN + SUBGOAL_THEN `&0 <= prob p ((Am:num->A->bool) m0)` MP_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* Provide witness M = 2 * m0^2 *) + EXISTS_TAC `&2 * &m0 pow 2` THEN X_GEN_TAC `n:num` THEN + (* Phase 6: For arbitrary n, bound E[S_n^2] *) + ABBREV_TAC `an = {x:A | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m0}` THEN + SUBGOAL_THEN `an IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `prob_carrier p DIFF an IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + REWRITE_TAC[PROB_CARRIER_IN_EVENTS] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(an:A->bool) SUBSET (Am:num->A->bool) m0` ASSUME_TAC THENL + [EXPAND_TAC "an" THEN EXPAND_TAC "Am" THEN + REWRITE_TAC[SUBSET; IN_UNIONS; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + abs(sum(0..n) (\i. (Y:num->A->real) i x)) >= &m0}` THEN + CONJ_TAC THENL + [EXISTS_TAC `n:num` THEN REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `prob p (an:A->bool) < inv(&4 * K)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `prob p ((Am:num->A->bool) m0)` THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* abs bound on complement *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p /\ x IN prob_carrier p DIFF an + ==> abs(sum(0..n) (\i. (Y:num->A->real) i x)) < &m0` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN + UNDISCH_TAC `~((x:A) IN an)` THEN + EXPAND_TAC "an" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Integrability of S_n^2 * indicators *) + SUBGOAL_THEN `integrable p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn (prob_carrier p DIFF an) x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `(\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2)`; + `prob_carrier p DIFF (an:A->bool)`] INTEGRABLE_MUL_INDICATOR_FN) THEN + REWRITE_TAC[BETA_THM] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `(\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2)`; + `an:A->bool`] INTEGRABLE_MUL_INDICATOR_FN) THEN + REWRITE_TAC[BETA_THM] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Pointwise bound on complement: S_n^2 * 1_compl <= m0^2 *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> sum(0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn (prob_carrier p DIFF an) x <= &m0 pow 2` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN COND_CASES_TAC THENL + [ALL_TAC; REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_POW_2]] THEN + REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `sum(0..n) (\i. (Y:num->A->real) i x) pow 2 = + abs(sum(0..n) (\i. Y i x)) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF]; + ALL_TAC] THEN + (* Complement expectation bound: E[S_n^2 * 1_compl] <= m0^2 *) + SUBGOAL_THEN `expectation p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn (prob_carrier p DIFF an) x) <= &m0 pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. &m0 pow 2)` THEN CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[EXPECTATION_CONST; REAL_LE_REFL]]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (indicator_fn (an:A->bool))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Phase 6d: Cauchy-Schwarz *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x) pow 2 + <= expectation p (\x. (sum (0..n) (\i. Y i x) pow 2) pow 2) * + expectation p (\x. indicator_fn an x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_CAUCHY_SCHWARZ THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 pow 2) = + (\x. sum (0..n) (\i. Y i x) pow 4)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. indicator_fn an x pow 2) = indicator_fn an` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn] THEN GEN_TAC THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + (* Simplify pow 2 pow 2 = pow 4 *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 pow 2) = + expectation p (\x. sum (0..n) (\i. Y i x) pow 4)` ASSUME_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 * 2`; GSYM REAL_POW_POW]; + ALL_TAC] THEN + (* E[indicator^2] = P(an) *) + SUBGOAL_THEN + `expectation p (\x:A. indicator_fn an x pow 2) = prob p an` ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. indicator_fn an x pow 2) = indicator_fn an` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn] THEN GEN_TAC THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Combine: E[S^2*1_an]^2 <= E[S^4]*P(an) *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x) pow 2 + <= expectation p (\x. sum (0..n) (\i. Y i x) pow 4) * prob p an` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 pow 2) * + expectation p (\x:A. indicator_fn an x pow 2)` THEN + ASM_REWRITE_TAC[REAL_LE_REFL; REAL_LE_RMUL; REAL_LE_LMUL]; + ALL_TAC] THEN + (* Non-negativity facts *) + SUBGOAL_THEN `&0 <= expectation p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 4)` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `sum (0..n) (\i. (Y:num->A->real) i x) pow 4 = + (sum (0..n) (\i. Y i x) pow 2) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_POW; ARITH]; REWRITE_TAC[REAL_LE_POW_2]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= expectation p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= expectation p (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x)` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob p (an:A->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Chain: E[S^4]*P(an) <= K*E[S^2]^2*P(an) *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 4) * prob p an + <= (K * expectation p (\x. sum (0..n) (\i. Y i x) pow 2) pow 2) * prob p an` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Chain: K*E[S^2]^2*P(an) <= K*E[S^2]^2*inv(4K) *) + SUBGOAL_THEN + `(K * expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2) pow 2) * prob p an + <= (K * expectation p (\x. sum (0..n) (\i. Y i x) pow 2) pow 2) * inv(&4 * K)` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MP_TAC(ASSUME `&1 <= K`) THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_LE_POW_2]]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Simplify K*E[S^2]^2*inv(4K) = E[S^2]^2*inv(4) *) + SUBGOAL_THEN + `(K * expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2) pow 2) * + inv(&4 * K) = + expectation p (\x. sum (0..n) (\i. Y i x) pow 2) pow 2 * inv(&4)` + ASSUME_TAC THENL + [SUBGOAL_THEN `~(K = &0)` ASSUME_TAC THENL + [MP_TAC(ASSUME `&1 <= K`) THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `K * inv(K) = &1` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_MUL_RINV]; ALL_TAC] THEN + REWRITE_TAC[REAL_INV_MUL] THEN + ABBREV_TAC `e2' = expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2)` THEN + SUBGOAL_THEN `(K * e2' pow 2) * inv (&4) * inv K = + (K * inv K) * (e2' pow 2 * inv(&4))` SUBST1_TAC THENL + [REAL_ARITH_TAC; ASM_REWRITE_TAC[REAL_MUL_LID]]; + ALL_TAC] THEN + (* Combine to get E[S^2*1_an]^2 <= E[S^2]^2/4 *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x) pow 2 + <= expectation p (\x. sum (0..n) (\i. Y i x) pow 2) pow 2 * inv(&4)` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 4) * + prob p an` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(K * expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2) pow 2) * + prob p an` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(K * expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2) pow 2) * + inv (&4 * K)` THEN + ASM_REWRITE_TAC[REAL_LE_REFL]; + ALL_TAC] THEN + (* Deduce E[S^2*1_an] <= E[S^2]/2 *) + SUBGOAL_THEN + `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x) + <= expectation p (\x. sum (0..n) (\i. Y i x) pow 2) * inv (&2)` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_POW_LE2_REV THEN EXISTS_TAC `2` THEN + REWRITE_TAC[ARITH_RULE `~(2 = 0)`] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2) pow 2 * + inv(&4)` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_POW_MUL] THEN + SUBGOAL_THEN `inv(&2) pow 2 = inv(&4)` SUBST1_TAC THENL + [CONV_TAC REAL_RAT_REDUCE_CONV; REWRITE_TAC[REAL_LE_REFL]]; + ALL_TAC] THEN + (* Phase 7: EXPECTATION_SPLIT and conclude *) + MP_TAC(ISPECL [`p:A prob_space`; + `(\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2)`; + `an:A->bool`] EXPECTATION_SPLIT) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + ABBREV_TAC `e2 = expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2)` THEN + ABBREV_TAC `a = expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn an x)` THEN + ABBREV_TAC `c = expectation p (\x:A. sum (0..n) (\i. (Y:num->A->real) i x) pow 2 * + indicator_fn (prob_carrier p DIFF an) x)` THEN + SUBGOAL_THEN `&2 * a <= e2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&2 * (e2 * inv(&2))` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `&2 * (e2 * inv(&2)) = e2` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + SUBGOAL_THEN `&2 * inv(&2) = &1` ASSUME_TAC THENL + [CONV_TAC REAL_RAT_REDUCE_CONV; + MP_TAC(ASSUME `&2 * inv (&2) = &1`) THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH + `e2 = a + c /\ a <= c /\ c <= M ==> e2 <= &2 * M`) THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [SUBGOAL_THEN `&2 * a <= a + c` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `e2:real` THEN + ASM_REWRITE_TAC[REAL_LE_REFL]; + REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]);; +(* ================================================================== *) +(* THREE_SERIES_NECESSITY: Necessity of the Kolmogorov Three-Series *) +(* ================================================================== *) + +(* Helper tactics for curried abbreviations in THREE_SERIES_NECESSITY. + EXPAND_CURRY_TAC s: finds assumption !n x. ... = f n x where f's name is s, + then rewrites f n x -> ... (backward rewrite, unfolding the abbreviation). + FOLD_CURRY_TAC s: same but rewrites ... -> f n x (forward rewrite). *) +let EXPAND_CURRY_TAC s = + FIRST_ASSUM(fun th -> + try let _,eq = strip_forall(concl th) in + let _,r = dest_eq eq in + let v,_ = strip_comb r in + if fst(dest_var v) = s + then PURE_REWRITE_TAC[GSYM th] + else failwith "" + with _ -> failwith "");; + +let FOLD_CURRY_TAC s = + FIRST_ASSUM(fun th -> + try let _,eq = strip_forall(concl th) in + let _,r = dest_eq eq in + let v,_ = strip_comb r in + if fst(dest_var v) = s + then PURE_REWRITE_TAC[th] + else failwith "" + with _ -> failwith "");; + +let THREE_SERIES_NECESSITY = prove + (`!p:A prob_space (X:num->A->real) c C. + &0 < c /\ &1 <= C /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + indep_events_seq p (\n. {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + (!i j. ~(i = j) ==> covariance p + (\x. min(max(X i x) (--c)) c - expectation p (\y. min(max(X i y) (--c)) c)) + (\x. min(max(X j x) (--c)) c - expectation p (\y. min(max(X j y) (--c)) c)) + = &0) /\ + (!n x. x IN prob_carrier p ==> abs(min(max(X n x) (--c)) c - + expectation p (\y. min(max(X n y) (--c)) c)) <= &2 * c) /\ + (!n. expectation p (\x. sum(0..n) (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) pow 4) <= + C * expectation p (\x. sum(0..n) (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) pow 2) pow 2) /\ + (!a b k t. a <= k /\ k < b /\ &0 < t ==> + expectation p (\x. sum(a..k) + (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) * + sum(SUC k..b) + (\i. min(max(X i x) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c)) * + indicator_fn {z | z IN prob_carrier p /\ + (!j. a <= j /\ j < k ==> + abs(sum(a..j) (\i. min(max(X i z) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c))) < t) /\ + abs(sum(a..k) (\i. min(max(X i z) (--c)) c - + expectation p (\y. min(max(X i y) (--c)) c))) >= t} x) = &0) /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + real_summable (from 0) + (\n. expectation p (\x. min(max(X n x) (--c)) c)) /\ + real_summable (from 0) + (\n. variance p (\x. min(max(X n x) (--c)) c))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Phase 0: Setup - abbreviations and basic facts *) + ABBREV_TAC `(Y:num->A->real) n (x:A) = min(max((X:num->A->real) n x) (--c)) c` THEN + ABBREV_TAC + `(Z:num->A->real) n (x:A) = (Y:num->A->real) n x - expectation p (\y. Y n y)` THEN + SUBGOAL_THEN `!n (x:A). (Z:num->A->real) n x = + min(max((X:num->A->real) n x) (--c)) c - + expectation p (\y. min(max(X n y) (--c)) c)` ASSUME_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable p ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + (* Phase 1: C1 -- tail probability summability *) + SUBGOAL_THEN `real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})` + ASSUME_TAC THENL + [MATCH_MP_TAC THREE_SERIES_CONDITION1 THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Phase 2: a.s. convergence of sum Y *) + SUBGOAL_THEN `almost_surely p {x | ?L. ((\n. sum(0..n) (\i. + min(max((X:num->A->real) i x) (--c)) c)) ---> L) sequentially}` + ASSUME_TAC THENL + [MATCH_MP_TAC THREE_SERIES_REDUCTION THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Phase 3: Integrability and structural facts *) + SUBGOAL_THEN `!n. integrable p (\x:A. (Y:num->A->real) n x)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Y" THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). abs((Y:num->A->real) n x) <= c` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN EXPAND_CURRY_TAC "Y" THEN + REWRITE_TAC[real_max; real_min] THEN + REPEAT COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Y:num->A->real) n x pow 2)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(c:real) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!i j. ~(i = j) ==> + covariance p (\x:A. (Y:num->A->real) i x) (\x. Y j x) = &0` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (Y:num->A->real) i x`; + `\x:A. (Y:num->A->real) j x`; + `expectation p (\y:A. (Y:num->A->real) i y)`; + `expectation p (\y:A. (Y:num->A->real) j y)`] + COVARIANCE_SHIFT) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o GSYM) THEN + BETA_TAC THEN FOLD_CURRY_TAC "Z" THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). abs(sum(0..n) (\i. (Y:num->A->real) i x)) <= + &(n + 1) * c` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Y:num->A->real) i x))` THEN + CONJ_TAC THENL [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Y:num->A->real) i = (\x. Y i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 4)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * c) pow 4` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Phase 4: Fourth moment bound for non-centered Y *) + SUBGOAL_THEN `!n. expectation p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 4) <= + &8 * C * expectation p (\x. sum(0..n) (\i. Y i x) pow 2) pow 2` + ASSUME_TAC THENL + [GEN_TAC THEN + ABBREV_TAC `(T_n:A->real) (x:A) = sum(0..n) (\i. (Z:num->A->real) i x)` THEN + ABBREV_TAC + `M_n = sum(0..n) (\i. expectation p (\y:A. (Y:num->A->real) i y))` THEN + SUBGOAL_THEN `!x:A. sum(0..n) (\i. (Y:num->A->real) i x) = + (T_n:A->real) x + M_n` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "T_n" THEN EXPAND_TAC "M_n" THEN + EXPAND_CURRY_TAC "Z" THEN + REWRITE_TAC[GSYM SUM_ADD_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\x:A. (T_n:A->real) x pow 4) <= + C * expectation p (\x. T_n x pow 2) pow 2` ASSUME_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!(a:real) b. (a + b) pow 4 <= &8 * (a pow 4 + b pow 4)` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&2 * (a pow 2 + b pow 2)) pow 2` THEN CONJ_TAC THENL + [SUBGOAL_THEN `(a + b:real) pow 4 = ((a + b) pow 2) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV; ALL_TAC] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + MP_TAC(SPEC `a - b:real` REAL_LE_POW_2) THEN REWRITE_TAC[REAL_POW_2] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPEC `(a:real) pow 2 - b pow 2` REAL_LE_POW_2) THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Z:num->A->real) n x)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + SUBGOAL_THEN `!i. expectation p (\x:A. (Z:num->A->real) i x) = &0` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + MATCH_MP_TAC(REAL_ARITH `a = b ==> a - b = &0`) THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x)` ASSUME_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN + REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\x:A. (T_n:A->real) x) = &0` ASSUME_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUM o lhand o snd) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN BETA_TAC THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * &2 * c) pow 2` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i x))` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN REWRITE_TAC[SUM_ABS_NUMSEG]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. &2 * (T_n:A->real) x * M_n)` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. &2 * (T_n:A->real) x * M_n) = + (\x. (&2 * M_n) * T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + SUBGOAL_THEN `(T_n:A->real) = (\x:A. T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x pow 4)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * &2 * c) pow 4` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i x))` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN REWRITE_TAC[SUM_ABS_NUMSEG]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= expectation p (\x:A. (T_n:A->real) x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[REAL_LE_POW_2]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\x:A. &2 * (T_n:A->real) x * M_n) = &0` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. &2 * (T_n:A->real) x * M_n) = + (\x. (&2 * M_n) * T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_CMUL o lhand o snd) THEN + ANTS_TAC THENL + [SUBGOAL_THEN `(T_n:A->real) = (\x:A. T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `expectation p (T_n:A->real) = + expectation p (\x:A. T_n x)` SUBST1_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 4) = + (\x. ((T_n:A->real) x + M_n) pow 4)` ASSUME_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2) = + expectation p (\x. (T_n:A->real) x pow 2) + M_n pow 2` + SUBST1_TAC THENL + [SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2) = + (\x. (T_n:A->real) x pow 2 + &2 * T_n x * M_n + M_n pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o lhand o snd) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o + rand o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[EXPECTATION_CONST] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&8 * C * + (expectation p (\x:A. (T_n:A->real) x pow 2) pow 2 + M_n pow 4)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&8 * + (expectation p (\x:A. (T_n:A->real) x pow 4) + M_n pow 4)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `expectation p + (\x:A. &8 * ((T_n:A->real) x pow 4 + M_n pow 4)) = + &8 * (expectation p (\x. T_n x pow 4) + M_n pow 4)` + ASSUME_TAC THENL + [W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_CMUL o + lhand o snd) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o + lhand o snd) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST]; + ALL_TAC] THEN + FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN + MATCH_MP_TAC EXPECTATION_MONO THEN + REPEAT CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. ((T_n:A->real) x + M_n) pow 4) = + (\x. sum(0..n) (\i. (Y:num->A->real) i x) pow 4)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + GEN_REWRITE_TAC LAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(M_n:real) pow 4 = (M_n pow 2) pow 2` + (fun th -> REWRITE_TAC[th; REAL_LE_POW_2]) THEN + REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV]]]; + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(M_n:real) pow 4 = (M_n pow 2) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= &2 * expectation p + (\x:A. (T_n:A->real) x pow 2) * (M_n:real) pow 2` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[REAL_LE_POW_2]]; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Phase 5: C3 via SUMMABLE_VARIANCE_FROM_CONVERGENCE *) + SUBGOAL_THEN `real_summable (from 0) (\n. variance p (\x:A. (Y:num->A->real) n x))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Y:num->A->real`; `&8 * C`] + SUMMABLE_VARIANCE_FROM_CONVERGENCE) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + GEN_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) n` ETA_AX)] THEN + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) i` ETA_AX)] THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) j` ETA_AX)] THEN + ASM_SIMP_TAC[]; + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN ASM_REWRITE_TAC[]; + EXPAND_CURRY_TAC "Y" THEN ASM_REWRITE_TAC[]]; + SIMP_TAC[ETA_AX]]; + ALL_TAC] THEN + (* Phase 6+7: Combine C1, C2, C3 *) + SUBGOAL_THEN `!n (x:A). min(max((X:num->A->real) n x) (--c)) c = + (Y:num->A->real) n x` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + EXPAND_CURRY_TAC "Y" THEN + SUBGOAL_THEN `real_summable (from 0) (\n. variance p + (\x:A. min(max((X:num->A->real) n x)(--c)) c))` ASSUME_TAC THENL + [UNDISCH_TAC `real_summable (from 0) + (\n. variance p (\x:A. (Y:num->A->real) n x))` THEN + EXPAND_CURRY_TAC "Y" THEN SIMP_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC THREE_SERIES_CONDITION2 THEN + REPEAT CONJ_TAC THENL + [FIRST_ASSUM ACCEPT_TAC; + FIRST_ASSUM ACCEPT_TAC; + FIRST_ASSUM ACCEPT_TAC; + PURE_REWRITE_TAC[GSYM(ASSUME `!n (x:A). (Z:num->A->real) n x = + min (max ((X:num->A->real) n x) (--c)) c - + expectation p (\y. min (max (X n y) (--c)) c)`)] THEN + FIRST_ASSUM ACCEPT_TAC; + PURE_REWRITE_TAC[GSYM(ASSUME `!n (x:A). (Z:num->A->real) n x = + min (max ((X:num->A->real) n x) (--c)) c - + expectation p (\y. min (max (X n y) (--c)) c)`)] THEN + FIRST_ASSUM ACCEPT_TAC; + PURE_REWRITE_TAC[GSYM(ASSUME `!n (x:A). (Z:num->A->real) n x = + min (max ((X:num->A->real) n x) (--c)) c - + expectation p (\y. min (max (X n y) (--c)) c)`)] THEN + FIRST_ASSUM ACCEPT_TAC; + FIRST_ASSUM ACCEPT_TAC; + FIRST_ASSUM ACCEPT_TAC]);; + +(* ================================================================== *) +(* Mutual independence infrastructure *) +(* ================================================================== *) + +(* Mutual independence of a sequence of random variables: finite-dimensional + distributions factorize into marginals for all finite subsets. *) +let mutually_indep_rv_seq = new_definition + `mutually_indep_rv_seq (p:A prob_space) (X:num->A->real) <=> + (!n. random_variable p (X n)) /\ + (!S a. FINITE S /\ ~(S = {}) ==> + prob p (INTERS (IMAGE (\n. {x | x IN prob_carrier p /\ X n x <= a n}) S)) = + product S (\n. prob p {x | x IN prob_carrier p /\ X n x <= a n}))`;; + +(* Helper: product over a two-element set *) +let PRODUCT_2 = prove + (`!i j (f:num->real). ~(i = j) ==> product {i, j} f = f i * f j`, + REPEAT STRIP_TAC THEN + SIMP_TAC[PRODUCT_CLAUSES; FINITE_EMPTY; FINITE_INSERT] THEN + ASM_REWRITE_TAC[NOT_IN_EMPTY; IN_SING; REAL_MUL_RID]);; + +(* Mutual independence implies pairwise independence *) +let MUTUALLY_INDEP_RV_SEQ_PAIRWISE = prove + (`!p:A prob_space (X:num->A->real). + mutually_indep_rv_seq p X + ==> !i j. ~(i = j) ==> indep_rv p (X i) (X j)`, + REPEAT GEN_TAC THEN REWRITE_TAC[mutually_indep_rv_seq; indep_rv] THEN + STRIP_TAC THEN REPEAT GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `a:real` THEN X_GEN_TAC `b:real` THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`{i:num, j:num}`; `(\n:num. if n = i then a else b):num->real`]) THEN + SIMP_TAC[FINITE_INSERT; FINITE_EMPTY; NOT_INSERT_EMPTY] THEN + BETA_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `INTERS (IMAGE (\n. {x:A | x IN prob_carrier p /\ + X n x <= (if n = i then a else b)}) {i,j}) = + {x | x IN prob_carrier p /\ (X:num->A->real) i x <= a /\ X j x <= b}` + (fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THENL + [REWRITE_TAC[IMAGE_CLAUSES] THEN + SUBGOAL_THEN `~(j:num = i)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[INTERS_2] THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `product {i,j} (\n:num. prob (p:A prob_space) + {w:A | w IN prob_carrier p /\ + (X:num->A->real) n w <= (if n = i then a else b)}) = + prob p {w | w IN prob_carrier p /\ X i w <= a} * + prob p {w | w IN prob_carrier p /\ X j w <= b}` + (fun th -> ASM_REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[PRODUCT_2]);; + +let MUTUALLY_INDEP_CDF_POINT_MASS_MIXED = prove + (`!p:A prob_space (Z:num->A->real) (a:num->real) (v:num->real) + (R:num->bool) (U:num->bool). + mutually_indep_rv_seq p Z /\ + (!i. i IN U ==> simple_rv p (Z i)) /\ + FINITE R /\ FINITE U /\ DISJOINT R U /\ ~(R UNION U = EMPTY) + ==> prob p + (INTERS (IMAGE (\t. {x | x IN prob_carrier p /\ Z t x <= a t}) R) + INTER + INTERS (IMAGE (\u. {x | x IN prob_carrier p /\ Z u x = v u}) U)) + = product R (\t. prob p {x | x IN prob_carrier p /\ Z t x <= a t}) * + product U (\u. prob p {x | x IN prob_carrier p /\ Z u x = v u})`, + GEN_TAC THEN GEN_TAC THEN + SUBGOAL_THEN + `!U:num->bool. FINITE U ==> + !a:num->real v:num->real (R:num->bool). + mutually_indep_rv_seq (p:A prob_space) (Z:num->A->real) /\ + (!i. i IN U ==> simple_rv p (Z i)) /\ + FINITE R /\ DISJOINT R U /\ ~(R UNION U = {}) + ==> prob p + (INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ Z t x <= a t}) R) + INTER + INTERS (IMAGE (\u. {x:A | x IN prob_carrier p /\ Z u x = v u}) U)) + = product R (\t. prob p {x:A | x IN prob_carrier p /\ Z t x <= a t}) * + product U (\u. prob p {x:A | x IN prob_carrier p /\ Z u x = v u})` + ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [(* === BASE CASE === *) + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV; + PRODUCT_CLAUSES; REAL_MUL_RID] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv_seq]) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`R:num->bool`; `a:num->real`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + UNDISCH_TAC `~((R:num->bool) UNION {} = {})` THEN + REWRITE_TAC[UNION_EMPTY]; + ALL_TAC] THEN + (* === INDUCTIVE STEP === *) + X_GEN_TAC `u:num` THEN X_GEN_TAC `U':num->bool` THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `~(u:num IN R)` ASSUME_TAC THENL + [UNDISCH_TAC `DISJOINT (R:num->bool) (u INSERT U')` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT (R:num->bool) (U':num->bool)` ASSUME_TAC THENL + [UNDISCH_TAC `DISJOINT (R:num->bool) (u INSERT U')` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT (u INSERT R:num->bool) (U':num->bool)` ASSUME_TAC + THENL + [UNDISCH_TAC `~(u:num IN U')` THEN + UNDISCH_TAC `DISJOINT (R:num->bool) (U':num->bool)` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. random_variable (p:A prob_space) ((Z:num->A->real) n)` + ASSUME_TAC THENL + [UNDISCH_TAC `mutually_indep_rv_seq (p:A prob_space) (Z:num->A->real)` THEN + REWRITE_TAC[mutually_indep_rv_seq] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) ((Z:num->A->real) u)` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `u:num` o + check(fun th -> try fst(dest_forall(concl th)) = `i:num` + with _ -> false)) THEN + REWRITE_TAC[IN_INSERT]; ALL_TAC] THEN + SUBGOAL_THEN `!i:num. i IN U' ==> simple_rv (p:A prob_space) ((Z:num->A->real) i)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num` o + check(fun th -> try fst(dest_forall(concl th)) = `i:num` + with _ -> false)) THEN + ASM_REWRITE_TAC[IN_INSERT]; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; `(Z:num->A->real) u`; `(v:num->real) u`] + SIMPLE_RV_GAP_BELOW) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `w:real` (LABEL_TAC "gap")) THEN + REWRITE_TAC[IMAGE_CLAUSES; INTERS_INSERT] THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + (* pm_diff -- keep it for later use *) + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (Z:num->A->real) u x = (v:num->real) u} = + {x | x IN prob_carrier p /\ Z u x <= v u} DIFF + {x | x IN prob_carrier p /\ Z u x <= w}` + (LABEL_TAC "pm_diff") THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(x:A) IN prob_carrier p` THEN + DISCH_THEN(fun xth -> USE_THEN "gap" (fun gap -> + ASSUME_TAC(MP (SPEC `x:A` gap) xth))) THEN + ASM_CASES_TAC `(Z:num->A->real) u (x:A) <= w` THEN + ASM_CASES_TAC `(Z:num->A->real) u (x:A) <= (v:num->real) u` THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Events membership *) + SUBGOAL_THEN + `!t:num a':real. + {x:A | x IN prob_carrier p /\ (Z:num->A->real) t x <= a'} IN + prob_events p` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `t:num` o + check(fun th -> try fst(dest_forall(concl th)) = `n:num` + with _ -> false)) THEN + REWRITE_TAC[random_variable] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!t:num v':real. + {x:A | x IN prob_carrier p /\ (Z:num->A->real) t x = v'} IN + prob_events p` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(Z:num->A->real) t`; `v':real`] + RANDOM_VARIABLE_LEVEL_SET) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Rewrite {Z u = v u} as DIFF in the LHS -- USE not REMOVE *) + USE_THEN "pm_diff" (fun th -> + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV o RAND_CONV o LAND_CONV) [th]) THEN + (* Distribute INTER over DIFF *) + SUBGOAL_THEN + `INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) INTER + (({x | x IN prob_carrier p /\ Z u x <= (v:num->real) u} DIFF + {x | x IN prob_carrier p /\ Z u x <= w}) INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U')) + = (INTERS (IMAGE (\t. {x | x IN prob_carrier p /\ Z t x <= a t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= v u} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U')) + DIFF + (INTERS (IMAGE (\t. {x | x IN prob_carrier p /\ Z t x <= a t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= w} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U'))` + SUBST1_TAC THENL + [MATCH_ACCEPT_TAC(SET_RULE + `!A B C D:A->bool. + A INTER ((B DIFF C) INTER D) = + (A INTER B INTER D) DIFF (A INTER C INTER D)`); + ALL_TAC] THEN + (* ABBREV_TAC with labels *) + ABBREV_TAC `termA = + INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= (v:num->real) u} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U')` THEN + POP_ASSUM(LABEL_TAC "termA_def") THEN + ABBREV_TAC `termB = + INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= w} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = (v:num->real) u'}) U')` THEN + POP_ASSUM(LABEL_TAC "termB_def") THEN + (* === termB SUBSET termA === *) + SUBGOAL_THEN `termB SUBSET (termA:A->bool)` ASSUME_TAC THENL + [REMOVE_THEN "termA_def" (fun ta -> REMOVE_THEN "termB_def" (fun tb -> + SUBST1_TAC(SYM ta) THEN SUBST1_TAC(SYM tb))) THEN + REWRITE_TAC[SUBSET; IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(x:A) IN prob_carrier p` THEN + DISCH_THEN(fun xth -> USE_THEN "gap" (fun gap -> + ASSUME_TAC(MP (SPEC `x:A` gap) xth))) THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* === Measurability === *) + SUBGOAL_THEN `(termA:A->bool) IN prob_events p /\ + (termB:A->bool) IN prob_events p` STRIP_ASSUME_TAC THENL + [REMOVE_THEN "termA_def" (fun ta -> REMOVE_THEN "termB_def" (fun tb -> + SUBST1_TAC(SYM ta) THEN SUBST1_TAC(SYM tb))) THEN + ASM_CASES_TAC `(R:num->bool) = {}` THENL + [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV] THEN + ASM_CASES_TAC `(U':num->bool) = {}` THENL + [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV]; ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\u'. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) u' x = (v:num->real) u'}) U') IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + X_GEN_TAC `i':num` THEN DISCH_TAC THEN BETA_TAC THEN + FIRST_ASSUM MATCH_ACCEPT_TAC; ALL_TAC] THEN + CONJ_TAC THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + X_GEN_TAC `t':num` THEN DISCH_TAC THEN BETA_TAC THEN + FIRST_ASSUM MATCH_ACCEPT_TAC; ALL_TAC] THEN + ASM_CASES_TAC `(U':num->bool) = {}` THENL + [ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV] THEN + CONJ_TAC THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\u'. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) u' x = (v:num->real) u'}) U') IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + X_GEN_TAC `i':num` THEN DISCH_TAC THEN BETA_TAC THEN + FIRST_ASSUM MATCH_ACCEPT_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [FIRST_ASSUM ACCEPT_TAC; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [FIRST_ASSUM ACCEPT_TAC; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* === PROB_DIFF_SUBSET === *) + SUBGOAL_THEN + `prob (p:A prob_space) (termA DIFF termB:A->bool) = + prob p termA - prob p termB` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_DIFF_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* === termA evaluation === *) + SUBGOAL_THEN + `prob (p:A prob_space) (termA:A->bool) = + prob p {x:A | x IN prob_carrier p /\ (Z:num->A->real) u x <= + (v:num->real) u} * + product R (\t. prob p {x | x IN prob_carrier p /\ Z t x <= + (a:num->real) t}) * + product U' (\u'. prob p {x | x IN prob_carrier p /\ Z u' x = v u'})` + SUBST1_TAC THENL + [REMOVE_THEN "termA_def" (fun ta -> REMOVE_THEN "termB_def" (fun _ -> + SUBST1_TAC(SYM ta))) THEN + SUBGOAL_THEN + `INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= (v:num->real) u} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U') + = INTERS (IMAGE (\t. {x | x IN prob_carrier p /\ Z t x <= + ((\t:num. if t = u then v u else a t) t)}) (u INSERT R)) INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U')` + SUBST1_TAC THENL + [REWRITE_TAC[IMAGE_CLAUSES; INTERS_INSERT] THEN + GEN_REWRITE_TAC LAND_CONV [GSYM INTER_ASSOC] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + GEN_REWRITE_TAC LAND_CONV [INTER_COMM] THEN + BINOP_TAC THENL + [REFL_TAC; + AP_TERM_TAC THEN + MATCH_MP_TAC IMAGE_EQ THEN X_GEN_TAC `t:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~(t:num = u)` (fun th -> REWRITE_TAC[th]) THEN + (UNDISCH_TAC `(t:num) IN R` THEN + UNDISCH_TAC `~(u:num IN R)` THEN MESON_TAC[])]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`(\t:num. if t = u then (v:num->real) u else (a:num->real) t)`; + `v:num->real`; `u INSERT (R:num->bool)`]) THEN + ASM_REWRITE_TAC[FINITE_INSERT; EMPTY_UNION; NOT_INSERT_EMPTY] THEN + DISCH_THEN SUBST1_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + BINOP_TAC THENL + [REFL_TAC; + BINOP_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `t:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~(t:num = u)` (fun th -> REWRITE_TAC[th]) THEN + (UNDISCH_TAC `(t:num) IN R` THEN + UNDISCH_TAC `~(u:num IN R)` THEN MESON_TAC[]); + REFL_TAC]]; ALL_TAC] THEN + (* === termB evaluation === *) + SUBGOAL_THEN + `prob (p:A prob_space) (termB:A->bool) = + prob p {x:A | x IN prob_carrier p /\ (Z:num->A->real) u x <= w} * + product R (\t. prob p {x | x IN prob_carrier p /\ Z t x <= + (a:num->real) t}) * + product U' (\u'. prob p {x | x IN prob_carrier p /\ Z u' x = + (v:num->real) u'})` + SUBST1_TAC THENL + [REMOVE_THEN "termB_def" (fun tb -> SUBST1_TAC(SYM tb)) THEN + SUBGOAL_THEN + `INTERS (IMAGE (\t. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) t x <= (a:num->real) t}) R) INTER + {x | x IN prob_carrier p /\ Z u x <= w} INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = + (v:num->real) u'}) U') + = INTERS (IMAGE (\t. {x | x IN prob_carrier p /\ Z t x <= + ((\t:num. if t = u then w else a t) t)}) (u INSERT R)) INTER + INTERS (IMAGE (\u'. {x | x IN prob_carrier p /\ Z u' x = v u'}) U')` + SUBST1_TAC THENL + [REWRITE_TAC[IMAGE_CLAUSES; INTERS_INSERT] THEN + GEN_REWRITE_TAC LAND_CONV [GSYM INTER_ASSOC] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + GEN_REWRITE_TAC LAND_CONV [INTER_COMM] THEN + BINOP_TAC THENL + [REFL_TAC; + AP_TERM_TAC THEN + MATCH_MP_TAC IMAGE_EQ THEN X_GEN_TAC `t:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~(t:num = u)` (fun th -> REWRITE_TAC[th]) THEN + (UNDISCH_TAC `(t:num) IN R` THEN + UNDISCH_TAC `~(u:num IN R)` THEN MESON_TAC[])]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`(\t:num. if t = u then w else (a:num->real) t)`; + `v:num->real`; `u INSERT (R:num->bool)`]) THEN + ASM_REWRITE_TAC[FINITE_INSERT; EMPTY_UNION; NOT_INSERT_EMPTY] THEN + DISCH_THEN SUBST1_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + BINOP_TAC THENL + [REFL_TAC; + BINOP_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `t:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~(t:num = u)` (fun th -> REWRITE_TAC[th]) THEN + (UNDISCH_TAC `(t:num) IN R` THEN + UNDISCH_TAC `~(u:num IN R)` THEN MESON_TAC[]); + REFL_TAC]]; ALL_TAC] THEN + (* === Point-mass probability: prob p {=v u} = pv - pw === *) + SUBGOAL_THEN + `prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) u x = (v:num->real) u} = + prob p {x | x IN prob_carrier p /\ Z u x <= v u} - + prob p {x | x IN prob_carrier p /\ Z u x <= w}` + SUBST1_TAC THENL + [USE_THEN "pm_diff" (fun th -> + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [th]) THEN + MATCH_MP_TAC PROB_DIFF_SUBSET THEN + CONJ_TAC THENL [FIRST_ASSUM MATCH_ACCEPT_TAC; ALL_TAC] THEN + CONJ_TAC THENL [FIRST_ASSUM MATCH_ACCEPT_TAC; ALL_TAC] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(x:A) IN prob_carrier p` THEN + DISCH_THEN(fun xth -> USE_THEN "gap" (fun gap -> + ASSUME_TAC(MP (SPEC `x:A` gap) xth))) THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* === Final algebra === *) + CONV_TAC(RAND_CONV(RAND_CONV(RAND_CONV(RAND_CONV + (ALPHA_CONV `u':num`))))) THEN + ABBREV_TAC `pv:real = prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) u x <= (v:num->real) u}` THEN + ABBREV_TAC `pw:real = prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) u x <= w}` THEN + ABBREV_TAC `pr:real = product R + (\t:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) t x <= (a:num->real) t})` THEN + ABBREV_TAC `pu:real = product (U':num->bool) + (\u'. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) u' x = (v:num->real) u'})` THEN + CONV_TAC REAL_RING; + ALL_TAC] THEN + (* === Outer wrapper === *) + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `U:num->bool`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL + [`a:num->real`; `v:num->real`; `R:num->bool`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]);; + +(* Corollary: pure multivariate point-mass factorization *) +let MUTUALLY_INDEP_POINT_MASS = prove + (`!p:A prob_space (Z:num->A->real) (v:num->real) (S:num->bool). + mutually_indep_rv_seq p Z /\ + (!i. i IN S ==> simple_rv p (Z i)) /\ + FINITE S /\ ~(S = {}) + ==> prob p + (INTERS (IMAGE (\i. {x | x IN prob_carrier p /\ Z i x = v i}) S)) + = product S (\i. prob p {x | x IN prob_carrier p /\ Z i x = v i})`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; + `(\n:num. &0):num->real`; `v:num->real`; + `EMPTY:num->bool`; `S:num->bool`] + MUTUALLY_INDEP_CDF_POINT_MASS_MIXED) THEN + ASM_REWRITE_TAC[FINITE_EMPTY; DISJOINT_EMPTY; UNION_EMPTY; + IMAGE_CLAUSES; INTERS_0; INTER_UNIV; PRODUCT_CLAUSES; REAL_MUL_LID]);; + +(* Helper: CDF events are in prob_events *) +let RV_CDF_EVENTS = prove + (`random_variable (p:A prob_space) (f:A->real) + ==> {x | x IN prob_carrier p /\ f x <= a} IN prob_events p`, + REWRITE_TAC[random_variable] THEN MESON_TAC[]);; + +(* Lemma A: Shifting preserves mutual independence *) +let MUTUALLY_INDEP_RV_SEQ_SHIFT = prove + (`!p:A prob_space (Z:num->A->real) c. + mutually_indep_rv_seq p Z + ==> mutually_indep_rv_seq p (\i x. Z i x + c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[mutually_indep_rv_seq] THEN STRIP_TAC THEN + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SHIFT THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `IMAGE (\n. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) n x + c <= (a:num->real) n}) S = + IMAGE (\n. {x | x IN prob_carrier p /\ Z n x <= a n - c}) S` + SUBST1_TAC THENL + [MATCH_MP_TAC IMAGE_EQ THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `!n:num. prob p {x:A | x IN prob_carrier p /\ + (Z:num->A->real) n x + c <= (a:num->real) n} = + prob p {x | x IN prob_carrier p /\ Z n x <= a n - c}` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`S:num->bool`; `\n:num. (a:num->real) n - c`]) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC);; + +(* Helper: Finite product of convergent sequences converges *) +let REALLIM_PRODUCT_FINITE = prove + (`!S:B->bool (f:B->num->real) (g:B->real). + FINITE S /\ + (!i. i IN S ==> ((\n. f i n) ---> g i) sequentially) + ==> ((\n. product S (\i. f i n)) ---> product S g) sequentially`, + REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[PRODUCT_CLAUSES; REALLIM_CONST]; + ALL_TAC] THEN + X_GEN_TAC `s:B` THEN X_GEN_TAC `S':B->bool` THEN STRIP_TAC THEN + X_GEN_TAC `f:B->num->real` THEN X_GEN_TAC `g:B->real` THEN + DISCH_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + MATCH_MP_TAC REALLIM_MUL THEN CONJ_TAC THENL + [UNDISCH_TAC `!i:B. i IN s INSERT S' + ==> ((\n. (f:B->num->real) i n) ---> (g:B->real) i) sequentially` THEN + DISCH_THEN(MP_TAC o SPEC `s:B`) THEN REWRITE_TAC[IN_INSERT]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + X_GEN_TAC `i:B` THEN DISCH_TAC THEN + UNDISCH_TAC `!i:B. i IN s INSERT S' + ==> ((\n. (f:B->num->real) i n) ---> (g:B->real) i) sequentially` THEN + DISCH_THEN(MP_TAC o SPEC `i:B`) THEN + ASM_REWRITE_TAC[IN_INSERT]]);; + +(* Lemma B: Strict inequality factorization for mutual independence *) +let MUTUALLY_INDEP_RV_SEQ_STRICT_INEQ = prove + (`!p:A prob_space (Z:num->A->real) (a:num->real) (S:num->bool). + mutually_indep_rv_seq p Z /\ FINITE S /\ ~(S = {}) + ==> prob p (INTERS (IMAGE (\i. {x | x IN prob_carrier p /\ + Z i x < a i}) S)) = + product S (\i. prob p {x | x IN prob_carrier p /\ Z i x < a i})`, + REPEAT GEN_TAC THEN REWRITE_TAC[mutually_indep_rv_seq] THEN + STRIP_TAC THEN + (* Measurability of joint approximants *) + SUBGOAL_THEN + `!n:num. INTERS (IMAGE (\i:num. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)}) S) + IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + ASM_SIMP_TAC[FINITE_IMP_COUNTABLE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC RV_CDF_EVENTS THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Monotonicity *) + SUBGOAL_THEN + `!n:num. INTERS (IMAGE (\i. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)}) S) SUBSET + INTERS (IMAGE (\i. {x | x IN prob_carrier p /\ + Z i x <= a i - &1 / &(SUC (SUC n))}) S)` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[SUBSET; IN_INTERS; FORALL_IN_IMAGE] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(a:num->real) i - &1 / &(SUC n)` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_LE_SUB_LADD; REAL_ARITH `a - x + y <= a <=> y <= x`] THEN + REWRITE_TAC[real_div; REAL_MUL_LID] THEN MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ARITH_TAC; + ALL_TAC] THEN + (* UNIONS identity *) + SUBGOAL_THEN + `UNIONS {INTERS (IMAGE (\i. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)}) S) | + n IN (:num)} = + INTERS (IMAGE (\i. {x | x IN prob_carrier p /\ Z i x < a i}) S)` + ASSUME_TAC THENL + [REWRITE_TAC[SIMPLE_IMAGE; UNIONS_IMAGE; IN_UNIV] THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTERS; FORALL_IN_IMAGE] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `n:num` ASSUME_TAC) THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&0 < &1 / &(SUC n)` MP_TAC THENL + [SIMP_TAC[REAL_LT_DIV; REAL_LT_01; REAL_OF_NUM_LT; LT_0]; + ASM_REAL_ARITH_TAC]; + DISCH_TAC THEN + SUBGOAL_THEN `(x:A) IN prob_carrier p` ASSUME_TAC THENL + [UNDISCH_TAC `~((S:num->bool) = {})` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `j:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ASM_REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!i:num. i IN S ==> + &0 < (a:num->real) i - (Z:num->A->real) i x` ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `&0 < inf(IMAGE (\i:num. (a:num->real) i - (Z:num->A->real) i x) S)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LT_INF_FINITE; FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + REWRITE_TAC[FORALL_IN_IMAGE] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPEC + `inf(IMAGE (\i:num. (a:num->real) i - (Z:num->A->real) i x) S)` + REAL_ARCH_INV) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `m:num` THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&1 / &(SUC m) <= inv(&m:real)` ASSUME_TAC THENL + [REWRITE_TAC[real_div; REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `inf(IMAGE (\i:num. (a:num->real) i - (Z:num->A->real) i x) S) + <= (a:num->real) i - (Z:num->A->real) i x` + ASSUME_TAC THENL + [MP_TAC(ISPEC + `IMAGE (\i:num. (a:num->real) i - (Z:num->A->real) i x) S` + INF_FINITE) THEN + ASM_SIMP_TAC[FINITE_IMAGE; IMAGE_EQ_EMPTY] THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN MATCH_MP_TAC THEN + REWRITE_TAC[IN_IMAGE] THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]; + ASM_REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Apply PROB_CONTINUITY_FROM_BELOW *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. INTERS (IMAGE (\i:num. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)}) S)`] + PROB_CONTINUITY_FROM_BELOW) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + (* REALLIM_UNIQUE *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\n:num. product S (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) i x <= + (a:num->real) i - &1 / &(SUC n)})` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [(* product seq --> prob p (joint < a_i) *) + SUBGOAL_THEN + `(\n:num. product S (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)})) = + (\n. prob p (INTERS (IMAGE (\i. {x | x IN prob_carrier p /\ + Z i x <= a i - &1 / &(SUC n)}) S)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `n:num` THEN + CONV_TAC SYM_CONV THEN + UNDISCH_TAC `!S' (a':num->real). FINITE S' /\ ~(S' = {}) ==> + prob (p:A prob_space) (INTERS (IMAGE (\i. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= a' i}) S')) = + product S' (\i. prob p {x | x IN prob_carrier p /\ Z i x <= a' i})` THEN + DISCH_THEN(MP_TAC o SPECL [`S:num->bool`; + `\i:num. (a:num->real) i - &1 / &(SUC n)`]) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC; + ASM_REWRITE_TAC[]]; + (* product seq --> product S (marginal < a_i) *) + MATCH_MP_TAC REALLIM_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x <= (a:num->real) i - &1 / &(SUC n)}`] + PROB_CONTINUITY_FROM_BELOW) THEN + BETA_TAC THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RV_CDF_EVENTS THEN + ASM_REWRITE_TAC[ETA_AX]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN X_GEN_TAC `z:A` THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(a:num->real) i - &1 / &(SUC n)` THEN + ASM_REWRITE_TAC[REAL_LE_SUB_LADD; + REAL_ARITH `a - x + y <= a <=> y <= x`] THEN + REWRITE_TAC[real_div; REAL_MUL_LID] THEN MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ARITH_TAC]; + SUBGOAL_THEN + `UNIONS {{x:A | x IN prob_carrier p /\ (Z:num->A->real) i x <= + (a:num->real) i - &1 / &(SUC n)} | n IN (:num)} = + {x | x IN prob_carrier p /\ Z i x < a i}` + SUBST1_TAC THENL + [REWRITE_TAC[SIMPLE_IMAGE; UNIONS_IMAGE; IN_UNIV] THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `z:A` THEN + EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&0 < &1 / &(SUC n)` MP_TAC THENL + [SIMP_TAC[REAL_LT_DIV; REAL_LT_01; REAL_OF_NUM_LT; LT_0]; + ASM_REAL_ARITH_TAC]; + STRIP_TAC THEN + SUBGOAL_THEN `?m:num. ~(m = 0) /\ &0 < inv(&m) /\ + inv(&m) < (a:num->real) i - (Z:num->A->real) i z` MP_TAC THENL + [REWRITE_TAC[GSYM REAL_ARCH_INV] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `m:num` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&1 / &(SUC m) <= inv(&m:real)` ASSUME_TAC THENL + [REWRITE_TAC[real_div; REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC]; + ASM_REAL_ARITH_TAC]]; + DISCH_THEN ACCEPT_TAC]]]);; + +(* Lemma C: nsfa preserves mutual independence *) +let MUTUALLY_INDEP_RV_SEQ_NSFA = prove + (`!p:A prob_space (Z:num->A->real) n. + mutually_indep_rv_seq p Z /\ + (!i x. x IN prob_carrier p ==> &0 <= Z i x) + ==> mutually_indep_rv_seq p (\i. nonneg_simple_fn_approx p (Z i) n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!m:num. random_variable (p:A prob_space) ((Z:num->A->real) m)` + ASSUME_TAC THENL + [ASM_MESON_TAC[mutually_indep_rv_seq]; ALL_TAC] THEN + REWRITE_TAC[mutually_indep_rv_seq] THEN CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_RV THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`S:num->bool`; `a:num->real`] THEN + STRIP_TAC THEN BETA_TAC THEN + ASM_CASES_TAC `?j:num. j IN S /\ (a:num->real) j < &0` THENL + [(* Some a_j < 0: nsfa >= 0 so sets are empty *) + FIRST_X_ASSUM(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) j) n x <= + (a:num->real) j} = {}` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `z:A` THEN STRIP_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `(Z:num->A->real) j`; `n:num`; `z:A`] + NONNEG_SIMPLE_FN_APPROX_NONNEG) THEN + ASM_SIMP_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\n':num. {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) S) = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTERS; NOT_IN_EMPTY; FORALL_IN_IMAGE] THEN + X_GEN_TAC `z:A` THEN REWRITE_TAC[FORALL_IN_IMAGE] THEN + DISCH_THEN(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `(Z:num->A->real) j`; `n:num`; `z:A`] + NONNEG_SIMPLE_FN_APPROX_NONNEG) THEN + ASM_SIMP_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[PROB_EMPTY] THEN + SUBGOAL_THEN `S = (j:num) INSERT (S DELETE j)` SUBST1_TAC THENL + [UNDISCH_TAC `(j:num) IN S` THEN SET_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES; FINITE_DELETE; IN_DELETE] THEN + ASM_REWRITE_TAC[PROB_EMPTY; REAL_MUL_LZERO]; + ALL_TAC] THEN + (* All a_i >= 0 *) + SUBGOAL_THEN `!i:num. i IN S ==> &0 <= (a:num->real) i` ASSUME_TAC THENL + [UNDISCH_TAC `~(?j:num. j IN S /\ (a:num->real) j < &0)` THEN + REWRITE_TAC[NOT_EXISTS_THM; DE_MORGAN_THM] THEN + MESON_TAC[REAL_NOT_LT]; + ALL_TAC] THEN + (* Apply NSFA_CDF_EQUIV to each index *) + SUBGOAL_THEN + `!i:num. i IN S ==> + (?c:real. !x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < c)) \/ + (!x. x IN prob_carrier p ==> + nonneg_simple_fn_approx p (Z i) n x <= a i)` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `(Z:num->A->real) i`; `n:num`; + `(a:num->real) i`] NSFA_CDF_EQUIV) THEN + ASM_SIMP_TAC[ETA_AX]; + ALL_TAC] THEN + (* Define partition: T' = strict indices *) + ABBREV_TAC `T' = {i:num | i IN S /\ + ~(!x:A. x IN prob_carrier p ==> + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i)}` THEN + SUBGOAL_THEN `(T':num->bool) SUBSET S` ASSUME_TAC THENL + [EXPAND_TAC "T'" THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `FINITE (T':num->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[FINITE_SUBSET]; ALL_TAC] THEN + (* For i in T': strict ineq characterization *) + SUBGOAL_THEN + `!i:num. i IN T' ==> + ?c:real. !x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < c)` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(i:num) IN S` ASSUME_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num` o + check(fun th -> try fst(dest_forall(concl th)) = `i:num` && + is_disj(snd(dest_imp(snd(dest_forall(concl th))))) with _ -> false)) THEN + ASM_REWRITE_TAC[] THEN + STRIP_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `(i:num) IN T'` THEN + EXPAND_TAC "T'" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* For i in S \ T': event = carrier *) + SUBGOAL_THEN + `!i:num. i IN S /\ ~(i IN T') ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i` ASSUME_TAC THENL + [UNDISCH_TAC `~((i:num) IN T')` THEN EXPAND_TAC "T'" THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THENL [MESON_TAC[]; ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Extract threshold function cc *) + ABBREV_TAC `cc = \i:num. @c:real. !x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < c)` THEN + SUBGOAL_THEN + `!i:num. i IN T' ==> + !x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < (cc:num->real) i)` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + UNDISCH_TAC `!i:num. i IN T' ==> + (?c:real. !x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < c))` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `c':real`) THEN + EXPAND_TAC "cc" THEN BETA_TAC THEN + CONV_TAC SELECT_CONV THEN EXISTS_TAC `c':real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Set equality for T' events *) + SUBGOAL_THEN + `!i:num. i IN T' ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = + {x | x IN prob_carrier p /\ Z i x < (cc:num->real) i}` + ASSUME_TAC THENL + [X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Case split: T' = {} vs T' <> {} *) + ASM_CASES_TAC `(T':num->bool) = {}` THENL + [(* T' = {}: all events = carrier *) + SUBGOAL_THEN `!i:num. i IN S ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + UNDISCH_TAC `!i:num. i IN S /\ ~(i IN T') ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ASM_REWRITE_TAC[NOT_IN_EMPTY]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) + (INTERS (IMAGE (\n':num. {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) S)) = &1` + SUBST1_TAC THENL + [SUBGOAL_THEN + `INTERS (IMAGE (\n':num. {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) S) = prob_carrier (p:A prob_space)` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTERS; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `~((S:num->bool) = {})` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `k:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + MESON_TAC[]; + DISCH_TAC THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!i:num. i IN S ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `(z:A) IN {x | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i}` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]]; + REWRITE_TAC[PROB_SPACE]]; + ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `product S (\n':num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) = + product S (\n':num. &1)` SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + BETA_TAC THEN ASM_SIMP_TAC[] THEN REWRITE_TAC[PROB_SPACE]; + REWRITE_TAC[GSYM(BETA_CONV `(\n':num. &1) n'`)] THEN + ASM_SIMP_TAC[PRODUCT_CONST; REAL_POW_ONE]]; + ALL_TAC] THEN + (* T' <> {}: use strict inequality factorization *) + (* Rewrite INTERS over S as INTERS over T' *) + SUBGOAL_THEN + `INTERS (IMAGE (\n':num. {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) S) = + INTERS (IMAGE (\i:num. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x < (cc:num->real) i}) T')` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTERS; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [DISCH_TAC THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(i:num) IN S` ASSUME_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!i:num. i IN T' ==> + (!x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < (cc:num->real) i))` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + DISCH_TAC THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN + ASM_CASES_TAC `(i:num) IN T'` THENL + [UNDISCH_TAC `!i:num. i IN T' ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = + {x | x IN prob_carrier p /\ Z i x < (cc:num->real) i}` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!i:num. i IN T' ==> + (!x:A. x IN prob_carrier p ==> + (nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i <=> Z i x < (cc:num->real) i))` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + SUBGOAL_THEN `(z:A) IN prob_carrier p` ASSUME_TAC THENL + [UNDISCH_TAC `~((T':num->bool) = {})` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `k:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN ASM_REWRITE_TAC[IN_ELIM_THM] THEN + MESON_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!i:num. i IN S /\ ~(i IN T') ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `(z:A) IN {x | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i}` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]]]; + ALL_TAC] THEN + (* Apply Lemma B *) + SUBGOAL_THEN + `prob (p:A prob_space) + (INTERS (IMAGE (\i:num. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) i x < (cc:num->real) i}) T')) = + product T' (\i. prob p {x | x IN prob_carrier p /\ Z i x < cc i})` + SUBST1_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_STRICT_INEQ THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Decompose product S = product T' * product (S\T') *) + SUBGOAL_THEN `(S:num->bool) = T' UNION (S DIFF T')` + (fun th -> GEN_REWRITE_TAC (RAND_CONV o LAND_CONV o ONCE_DEPTH_CONV) [th]) THENL + [ASM SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `product (T' UNION S DIFF T') + (\n':num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) = + product T' + (\n'. prob p {x | x IN prob_carrier p /\ + nonneg_simple_fn_approx p (Z n') n x <= a n'}) * + product (S DIFF T') + (\n'. prob p {x | x IN prob_carrier p /\ + nonneg_simple_fn_approx p (Z n') n x <= a n'})` + SUBST1_TAC THENL + [REWRITE_TAC[product] THEN + MATCH_MP_TAC(REWRITE_RULE[MONOIDAL_REAL_MUL] + (ISPEC `( * ):real->real->real` ITERATE_UNION)) THEN + ASM_SIMP_TAC[FINITE_DIFF] THEN ASM SET_TAC[]; + ALL_TAC] THEN + (* product (S\T') = 1 *) + SUBGOAL_THEN + `product (S DIFF T') + (\n':num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) = &1` + SUBST1_TAC THENL + [SUBGOAL_THEN + `product (S DIFF T') + (\n':num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) n') n x <= + (a:num->real) n'}) = + product (S DIFF T') (\n':num. &1)` SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `i:num` THEN + REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN BETA_TAC THEN + UNDISCH_TAC `!i:num. i IN S /\ ~(i IN T') ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = prob_carrier p` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[PROB_SPACE]; + ASM_SIMP_TAC[FINITE_DIFF; PRODUCT_CONST; REAL_POW_ONE]]; + ALL_TAC] THEN + (* Match products over T' *) + REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + BETA_TAC THEN + UNDISCH_TAC `!i:num. i IN T' ==> + {x:A | x IN prob_carrier p /\ + nonneg_simple_fn_approx p ((Z:num->A->real) i) n x <= + (a:num->real) i} = + {x | x IN prob_carrier p /\ Z i x < (cc:num->real) i}` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]));; + +(* Helper: product of indicator functions = indicator of INTERS *) +let PRODUCT_INDICATOR_FN_INTERS = prove + (`!R (A:num->(A->bool)) (x:A). FINITE R /\ ~(R = {}) + ==> product R (\i. indicator_fn (A i) x) = + indicator_fn (INTERS (IMAGE A R)) x`, + REWRITE_TAC[IMP_CONJ; RIGHT_FORALL_IMP_THM] THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN + REWRITE_TAC[NOT_INSERT_EMPTY] THEN + X_GEN_TAC `s:num` THEN X_GEN_TAC `R:num->bool` THEN STRIP_TAC THEN + X_GEN_TAC `A:num->(A->bool)` THEN X_GEN_TAC `z:A` THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES; IMAGE_CLAUSES; INTERS_INSERT] THEN + ASM_CASES_TAC `R:num->bool = {}` THENL + [ASM_REWRITE_TAC[PRODUCT_CLAUSES; IMAGE_CLAUSES; INTERS_0; + REAL_MUL_RID; INTER_UNIV]; + ASM_SIMP_TAC[] THEN REWRITE_TAC[INDICATOR_FN_INTER]]);; + +(* Helper: simple_rv for finite products *) +let SIMPLE_RV_PRODUCT_FINITE = prove + (`!p:A prob_space (f:num->A->real) (S:num->bool). + FINITE S /\ (!i. i IN S ==> simple_rv p (f i)) + ==> simple_rv p (\x. product S (\i. f i x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN + SPEC_TAC(`S:num->bool`, `S:num->bool`) THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [REWRITE_TAC[PRODUCT_CLAUSES; SIMPLE_RV_CONST; NOT_IN_EMPTY]; + ALL_TAC] THEN + X_GEN_TAC `s:num` THEN X_GEN_TAC `S':num->bool` THEN STRIP_TAC THEN + REWRITE_TAC[IN_INSERT] THEN DISCH_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(f:num->A->real) s`; + `\x:A. product S' (\i:num. (f:num->A->real) i x)`] + SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `s:num`) THEN REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + FIRST_X_ASSUM(fun th -> MESON_TAC[th])]);; + +(* Strengthened IH: E[prod_R indicators * prod_S functions] factors *) +let MUTUALLY_INDEP_INDICATOR_PRODUCT_EXPECTATION = prove + (`!p:A prob_space (Z:num->A->real). + mutually_indep_rv_seq p Z + ==> !S:num->bool. FINITE S + ==> !R:num->bool (v:num->real) (f:num->real->real). + FINITE R /\ DISJOINT R S /\ + (!i. i IN (R UNION S) ==> simple_rv p (Z i)) /\ + ~(R UNION S = {}) + ==> simple_expectation p + (\x. product R + (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x) * + product S (\i. f i (Z i x))) + = product R + (\i. prob p {x | x IN prob_carrier p /\ Z i x = v i}) * + product S + (\i. simple_expectation p (\x. f i (Z i x)))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [(* BASE CASE: S = {} *) + REWRITE_TAC[PRODUCT_CLAUSES; REAL_MUL_RID; UNION_EMPTY; DISJOINT_EMPTY] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. product R + (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = (v:num->real) i} + x)) = + simple_expectation p + (indicator_fn + (INTERS (IMAGE (\i. {z | z IN prob_carrier p /\ Z i z = v i}) R)))` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC PRODUCT_INDICATOR_FN_INTERS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\i:num. {z:A | z IN prob_carrier p /\ + (Z:num->A->real) i z = (v:num->real) i}) R) IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN X_GEN_TAC `j:num` THEN + DISCH_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN + REWRITE_TAC[ETA_AX] THEN + UNDISCH_TAC `!i:num. i IN R ==> + simple_rv (p:A prob_space) ((Z:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + ASM_SIMP_TAC[FINITE_IMAGE; FINITE_IMP_COUNTABLE; IMAGE_EQ_EMPTY]]; + ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR] THEN + MATCH_MP_TAC MUTUALLY_INDEP_POINT_MASS THEN ASM_REWRITE_TAC[]; + (* STEP CASE: s INSERT S' *) + ALL_TAC] THEN + X_GEN_TAC `s:num` THEN X_GEN_TAC `S':num->bool` THEN STRIP_TAC THEN + X_GEN_TAC `R:num->bool` THEN X_GEN_TAC `v:num->real` THEN + X_GEN_TAC `f:num->real->real` THEN STRIP_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + (* Establish key facts *) + SUBGOAL_THEN `~((s:num) IN R)` ASSUME_TAC THENL + [UNDISCH_TAC `DISJOINT R (s INSERT S':num->bool)` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT R (S':num->bool)` ASSUME_TAC THENL + [UNDISCH_TAC `DISJOINT R (s INSERT S':num->bool)` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) ((Z:num->A->real) s)` ASSUME_TAC THENL + [UNDISCH_TAC `!i:num. i IN R UNION s INSERT S' ==> + simple_rv p ((Z:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `s:num`) THEN + REWRITE_TAC[IN_UNION; IN_INSERT]; + ALL_TAC] THEN + ABBREV_TAC `Rs = IMAGE ((Z:num->A->real) s) (prob_carrier (p:A prob_space))` THEN + SUBGOAL_THEN `FINITE (Rs:real->bool)` ASSUME_TAC THENL + [EXPAND_TAC "Rs" THEN REWRITE_TAC[GSYM SIMPLE_IMAGE] THEN + UNDISCH_TAC `simple_rv (p:A prob_space) ((Z:num->A->real) s)` THEN + REWRITE_TAC[simple_rv] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!u:real. simple_rv (p:A prob_space) + (\x:A. product R (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. (f:num->real->real) i (Z i x))))` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\x:A. product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x)`; + `\x:A. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) s z = u} x * + product S' (\i:num. (f:num->real->real) i ((Z:num->A->real) i x))`] + SIMPLE_RV_MUL) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN REWRITE_TAC[ETA_AX] THEN + UNDISCH_TAC `!i:num. i IN R UNION s INSERT S' ==> + simple_rv (p:A prob_space) ((Z:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + REWRITE_TAC[IN_UNION; IN_INSERT; simple_rv] THEN + UNDISCH_TAC `(i:num) IN R` THEN MESON_TAC[]; + MP_TAC(ISPECL + [`p:A prob_space`; + `indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) s z = u}`; + `\x:A. product S' (\i:num. (f:num->real->real) i + ((Z:num->A->real) i x))`] + SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN REWRITE_TAC[ETA_AX] THEN + UNDISCH_TAC `simple_rv (p:A prob_space) ((Z:num->A->real) s)` THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + MATCH_MP_TAC SIMPLE_RV_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC SIMPLE_RV_REAL_COMPOSE THEN + UNDISCH_TAC `(i:num) IN S'` THEN + UNDISCH_TAC `!i:num. i IN R UNION s INSERT S' ==> + simple_rv (p:A prob_space) ((Z:num->A->real) i)` THEN + POP_ASSUM_LIST(K ALL_TAC) THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + REWRITE_TAC[IN_UNION; IN_INSERT; ETA_AX] THEN MESON_TAC[]]]; + ALL_TAC] THEN + (* Step 1: Expand f s (Z s x) and rewrite *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier (p:A prob_space) + ==> product R + (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + ((f:num->real->real) s (Z s x) * + product S' (\i. f i (Z i x))) = + sum Rs (\u. f s u * + (product R (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x)))))` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(f:num->real->real) s ((Z:num->A->real) s x) = + sum Rs (\u. f s u * + indicator_fn {z:A | z IN prob_carrier p /\ Z s z = u} x)` + SUBST1_TAC THENL + [EXPAND_TAC "Rs" THEN + MATCH_MP_TAC SIMPLE_RV_COMPOSE_SUM_INDICATOR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[GSYM SUM_LMUL; GSYM SUM_RMUL] THEN + MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN + ABBREV_TAC `a' = product R + (\i:num. indicator_fn + {z:A | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x)` THEN + ABBREV_TAC `b' = indicator_fn + {z:A | z IN prob_carrier p /\ (Z:num->A->real) s z = u} x` THEN + ABBREV_TAC `c' = product S' + (\i:num. (f:num->real->real) i ((Z:num->A->real) i x))` THEN + CONV_TAC REAL_RING; + ALL_TAC] THEN + (* Step 2: Replace via SIMPLE_EXPECTATION_EXT *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. product R + (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + ((f:num->real->real) s (Z s x) * + product S' (\i. f i (Z i x)))) = + simple_expectation p + (\x. sum Rs (\u. f s u * + (product R (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x))))))` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: Push E through sum *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\(u:real) (x:A). (f:num->real->real) s u * + (product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i:num. f i (Z i x))))`; + `Rs:real->bool`] + SIMPLE_EXPECTATION_SUM_FINITE) THEN + BETA_TAC THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\x:A. product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i:num. (f:num->real->real) i (Z i x)))`; + `(f:num->real->real) s u`] + SIMPLE_RV_CMUL) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + (* Step 4: For each term, extract CMUL *) + SUBGOAL_THEN + `!u:real. u IN Rs ==> + simple_expectation (p:A prob_space) (\x:A. + (f:num->real->real) s u * + (product R (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x))))) = + f s u * + simple_expectation p (\x. + product R (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x))))` + ASSUME_TAC THENL + [X_GEN_TAC `u:real` THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\x:A. product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i:num. (f:num->real->real) i (Z i x)))`; + `(f:num->real->real) s u`] + SIMPLE_EXPECTATION_CMUL) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `sum Rs (\u:real. simple_expectation (p:A prob_space) (\x:A. + (f:num->real->real) s u * + (product R (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x)))))) = + sum Rs (\u. f s u * + simple_expectation p (\x. + product R (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x)))))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 5: Merge indicator into R product and apply IH *) + SUBGOAL_THEN + `!u:real (x:A). + product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i:num. (f:num->real->real) i (Z i x))) = + product (s INSERT R) (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = + ((\i:num. if i = s then u else v i):num->real) i} x) * + product S' (\i. f i (Z i x))` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + SUBGOAL_THEN + `(\i:num. if i = s then (u:real) else (v:num->real) i) s = u` + SUBST1_TAC THENL [REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = + (if i = s then u else (v:num->real) i)} x) = + product R (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = v i} x)` + SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~((i:num) = s)` (fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `(i:num) IN R` THEN + UNDISCH_TAC `~((s:num) IN R)` THEN + POP_ASSUM_LIST(K ALL_TAC) THEN MESON_TAC[]; + ABBREV_TAC `a' = product R (\i:num. indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) i z = (v:num->real) i} x)` THEN + ABBREV_TAC `b' = indicator_fn + {z:A | z IN prob_carrier (p:A prob_space) /\ + (Z:num->A->real) s z = u} x` THEN + ABBREV_TAC `c' = product S' (\i:num. (f:num->real->real) i + ((Z:num->A->real) i x))` THEN + CONV_TAC REAL_RING]; + ALL_TAC] THEN + (* Step 6: Apply IH *) + SUBGOAL_THEN + `!u:real. + simple_expectation (p:A prob_space) + (\x:A. product (s INSERT R) (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + ((\i. if i = s then u else (v:num->real) i):num->real) i} x) * + product S' (\i. (f:num->real->real) i (Z i x))) = + product (s INSERT R) (\i. prob p + {x | x IN prob_carrier p /\ Z i x = + ((\i. if i = s then u else v i):num->real) i}) * + product S' (\i. simple_expectation p (\x. f i (Z i x)))` + ASSUME_TAC THENL + [GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`s INSERT R:num->bool`; + `(\i:num. if i = s then u else (v:num->real) i):num->real`; + `f:num->real->real`]) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[FINITE_INSERT] THEN + CONJ_TAC THENL + [UNDISCH_TAC `~((s:num) IN S')` THEN + UNDISCH_TAC `DISJOINT R (s INSERT S':num->bool)` THEN + POP_ASSUM_LIST(K ALL_TAC) THEN SET_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `i:num` THEN REWRITE_TAC[IN_UNION; IN_INSERT] THEN + STRIP_TAC THENL + [ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `simple_rv (p:A prob_space) ((Z:num->A->real) s)` THEN + MESON_TAC[]; + UNDISCH_TAC `!i:num. i IN R UNION s INSERT S' ==> + simple_rv (p:A prob_space) ((Z:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + REWRITE_TAC[IN_UNION; IN_INSERT] THEN + UNDISCH_TAC `(i:num) IN R` THEN MESON_TAC[]; + UNDISCH_TAC `!i:num. i IN R UNION s INSERT S' ==> + simple_rv (p:A prob_space) ((Z:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + REWRITE_TAC[IN_UNION; IN_INSERT] THEN + UNDISCH_TAC `(i:num) IN S'` THEN MESON_TAC[]]; + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_UNION; IN_INSERT] THEN + MESON_TAC[]]; + DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Step 7: Rewrite each sum term *) + SUBGOAL_THEN + `sum Rs (\u:real. + (f:num->real->real) s u * + simple_expectation (p:A prob_space) (\x:A. + product R (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. f i (Z i x))))) = + sum Rs (\u. + f s u * + (product (s INSERT R) (\i. prob p + {x | x IN prob_carrier p /\ Z i x = + ((\i. if i = s then u else v i):num->real) i}) * + product S' (\i. simple_expectation p (\x. f i (Z i x)))))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + CONV_TAC(BINOP_CONV BETA_CONV) THEN AP_TERM_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x:A. + product R (\i:num. indicator_fn + {z | z IN prob_carrier p /\ (Z:num->A->real) i z = + (v:num->real) i} x) * + (indicator_fn {z | z IN prob_carrier p /\ Z s z = u} x * + product S' (\i. (f:num->real->real) i (Z i x)))) = + simple_expectation p (\x. + product (s INSERT R) (\i. indicator_fn + {z | z IN prob_carrier p /\ Z i z = + ((\i. if i = s then u else v i):num->real) i} x) * + product S' (\i. f i (Z i x)))` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + CONV_TAC(BINOP_CONV BETA_CONV) THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`u:real`; `x:A`]) THEN + DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `u:real`) THEN + DISCH_THEN ACCEPT_TAC; + ALL_TAC] THEN + (* Step 8: Decompose product (s INSERT R) probs *) + SUBGOAL_THEN + `!u:real. + product (s INSERT R) (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) i x = + ((\i. if i = s then u else (v:num->real) i):num->real) i}) = + prob p {x | x IN prob_carrier p /\ Z s x = u} * + product R (\i. prob p {x | x IN prob_carrier p /\ Z i x = v i})` + ASSUME_TAC THENL + [GEN_TAC THEN ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + SUBGOAL_THEN + `(\i:num. if i = s then (u:real) else (v:num->real) i) s = u` + SUBST1_TAC THENL [REWRITE_TAC[]; ALL_TAC] THEN + AP_TERM_TAC THEN + MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + BETA_TAC THEN + SUBGOAL_THEN `~((i:num) = s)` (fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `(i:num) IN R` THEN + UNDISCH_TAC `~((s:num) IN R)` THEN + POP_ASSUM_LIST(K ALL_TAC) THEN MESON_TAC[]; + ALL_TAC] THEN + (* Step 9: Factor out constants *) + SUBGOAL_THEN + `sum Rs (\u:real. + (f:num->real->real) s u * + (product (s INSERT R) (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) i x = + ((\i. if i = s then u else (v:num->real) i):num->real) i}) * + product S' (\i. simple_expectation p (\x. f i (Z i x))))) = + product R (\i. prob p {x | x IN prob_carrier p /\ Z i x = v i}) * + product S' (\i. simple_expectation p (\x. f i (Z i x))) * + sum Rs (\u. f s u * prob p {x | x IN prob_carrier p /\ Z s x = u})` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM SUM_LMUL] THEN + MATCH_MP_TAC SUM_EQ THEN X_GEN_TAC `u:real` THEN DISCH_TAC THEN + BETA_TAC THEN + FIRST_X_ASSUM(fun th -> + if is_forall(concl th) then + ASSUME_TAC(CONV_RULE(DEPTH_CONV BETA_CONV) th) + else failwith "not forall") THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `d = (f:num->real->real) s u` THEN + ABBREV_TAC `e = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + (Z:num->A->real) s x = u}` THEN + ABBREV_TAC `g = product R (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) i x = + (v:num->real) i})` THEN + ABBREV_TAC `h = product S' (\i:num. simple_expectation (p:A prob_space) + (\x:A. (f:num->real->real) i ((Z:num->A->real) i x)))` THEN + CONV_TAC REAL_RING; + ALL_TAC] THEN + (* Step 10: Recognize sum as E[f s (Z s)] *) + SUBGOAL_THEN + `sum Rs (\u:real. (f:num->real->real) s u * + prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) s x = u}) = + simple_expectation p (\x. f s (Z s x))` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN EXPAND_TAC "Rs" THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_COMPOSE_SUM THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 11: Final rearrangement *) + ABBREV_TAC `P = product R (\i:num. prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (Z:num->A->real) i x = + (v:num->real) i})` THEN + ABBREV_TAC `E = simple_expectation (p:A prob_space) + (\x:A. (f:num->real->real) s ((Z:num->A->real) s x))` THEN + ABBREV_TAC `Q = product S' (\i:num. simple_expectation (p:A prob_space) + (\x:A. (f:num->real->real) i ((Z:num->A->real) i x)))` THEN + CONV_TAC REAL_RING);; + +(* Main Lemma D: simple_expectation of product factors *) +let MUTUALLY_INDEP_SIMPLE_EXPECTATION_PRODUCT = prove + (`!p:A prob_space (Z:num->A->real) (f:num->real->real) (S:num->bool). + mutually_indep_rv_seq p Z /\ + (!i. i IN S ==> simple_rv p (Z i)) /\ + FINITE S /\ ~(S = {}) + ==> simple_expectation p (\x. product S (\i. f i (Z i x))) = + product S (\i. simple_expectation p (\x. f i (Z i x)))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; `Z:num->A->real`] + MUTUALLY_INDEP_INDICATOR_PRODUCT_EXPECTATION) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `S:num->bool`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL + [`EMPTY:num->bool`; `(\n:num. &0):num->real`; + `f:num->real->real`]) THEN + REWRITE_TAC[FINITE_EMPTY; DISJOINT_EMPTY; UNION_EMPTY; + PRODUCT_CLAUSES; REAL_MUL_LID] THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN ACCEPT_TAC);; + +(* Helper: random_variable for finite products *) +let RANDOM_VARIABLE_PRODUCT_FINITE = prove + (`!p:A prob_space (f:num->A->real) (S:num->bool). + FINITE S /\ (!i. i IN S ==> random_variable p (f i)) + ==> random_variable p (\x. product S (\i. f i x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[IMP_CONJ] THEN + SPEC_TAC(`S:num->bool`, `S:num->bool`) THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN CONJ_TAC THENL + [REWRITE_TAC[PRODUCT_CLAUSES; RANDOM_VARIABLE_CONST; NOT_IN_EMPTY]; + ALL_TAC] THEN + X_GEN_TAC `s:num` THEN X_GEN_TAC `S':num->bool` THEN STRIP_TAC THEN + REWRITE_TAC[IN_INSERT] THEN DISCH_TAC THEN + ASM_SIMP_TAC[PRODUCT_CLAUSES] THEN + MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `s:num`) THEN REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_MESON_TAC[]]);; + +(* Expectation of product of powers factors for mutually independent bounded RVs. + Proof: approximate with simple functions, factor via Lemma D, take limits + using bounded convergence theorem. *) +let MUTUALLY_INDEP_EXPECTATION_PRODUCT_POW = prove + (`!p:A prob_space (Z:num->A->real) B (a:num->num) (S:num->bool). + mutually_indep_rv_seq p Z /\ + (!i x. x IN prob_carrier p ==> abs(Z i x) <= B) /\ + FINITE S /\ ~(S = {}) + ==> expectation p (\x. product S (\i. Z i x pow (a i))) = + product S (\i. expectation p (\x. Z i x pow (a i)))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 0: B >= 0 and carrier nonempty *) + SUBGOAL_THEN `?z:A. z IN prob_carrier p` STRIP_ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((Z:num->A->real) (ARB:num) z)` THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 1: random_variable for each Z_i *) + SUBGOAL_THEN `!i:num. random_variable (p:A prob_space) ((Z:num->A->real) i)` + ASSUME_TAC THENL + [ASM_MESON_TAC[mutually_indep_rv_seq]; ALL_TAC] THEN + (* Step 2: U_i = Z_i + B nonneg, mutually indep *) + SUBGOAL_THEN `!i:num x:A. x IN prob_carrier p + ==> &0 <= (Z:num->A->real) i x + B` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `abs((Z:num->A->real) i x) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `mutually_indep_rv_seq (p:A prob_space) + (\i (x:A). (Z:num->A->real) i x + B)` ASSUME_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: For each n, nsfa(U_i, n) are mutually indep *) + SUBGOAL_THEN `!n:num. mutually_indep_rv_seq (p:A prob_space) + (\i:num. nonneg_simple_fn_approx p (\x:A. (Z:num->A->real) i x + B) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_NSFA THEN + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 4: Wn(n,i) = nsfa(U_i, n) - B are mutually indep *) + SUBGOAL_THEN `!n:num. mutually_indep_rv_seq (p:A prob_space) + (\i:num (x:A). + nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B)` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[real_sub] THEN + MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_SHIFT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 5: simple_rv for Wn(n,i) *) + SUBGOAL_THEN `!n:num i:num. simple_rv (p:A prob_space) + (\x:A. nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B)` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n`; + `\t:real. t - B`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SHIFT THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN BETA_TAC THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Step 6: |Wn(n,i)| <= B *) + SUBGOAL_THEN `!n:num i:num (w:A). w IN prob_carrier p + ==> abs(nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n w - B) <= B` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n w <= + (Z:num->A->real) i w + B` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\y:A. (Z:num->A->real) i y + B`; `n:num`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN BETA_TAC THEN ASM_SIMP_TAC[]; + BETA_TAC THEN DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n w` ASSUME_TAC THENL + [REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; ALL_TAC] THEN + SUBGOAL_THEN `abs((Z:num->A->real) i w) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Step 7: Wn(n,i) -> Z_i pointwise *) + SUBGOAL_THEN `!i:num (w:A). w IN prob_carrier p + ==> ((\n. nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n w - B) ---> + (Z:num->A->real) i w) sequentially` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i w = + ((Z:num->A->real) i w + B) - B` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_SUB THEN REWRITE_TAC[REALLIM_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\y:A. (Z:num->A->real) i y + B`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_CONVERGES) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN BETA_TAC THEN ASM_SIMP_TAC[]; + BETA_TAC THEN DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Step 8: Per-step factorization via Lemma D + EXPECTATION_SIMPLE_AGREE *) + SUBGOAL_THEN `!n:num. expectation (p:A prob_space) + (\x:A. product S (\i:num. + (nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B) + pow (a i))) = + product S (\i. expectation p (\x. + (nonneg_simple_fn_approx p (\y. Z i y + B) n x - B) pow (a i)))` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `!i:num. simple_rv (p:A prob_space) + (\x:A. (nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B) + pow ((a:num->num) i))` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n x - B`; + `\t:real. t pow ((a:num->num) i)`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x:A. product S (\i:num. + (nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B) + pow ((a:num->num) i)))` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_PRODUCT_FINITE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE] THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\i:num (x:A). + nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) n x - B`; + `\i:num (t:real). t pow ((a:num->num) i)`; + `S:num->bool`] + MUTUALLY_INDEP_SIMPLE_EXPECTATION_PRODUCT) THEN + BETA_TAC THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[]; DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Step 9: Main argument via REALLIM_UNIQUE with BCT *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) (\x:A. + product S (\i:num. + (nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B) + pow ((a:num->num) i)))` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [(* LHS: BCT => E[prod Wn^a] -> E[prod Z^a] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `product (S:num->bool) (\i:num. B pow ((a:num->num) i))` THEN + REPEAT CONJ_TAC THENL + [(* rv: product Wn^a for each n *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_PRODUCT_FINITE THEN + ASM_REWRITE_TAC[] THEN X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + UNDISCH_TAC `!n:num i:num. simple_rv (p:A prob_space) + (\x:A. nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B)` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `i:num`]) THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + (* rv: product Z^a *) + MATCH_MP_TAC RANDOM_VARIABLE_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + (* bound: |prod Wn^a| <= prod B^a *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + ASM_SIMP_TAC[GSYM PRODUCT_ABS] THEN + MATCH_MP_TAC PRODUCT_LE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + (* bound: |prod Z^a| <= prod B^a *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + ASM_SIMP_TAC[GSYM PRODUCT_ABS] THEN + MATCH_MP_TAC PRODUCT_LE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + (* conv: prod Wn^a -> prod Z^a pointwise *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_SIMP_TAC[]]; + (* RHS: prod E[Wn^a] -> prod E[Z^a] *) + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REALLIM_PRODUCT_FINITE THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `i:num` THEN DISCH_TAC THEN + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `(B:real) pow ((a:num->num) i)` THEN REPEAT CONJ_TAC THENL + [(* rv: Wn^a for each n *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + UNDISCH_TAC `!n:num i:num. simple_rv (p:A prob_space) + (\x:A. nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) n x - B)` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `i:num`]) THEN + REWRITE_TAC[simple_rv] THEN MESON_TAC[]; + (* rv: Z^a *) + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + (* bound: |Wn^a| <= B^a *) + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + (* bound: |Z^a| <= B^a *) + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + (* conv: Wn^a -> Z^a pointwise *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_SIMP_TAC[]]]);; + +(* Helper: extract rv from indep_rv *) +let INDEP_RV_RV_LEFT = prove + (`!p:A prob_space X Y. indep_rv p X Y ==> random_variable p X`, + REWRITE_TAC[indep_rv] THEN MESON_TAC[]);; + +let INDEP_RV_RV_RIGHT = prove + (`!p:A prob_space X Y. indep_rv p X Y ==> random_variable p Y`, + REWRITE_TAC[indep_rv] THEN MESON_TAC[]);; + +(* Bridge: mutually_indep_rv_seq (infinite, CDF-based) implies + mutually_indep_rv (finite, point-mass-based) for simple RVs. *) +let MUTUALLY_INDEP_RV_SEQ_IMP_FINITE = prove + (`!p:A prob_space (X:num->A->real) n. + mutually_indep_rv_seq p X /\ (!k. k <= n ==> simple_rv p (X k)) + ==> mutually_indep_rv p X n`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[mutually_indep_rv] THEN + CONJ_TAC THENL + [ASM_MESON_TAC[mutually_indep_rv_seq]; ALL_TAC] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC MUTUALLY_INDEP_POINT_MASS THEN + ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[SUBSET; IN_NUMSEG; LE_0]);; + +(* Block independence for partial sums: E[S_n^m * Z_{n+1}^k] factors. + Proof: approximate Z_i via nsfa, use MUTUALLY_INDEP_RV_SUM_INDEP_RV for + independence, EXPECTATION_PRODUCT_POW_BOUNDED_INDEP for factorization, + then take limits via BCT (BOUNDED_CONVERGENCE_EXPECTATION). *) +let BLOCK_INDEP_SUM_POW = prove + (`!p:A prob_space (Z:num->A->real) B m k n. + mutually_indep_rv_seq p Z /\ + (!i x. x IN prob_carrier p ==> abs(Z i x) <= B) /\ + (!i. integrable p (Z i)) /\ + (!i. expectation p (Z i) = &0) + ==> expectation p (\x. sum(0..n) (\i. Z i x) pow m * Z (n + 1) x pow k) = + expectation p (\x. sum(0..n) (\i. Z i x) pow m) * + expectation p (\x. Z (n + 1) x pow k)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 0: basic setup *) + SUBGOAL_THEN `!i:num. random_variable (p:A prob_space) ((Z:num->A->real) i)` + ASSUME_TAC THENL + [ASM_MESON_TAC[mutually_indep_rv_seq]; ALL_TAC] THEN + SUBGOAL_THEN `?z:A. z IN prob_carrier p` STRIP_ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((Z:num->A->real) 0 z)` THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 1: Shifted infrastructure *) + SUBGOAL_THEN `mutually_indep_rv_seq (p:A prob_space) + (\i (x:A). (Z:num->A->real) i x + B)` ASSUME_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!N:num. mutually_indep_rv_seq (p:A prob_space) + (\i:num. nonneg_simple_fn_approx p (\x:A. (Z:num->A->real) i x + B) N)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_NSFA THEN + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `abs((Z:num->A->real) i x) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!N:num. mutually_indep_rv_seq (p:A prob_space) + (\i:num (x:A). + nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) N x - B)` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[real_sub] THEN + MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_SHIFT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!N:num i:num. simple_rv (p:A prob_space) + (\x:A. nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) N x - B)` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N`; + `\t:real. t - B`] SIMPLE_RV_REAL_COMPOSE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SHIFT THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `abs((Z:num->A->real) i x) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Step 2: |W_i^N| <= B *) + SUBGOAL_THEN `!N:num i:num (w:A). w IN prob_carrier p + ==> abs(nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N w - B) <= B` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N w <= Z i w + B` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\y:A. (Z:num->A->real) i y + B`; `N:num`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN BETA_TAC THEN + SUBGOAL_THEN `abs((Z:num->A->real) i w) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + BETA_TAC THEN DISCH_THEN ACCEPT_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N w` ASSUME_TAC THENL + [REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; ALL_TAC] THEN + SUBGOAL_THEN `abs((Z:num->A->real) i w) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + (* Step 3: W_i^N -> Z_i pointwise *) + SUBGOAL_THEN `!i:num (w:A). w IN prob_carrier p + ==> ((\N. nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N w - B) ---> + Z i w) sequentially` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i w = (Z i w + B) - B` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_SUB THEN REWRITE_TAC[REALLIM_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\y:A. (Z:num->A->real) i y + B`; `w:A`] + NONNEG_SIMPLE_FN_APPROX_CONVERGES) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN BETA_TAC THEN + SUBGOAL_THEN `abs((Z:num->A->real) i w) <= B` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + BETA_TAC THEN DISCH_THEN ACCEPT_TAC]; ALL_TAC] THEN + (* Step 4: finite mutual independence and indep_rv *) + SUBGOAL_THEN `!N:num. indep_rv (p:A prob_space) + (\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) N x - B)) + (\x. nonneg_simple_fn_approx p (\y. Z (n + 1) y + B) N x - B)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\i:num (x:A). nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N x - B`; + `n + 1`; `n:num`] MUTUALLY_INDEP_RV_SUM_INDEP_RV) THEN + REWRITE_TAC[ARITH_RULE `n < n + 1`] THEN + REWRITE_TAC[ARITH_RULE `SUC n = n + 1`] THEN + DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_IMP_FINITE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 5: Factorization for nsfa *) + SUBGOAL_THEN `!N:num. + expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) N x - B) + pow m * + (nonneg_simple_fn_approx p (\y. Z (n+1) y + B) N x - B) pow k) = + expectation p (\x. sum(0..n) (\i. + nonneg_simple_fn_approx p (\y. Z i y + B) N x - B) pow m) * + expectation p (\x. + (nonneg_simple_fn_approx p (\y. Z (n+1) y + B) N x - B) pow k)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N x - B)`; + `\x:A. nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) (n+1) y + B) N x - B`; + `m:num`; `k:num`; + `(&n + &1) * B`; `B:real`] + EXPECTATION_PRODUCT_POW_BOUNDED_INDEP) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INDEP_RV_RV_LEFT THEN + EXISTS_TAC `\x:A. nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) (n+1) y + B) N x - B` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INDEP_RV_RV_RIGHT THEN + EXISTS_TAC `\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) i y + B) N x - B)` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. B:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`N:num`; `x':num`; `x:A`]) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_LE_REFL]]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ASM_REWRITE_TAC[]]; + DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Step 6: (&n + &1) * B >= 0 *) + SUBGOAL_THEN `&0 <= (&n + &1) * B` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 7: REALLIM_UNIQUE *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC `\N:num. expectation (p:A prob_space) + (\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx p (\y:A. (Z:num->A->real) i y + B) N x - B) + pow m * + (nonneg_simple_fn_approx p (\y. Z (n+1) y + B) N x - B) pow k)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [(* LHS: BCT => E[prod_N] -> E[S^m * Z^k] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `((&n + &1) * B) pow m * B pow k` THEN REPEAT CONJ_TAC THENL + [(* rv for each N *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN + REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INDEP_RV_RV_LEFT THEN + EXISTS_TAC `\x:A. nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) (n+1) y + B) N x - B` THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INDEP_RV_RV_RIGHT THEN + EXISTS_TAC `\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) i y + B) N x - B)` THEN + ASM_REWRITE_TAC[]]; + (* rv for limit *) + MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN ASM_REWRITE_TAC[LE_REFL] THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]]; + (* bound for each N *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n) (\i:num. B:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`N:num`; `x':num`; `x:A`]) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_LE_REFL]]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]]; + (* bound for limit *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_LE_MUL2 THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n) (\i:num. B:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN + ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_LE_REFL]]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]]; + (* pointwise convergence *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_POW THEN + MP_TAC(ISPECL [`sequentially`; + `\i:num (N:num). nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N x - B`; + `\i:num. (Z:num->A->real) i x`; + `(0..n)`] REALLIM_SUM) THEN + REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT STRIP_TAC THEN ASM_MESON_TAC[]; + MATCH_MP_TAC REALLIM_POW THEN ASM_MESON_TAC[]]]; + (* RHS: rewrite using factorization, then REALLIM_MUL + BCT *) + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REALLIM_MUL THEN CONJ_TAC THENL + [(* E[(sum W)^m] -> E[S^m] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `((&n + &1) * B) pow m` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INDEP_RV_RV_LEFT THEN + EXISTS_TAC `\x:A. nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) (n+1) y + B) N x - B` THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN ASM_REWRITE_TAC[LE_REFL] THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n) (\i:num. B:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`N:num`; `x':num`; `x:A`]) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_LE_REFL]]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n) (\i:num. B:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_ABS_LE THEN REWRITE_TAC[FINITE_NUMSEG; IN_NUMSEG] THEN + ASM_MESON_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_MUL; REAL_LE_REFL]]; + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN + MP_TAC(ISPECL [`sequentially`; + `\i:num (N:num). nonneg_simple_fn_approx (p:A prob_space) + (\y:A. (Z:num->A->real) i y + B) N x - B`; + `\i:num. (Z:num->A->real) i x`; + `(0..n)`] REALLIM_SUM) THEN + REWRITE_TAC[FINITE_NUMSEG] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT STRIP_TAC THEN ASM_MESON_TAC[]]; + (* E[W_{n+1}^k] -> E[Z_{n+1}^k] *) + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `(B:real) pow k` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INDEP_RV_RV_RIGHT THEN + EXISTS_TAC `\x:A. sum(0..n) (\i. + nonneg_simple_fn_approx (p:A prob_space) + (\y. (Z:num->A->real) i y + B) N x - B)` THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_MESON_TAC[]]]]) + +(* Helper: expectation of sum of centered RVs is zero. *) +let EXPECTATION_SUM_CENTERED = prove + (`!p:A prob_space (Z:num->A->real) n. + (!i. integrable p (Z i)) /\ (!i. expectation p (Z i) = &0) + ==> expectation p (\x. sum(0..n) (\i. Z i x)) = &0`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN STRIP_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG] THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..n)(\i. (Z:num->A->real) i x)`; + `(Z:num->A->real) (SUC n)`] EXPECTATION_ADD) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN + ASM_REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + REWRITE_TAC[BETA_THM; ETA_AX] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x)) = &0` + SUBST1_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* Fourth moment bound for independent centered bounded RVs: + E[S_n^4] <= B^2 * E[S_n^2] + 3 * (E[S_n^2])^2. + Proof by induction on n. Base case uses pointwise Z^4 <= B^2*Z^2. + Inductive step expands (S+Z)^4, factors cross-moments via + BLOCK_INDEP_SUM_POW, kills odd terms by centering, and uses + the second moment recurrence E[(S+Z)^2] = E[S^2] + E[Z^2]. *) +let FOURTH_MOMENT_BOUND_INDEP_CENTERED = prove + (`!p:A prob_space (Z:num->A->real) B. + mutually_indep_rv_seq p Z /\ + &0 < B /\ + (!i. integrable p (Z i)) /\ + (!i. expectation p (Z i) = &0) /\ + (!i x. x IN prob_carrier p ==> abs(Z i x) <= B) /\ + (!i. integrable p (\x. Z i x pow 2)) + ==> !n. expectation p (\x. sum(0..n) (\i. Z i x) pow 4) <= + B pow 2 * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) + + &3 * expectation p (\x. sum(0..n) (\i. Z i x) pow 2) pow 2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN INDUCT_TAC THENL + [(* Base case: n = 0 *) + REWRITE_TAC[SUM_SING_NUMSEG] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `B pow 2 * expectation p (\x:A. (Z:num->A->real) 0 x pow 2)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `B pow 2 * expectation p (\x:A. (Z:num->A->real) 0 x pow 2) = + expectation p (\x. B pow 2 * Z 0 x pow 2)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_CMUL) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [SUBGOAL_THEN `random_variable p ((Z:num->A->real) 0)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [mutually_indep_rv_seq]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN DISCH_THEN(MP_TAC o SPEC `0`) THEN + REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `(B:real) pow 4` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[BETA_THM] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 + 2`; REAL_POW_ADD] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + SUBGOAL_THEN `(Z:num->A->real) 0 x pow 2 = abs(Z 0 x) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW2_ABS]; ALL_TAC] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + MATCH_MP_TAC(REAL_ARITH `&0 <= c ==> a <= a + c`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; REWRITE_TAC[REAL_LE_POW_2]]]; + (* Inductive step: n -> SUC n *) + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + SUBGOAL_THEN `!i. random_variable p ((Z:num->A->real) i)` ASSUME_TAC THENL + [ASM_MESON_TAC[mutually_indep_rv_seq]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> abs(sum(0..n)(\i. (Z:num->A->real) i x)) <= &(n + 1) * B` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n)(\i. abs((Z:num->A->real) i x))` THEN + REWRITE_TAC[SUM_ABS_NUMSEG] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n)(\i:num. B:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN ASM_SIMP_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `random_variable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + ASM_REWRITE_TAC[IN_NUMSEG; FINITE_NUMSEG]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 4)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 4` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> abs(sum(0..n)(\i. (Z:num->A->real) i x) + Z (SUC n) x) <= + &(n + 2) * B` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(sum(0..n)(\i. (Z:num->A->real) i x)) + + abs(Z (SUC n) x)` THEN + REWRITE_TAC[REAL_ABS_TRIANGLE] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&(n + 1) * B + B:real` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[]; + REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN + `random_variable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ADD THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. (sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x) pow 2) /\ + integrable p (\x. (sum(0..n)(\i. Z i x) + Z (SUC n) x) pow 4)` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THENL + [EXISTS_TAC `(&(n + 2) * B) pow 2`; + EXISTS_TAC `(&(n + 2) * B) pow 4`] THEN + (CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]); ALL_TAC] THEN + (* Establish cross-term integrabilities *) + SUBGOAL_THEN + `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 3 * (B:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[ETA_AX]]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MP_TAC(ISPECL [`abs(sum(0..n)(\i. (Z:num->A->real) i x)) pow 3`; + `(&(n+1) * B) pow 3`; + `abs((Z:num->A->real) (SUC n) x)`; + `B:real`] REAL_LE_MUL2) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + REWRITE_TAC[REAL_ABS_POS]; + ASM_SIMP_TAC[]]; + SIMP_TAC[]]]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2 * + Z (SUC n) x pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) pow 2 * (B:real) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MP_TAC(ISPECL [`abs(sum(0..n)(\i. (Z:num->A->real) i x)) pow 2`; + `(&(n+1) * B) pow 2`; + `abs((Z:num->A->real) (SUC n) x) pow 2`; + `(B:real) pow 2`] REAL_LE_MUL2) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + SIMP_TAC[]]]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x pow 3)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) * (B:real) pow 3` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MP_TAC(ISPECL [`abs(sum(0..n)(\i. (Z:num->A->real) i x))`; + `(&(n+1) * B):real`; + `abs((Z:num->A->real) (SUC n) x) pow 3`; + `(B:real) pow 3`] REAL_LE_MUL2) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_POS]; + ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_ABS_POS]; + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; + SIMP_TAC[]]]; ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (Z:num->A->real) (SUC n) x pow 4)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `(B:real) pow 4` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * B) * (B:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_MUL] THEN + MP_TAC(ISPECL [`abs(sum(0..n)(\i. (Z:num->A->real) i x))`; + `(&(n+1) * B):real`; + `abs((Z:num->A->real) (SUC n) x)`; + `B:real`] REAL_LE_MUL2) THEN + ANTS_TAC THENL + [REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + SIMP_TAC[]]]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x) /\ + integrable p (\x. &6 * sum(0..n)(\i. Z i x) pow 2 * + Z (SUC n) x pow 2) /\ + integrable p (\x. &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3)` + STRIP_ASSUME_TAC THENL + [REPEAT CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Fourth moment expansion *) + SUBGOAL_THEN + `expectation p (\x:A. (sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x) pow 4) = + expectation p (\x. sum(0..n)(\i. Z i x) pow 4) + + &6 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2) * + expectation p (\x. Z (SUC n) x pow 2) + + expectation p (\x. Z (SUC n) x pow 4)` SUBST1_TAC THENL + [(* Expand (S+Z)^4 pointwise *) + SUBGOAL_THEN `!x:A. (sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x) pow 4 = + sum(0..n)(\i. Z i x) pow 4 + + &4 * sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x + + &6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN CONV_TAC REAL_RING; ALL_TAC] THEN + (* Split E[S^4] from the rest *) + SUBGOAL_THEN + `(\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 4 + + &4 * sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x + + &6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4) = + (\x. (\x. sum(0..n)(\i. Z i x) pow 4) x + + (\x. &4 * sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x + + (&6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + (&4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4))) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `(\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 4)`; + `(\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x + + &6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4)`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC] THEN + AP_TERM_TAC THEN + (* Claim the 4-term split *) + SUBGOAL_THEN + `expectation p (\x:A. + &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * Z (SUC n) x + + &6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4) = + &4 * expectation p (\x. sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x) + + &6 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2 * + Z (SUC n) x pow 2) + + &4 * expectation p (\x. sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3) + + expectation p (\x. Z (SUC n) x pow 4)` SUBST1_TAC THENL + [(* Split via chain of EXPECTATION_ADD + EXPECTATION_CMUL *) + SUBGOAL_THEN + `(\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x + + &6 * sum(0..n)(\i. Z i x) pow 2 * Z (SUC n) x pow 2 + + &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3 + + Z (SUC n) x pow 4) = + (\x. (\x. &4 * sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x) x + + (\x. (\x. &6 * sum(0..n)(\i. Z i x) pow 2 * + Z (SUC n) x pow 2) x + + (\x. (\x. &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3) x + + (\x. Z (SUC n) x pow 4) x) x) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; BETA_THM]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x`; + `\x:A. (\x. &6 * sum(0..n)(\i. (Z:num->A->real) i x) pow 2 * + Z (SUC n) x pow 2) x + + (\x. (\x. &4 * sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3) x + + (\x. Z (SUC n) x pow 4) x) x`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN REWRITE_TAC[BETA_THM] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN REWRITE_TAC[BETA_THM] THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x) = + &4 * expectation p (\x. sum(0..n)(\i. Z i x) pow 3 * Z (SUC n) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + AP_TERM_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &6 * sum(0..n)(\i. (Z:num->A->real) i x) pow 2 * + Z (SUC n) x pow 2`; + `\x:A. (\x. &4 * sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x pow 3) x + + (\x. Z (SUC n) x pow 4) x`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN REWRITE_TAC[BETA_THM] THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. &6 * sum(0..n)(\i. (Z:num->A->real) i x) pow 2 * + Z (SUC n) x pow 2) = + &6 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2 * + Z (SUC n) x pow 2)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + AP_TERM_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x pow 3`; + `\x:A. (Z:num->A->real) (SUC n) x pow 4`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM; ETA_AX] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[]; DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. &4 * sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x pow 3) = + &4 * expectation p (\x. sum(0..n)(\i. Z i x) * Z (SUC n) x pow 3)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_CMUL THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; ALL_TAC] THEN + (* Now use BLOCK_INDEP_SUM_POW and centering *) + SUBGOAL_THEN `SUC n = n + 1` ASSUME_TAC THENL [ARITH_TAC; ALL_TAC] THEN + (* Factor E[S^3*Z] = E[S^3]*E[Z] via BLOCK_INDEP_SUM_POW *) + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 3 * + Z (SUC n) x) = + expectation p (\x. sum(0..n)(\i. Z i x) pow 3) * + expectation p (\x. Z (SUC n) x pow 1)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `B:real`; + `3`; `1`; `n:num`] BLOCK_INDEP_SUM_POW) THEN + ASM_REWRITE_TAC[REAL_POW_1; ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\x:A. (Z:num->A->real) (SUC n) x pow 1) = &0` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_1; ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_LID] THEN + (* Factor E[S^2*Z^2] = E[S^2]*E[Z^2] *) + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2 * + Z (SUC n) x pow 2) = + expectation p (\x. sum(0..n)(\i. Z i x) pow 2) * + expectation p (\x. Z (SUC n) x pow 2)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `B:real`; + `2`; `2`; `n:num`] BLOCK_INDEP_SUM_POW) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Factor E[S*Z^3] = E[S]*E[Z^3], then E[S] = 0 *) + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x pow 3) = + expectation p (\x. sum(0..n)(\i. Z i x)) * + expectation p (\x. Z (SUC n) x pow 3)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `B:real`; + `1`; `3`; `n:num`] BLOCK_INDEP_SUM_POW) THEN + ASM_REWRITE_TAC[REAL_POW_1; ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x)) = &0` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUM_CENTERED THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; ALL_TAC] THEN + (* Second moment recurrence: E[(S+Z)^2] = E[S^2] + E[Z^2] *) + SUBGOAL_THEN + `expectation p (\x:A. (sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x) pow 2) = + expectation p (\x. sum(0..n)(\i. Z i x) pow 2) + + expectation p (\x. Z (SUC n) x pow 2)` SUBST1_TAC THENL + [SUBGOAL_THEN `!x:A. (sum(0..n)(\i. (Z:num->A->real) i x) + + Z (SUC n) x) pow 2 = + sum(0..n)(\i. Z i x) pow 2 + + &2 * sum(0..n)(\i. Z i x) * Z (SUC n) x + + Z (SUC n) x pow 2` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN CONV_TAC REAL_RING; ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2 + + &2 * sum(0..n)(\i. Z i x) * Z (SUC n) x + + Z (SUC n) x pow 2) = + (\x. (\x. sum(0..n)(\i. Z i x) pow 2) x + + (\x. &2 * sum(0..n)(\i. Z i x) * Z (SUC n) x + + Z (SUC n) x pow 2) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; BETA_THM]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2`; + `\x:A. &2 * sum(0..n)(\i. (Z:num->A->real) i x) * Z (SUC n) x + + Z (SUC n) x pow 2`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `(\x:A. &2 * sum(0..n)(\i. (Z:num->A->real) i x) * Z (SUC n) x + + Z (SUC n) x pow 2) = + (\x. (\x. &2 * sum(0..n)(\i. Z i x) * Z (SUC n) x) x + + (\x. Z (SUC n) x pow 2) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; BETA_THM]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &2 * sum(0..n)(\i. (Z:num->A->real) i x) * Z (SUC n) x`; + `\x:A. (Z:num->A->real) (SUC n) x pow 2`] EXPECTATION_ADD) THEN + REWRITE_TAC[BETA_THM; ETA_AX] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. &2 * sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x) = &0` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `&2`; + `\x:A. sum(0..n)(\i. (Z:num->A->real) i x) * Z (SUC n) x`] + EXPECTATION_CMUL) THEN + REWRITE_TAC[BETA_THM] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[]; DISCH_THEN SUBST1_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) * + Z (SUC n) x) = &0` SUBST1_TAC THENL + [SUBGOAL_THEN `SUC n = n + 1` ASSUME_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `B:real`; + `1`; `1`; `n:num`] BLOCK_INDEP_SUM_POW) THEN + ASM_REWRITE_TAC[REAL_POW_1; ETA_AX] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x)) = &0` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUM_CENTERED THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; + REAL_ARITH_TAC]; + REAL_ARITH_TAC]; ALL_TAC] THEN + (* Final algebra *) + SUBGOAL_THEN + `expectation p (\x:A. (Z:num->A->real) (SUC n) x pow 4) <= + B pow 2 * expectation p (\x. Z (SUC n) x pow 2)` ASSUME_TAC THENL + [SUBGOAL_THEN + `B pow 2 * expectation p (\x:A. (Z:num->A->real) (SUC n) x pow 2) = + expectation p (\x. B pow 2 * Z (SUC n) x pow 2)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_CMUL) THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[BETA_THM] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ARITH_RULE `4 = 2 + 2`; REAL_POW_ADD] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + SUBGOAL_THEN `(Z:num->A->real) (SUC n) x pow 2 = abs(Z (SUC n) x) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW2_ABS]; ALL_TAC] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN + `&0 <= expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + SUBGOAL_THEN + `&0 <= expectation p (\x:A. (Z:num->A->real) (SUC n) x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `(B pow 2 * expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2) + + &3 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2) pow 2) + + &6 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2) * + expectation p (\x. Z (SUC n) x pow 2) + + B pow 2 * expectation p (\x:A. (Z:num->A->real) (SUC n) x pow 2)` THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(expectation p (\x:A. sum(0..n)(\i. (Z:num->A->real) i x) pow 2) + + expectation p (\x. Z (SUC n) x pow 2)) pow 2 = + expectation p (\x. sum(0..n)(\i. Z i x) pow 2) pow 2 + + &2 * expectation p (\x. sum(0..n)(\i. Z i x) pow 2) * + expectation p (\x. Z (SUC n) x pow 2) + + expectation p (\x. Z (SUC n) x pow 2) pow 2` SUBST1_TAC THENL + [CONV_TAC REAL_RING; ALL_TAC] THEN + GEN_REWRITE_TAC (RAND_CONV o LAND_CONV) [REAL_ADD_LDISTRIB] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= v2 ==> (a + &3 * c) + (&6 * b + d) <= + (a + d) + &3 * (c + &2 * b + v2)`) THEN + REWRITE_TAC[REAL_LE_POW_2]]);; + +(* Mutual independence is preserved by clamping *) +let MUTUALLY_INDEP_RV_SEQ_CLAMP = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ mutually_indep_rv_seq p X + ==> mutually_indep_rv_seq p (\i x. min(max(X i x) (--c)) c)`, + REPEAT GEN_TAC THEN REWRITE_TAC[mutually_indep_rv_seq] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + STRIP_TAC THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CLAMP THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + ASM_CASES_TAC `?n:num. n IN S /\ (a:num->real) n < --c` THENL + [FIRST_X_ASSUM(X_CHOOSE_THEN `n0:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n0 x) (--c)) c <= (a:num->real) n0} = {}` + ASSUME_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `x:A` THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\n. {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= (a:num->real) n}) S) = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTERS; NOT_IN_EMPTY] THEN + X_GEN_TAC `x:A` THEN REWRITE_TAC[NOT_FORALL_THM] THEN + EXISTS_TAC `({}:A->bool)` THEN + REWRITE_TAC[NOT_IN_EMPTY; IN_IMAGE; NOT_IMP] THEN + EXISTS_TAC `n0:num` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[PROB_EMPTY] THEN CONV_TAC SYM_CONV THEN + ASM_SIMP_TAC[PRODUCT_EQ_0] THEN + EXISTS_TAC `n0:num` THEN ASM_REWRITE_TAC[] THEN + ASM_REWRITE_TAC[PROB_EMPTY]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. n IN S ==> ~((a:num->real) n < --c)` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `!n:num. n IN S ==> (a:num->real) n >= c` THENL + [SUBGOAL_THEN + `!n. n IN S ==> + {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n} = prob_carrier p` + ASSUME_TAC THENL + [X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\n. {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n}) S = + IMAGE (\n:num. prob_carrier p:A->bool) S` + SUBST1_TAC THENL + [MATCH_MP_TAC IMAGE_EQ THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!n. n IN S ==> + prob p {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n} = &1` + (fun th -> SIMP_TAC[th]) THENL + [X_GEN_TAC `n:num` THEN DISCH_TAC THEN ASM_SIMP_TAC[] THEN + REWRITE_TAC[PROB_SPACE]; ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\n:num. prob_carrier p:A->bool) S = {prob_carrier p}` + SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + REWRITE_TAC[INTERS_1; PROB_SPACE] THEN + ASM_SIMP_TAC[PRODUCT_CONST; REAL_POW_ONE]; + ALL_TAC] THEN + ABBREV_TAC `S' = {n:num | n IN S /\ ~((a:num->real) n >= c)}` THEN + SUBGOAL_THEN + `(S':num->bool) SUBSET S /\ FINITE S' /\ ~(S' = {})` + STRIP_ASSUME_TAC THENL + [EXPAND_TAC "S'" THEN REPEAT CONJ_TAC THENL + [SET_TAC[]; + MATCH_MP_TAC FINITE_RESTRICT THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[EXTENSION; NOT_IN_EMPTY; IN_ELIM_THM; + NOT_FORALL_THM] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. n IN S' ==> ~((a:num->real) n < --c) /\ ~(a n >= c)` + ASSUME_TAC THENL + [X_GEN_TAC `n:num` THEN EXPAND_TAC "S'" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. n IN S' ==> + {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n} = + {x | x IN prob_carrier p /\ X n x <= a n}` + ASSUME_TAC THENL + [X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. n IN S DIFF S' ==> + {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n} = prob_carrier p` + ASSUME_TAC THENL + [X_GEN_TAC `n:num` THEN REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN + SUBGOAL_THEN `(a:num->real) n >= c` ASSUME_TAC THENL + [ASM_CASES_TAC `(a:num->real) n >= c` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~((n:num) IN S')` THEN + EXPAND_TAC "S'" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THENL [MESON_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `S = (S':num->bool) UNION (S DIFF S')` + (fun th -> + GEN_REWRITE_TAC (LAND_CONV o ONCE_DEPTH_CONV) [th] THEN + GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) [th]) THENL + [ASM SET_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IMAGE_UNION; INTERS_UNION] THEN + SUBGOAL_THEN + `IMAGE (\n. {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n}) S' = + IMAGE (\n. {x | x IN prob_carrier p /\ X n x <= a n}) S'` + SUBST1_TAC THENL + [MATCH_MP_TAC IMAGE_EQ THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\n. {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n}) (S DIFF S') = + IMAGE (\n:num. prob_carrier p:A->bool) (S DIFF S')` + SUBST1_TAC THENL + [MATCH_MP_TAC IMAGE_EQ THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `S DIFF (S':num->bool) = {}` THENL + [SUBGOAL_THEN `S = (S':num->bool)` SUBST_ALL_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[IMAGE_CLAUSES; INTERS_0; INTER_UNIV; UNION_EMPTY] THEN + SUBGOAL_THEN + `product S' (\n. prob p {x:A | x IN prob_carrier p /\ + min (max ((X:num->A->real) n x) (--c)) c <= + (a:num->real) n}) = + product S' (\n. prob p {x | x IN prob_carrier p /\ X n x <= a n})` + SUBST1_TAC THENL + [MATCH_MP_TAC PRODUCT_EQ THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + BETA_TAC THEN AP_TERM_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`S':num->bool`; `a:num->real`]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\n:num. prob_carrier p:A->bool) (S DIFF S') = {prob_carrier p}` + SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + REWRITE_TAC[INTERS_1] THEN + SUBGOAL_THEN + `INTERS (IMAGE (\n. {x:A | x IN prob_carrier p /\ + (X:num->A->real) n x <= (a:num->real) n}) S') SUBSET + prob_carrier p` + (fun th -> + REWRITE_TAC[MATCH_MP + (prove(`!s:A->bool t. s SUBSET t ==> s INTER t = s`, + SET_TAC[])) th]) THENL + [REWRITE_TAC[SUBSET; IN_INTERS; IN_IMAGE] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + UNDISCH_TAC `~((S':num->bool) = {})` THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `n0:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | x IN prob_carrier p /\ + (X:num->A->real) n0 x <= (a:num->real) n0}`) THEN + ANTS_TAC THENL + [EXISTS_TAC `n0:num` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SIMP_TAC[IN_ELIM_THM]; + ALL_TAC] THEN + SUBGOAL_THEN + `FINITE (S DIFF (S':num->bool)) /\ DISJOINT S' (S DIFF S')` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC FINITE_DIFF THEN ASM_REWRITE_TAC[]; + SET_TAC[]]; + ALL_TAC] THEN + ASM_SIMP_TAC[PRODUCT_UNION] THEN + REWRITE_TAC[PROB_SPACE] THEN + SUBGOAL_THEN `product (S DIFF (S':num->bool)) (\x:num. &1) = &1` + SUBST1_TAC THENL + [ASM_SIMP_TAC[PRODUCT_CONST; REAL_POW_ONE]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RID] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`S':num->bool`; `a:num->real`]) THEN + ASM_REWRITE_TAC[]);; + +(* Mutual independence with index-dependent shift *) +let MUTUALLY_INDEP_RV_SEQ_SHIFT_VARYING = prove + (`!p:A prob_space (Z:num->A->real) (d:num->real). + mutually_indep_rv_seq p Z + ==> mutually_indep_rv_seq p (\i x. Z i x - d i)`, + REPEAT GEN_TAC THEN REWRITE_TAC[mutually_indep_rv_seq] THEN STRIP_TAC THEN + CONJ_TAC THENL + [GEN_TAC THEN REWRITE_TAC[real_sub] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SHIFT THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `IMAGE (\n. {x:A | x IN prob_carrier p /\ + (Z:num->A->real) n x - (d:num->real) n <= + (a:num->real) n}) S = + IMAGE (\n. {x | x IN prob_carrier p /\ + Z n x <= a n + d n}) S` + SUBST1_TAC THENL + [MATCH_MP_TAC IMAGE_EQ THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `!n:num. prob p {x:A | x IN prob_carrier p /\ + (Z:num->A->real) n x - (d:num->real) n <= + (a:num->real) n} = + prob p {x | x IN prob_carrier p /\ Z n x <= a n + d n}` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL + [`S:num->bool`; + `\n:num. (a:num->real) n + (d:num->real) n`]) THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN DISCH_THEN ACCEPT_TAC);; + +(* ================================================================== *) +(* THREE_SERIES_NECESSITY_INDEP: Three-series necessity for indep RVs *) +(* Independent proof using FOURTH_MOMENT_BOUND_INDEP_CENTERED and *) +(* SUMMABLE_VARIANCE_FROM_CONVERGENCE_V2, rather than the crossing *) +(* condition approach of THREE_SERIES_NECESSITY. *) +(* ================================================================== *) +let EXPECTATION_SUMMABLE_CHEBYSHEV = prove + (`!(p:A prob_space) (Y:num->A->real) (Z:num->A->real) c. + &0 < c /\ + (!n. integrable p (\x. Y n x)) /\ + (!n x. abs(Y n x) <= c) /\ + (!n x. Y n x - expectation p (\y. Y n y) = Z n x) /\ + mutually_indep_rv_seq p Z /\ + (!n. integrable p (\x. Z n x)) /\ + (!n. expectation p (\x. Z n x) = &0) /\ + (!n x. x IN prob_carrier p ==> abs(Z n x) <= &2 * c) /\ + (!n. integrable p (\x. Z n x pow 2)) /\ + (!n. &0 <= variance p (\x. Y n x)) /\ + real_summable (from 0) (\n. variance p (\x. Y n x)) /\ + almost_surely p + {x | ?L. ((\n. sum(0..n) (\i. Y i x)) ---> L) sequentially} + ==> real_summable (from 0) (\n. expectation p (\x. Y n x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Proof by contradiction *) + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN DISCH_TAC THEN + (* Negate REAL_SUMMABLE_CAUCHY: exists eps, forall N, exists m,n >= N + with |sum(from 0 INTER m..n)(E[Y])| >= eps *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE RAND_CONV + [REAL_SUMMABLE_CAUCHY]) THEN + DISCH_THEN(fun th -> MP_TAC(REWRITE_RULE + [NOT_FORALL_THM; NOT_IMP; NOT_EXISTS_THM; + REAL_NOT_LT; FROM_0_INTER_NUMSEG] th)) THEN + DISCH_THEN(X_CHOOSE_THEN `eps:real` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "NC")) THEN + (* From summable Var(Y), get tail bound K0 *) + SUBGOAL_THEN `!n. &0 <= variance p (\x:A. (Y:num->A->real) n x)` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPEC `\n. variance (p:A prob_space) (\x:A. (Y:num->A->real) n x)` + REAL_SUMMABLE_TAIL_BOUND) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `(eps / &2) pow 2 / &2`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC REAL_LT_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `K0:num`) THEN + (* Var(Z_n) = Var(Y_n) *) + SUBGOAL_THEN `!n. variance p (\x:A. (Z:num->A->real) n x) = + variance p (\x. (Y:num->A->real) n x)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + SUBGOAL_THEN `(\x:A. (Y:num->A->real) n x - + expectation p (\y. Y n y)) = + (\x. Y n x + (--expectation p (\y. Y n y)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC VARIANCE_SHIFT THEN + GEN_REWRITE_TAC RAND_CONV [GSYM ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Covariance of Z_i, Z_j = 0 for i != j *) + SUBGOAL_THEN `!i j. ~(i = j) ==> + covariance p (\x:A. (Z:num->A->real) i x) + (\x. Z j x) = &0` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MATCH_MP_TAC COVARIANCE_BOUNDED_INDEP THEN + MAP_EVERY EXISTS_TAC [`&2 * c`; `&2 * c`] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[]; + SUBGOAL_THEN `(\x:A. (Z:num->A->real) i x) = Z i` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. (Z:num->A->real) j x) = Z j` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + UNDISCH_TAC `mutually_indep_rv_seq p (Z:num->A->real)` THEN + DISCH_THEN(MP_TAC o MATCH_MP MUTUALLY_INDEP_RV_SEQ_PAIRWISE) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Define C_K = non-Cauchy set at rate eps/2 from index K *) + ABBREV_TAC `C_K = \K:num. UNIONS {UNIONS + {{(x:A) | x IN prob_carrier p /\ + abs(sum(K + a..K + a + b) (\i. (Y:num->A->real) i x)) >= + eps / &2} | b IN (:num)} | a IN (:num)}` THEN + (* Each inner set is an event *) + SUBGOAL_THEN `!K a b. + {x:A | x IN prob_carrier p /\ + abs(sum(K + a..K + a + b) (\i. (Y:num->A->real) i x)) >= + eps / &2} IN prob_events p` (LABEL_TAC "Sev") THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + SUBGOAL_THEN `(\x:A. sum(K + a..K + a + b) + (\i. (Y:num->A->real) i x)) = + (\x. sum(0..b) (\i. Y (K + a + i) x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; ADD_ASSOC; SUM_REINDEX_SHIFT]; ALL_TAC] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* C_K is an event for each K *) + SUBGOAL_THEN `!K. (C_K:num->A->bool) K IN prob_events p` + (LABEL_TAC "Cev") THENL + [GEN_TAC THEN EXPAND_TAC "C_K" THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SIMPLE_IMAGE] THEN MATCH_MP_TAC COUNTABLE_IMAGE THEN + REWRITE_TAC[NUM_COUNTABLE]]; + REWRITE_TAC[SIMPLE_IMAGE] THEN MATCH_MP_TAC COUNTABLE_IMAGE THEN + REWRITE_TAC[NUM_COUNTABLE]]; + ALL_TAC] THEN + (* C_K is decreasing: C_{SUC K} SUBSET C_K *) + SUBGOAL_THEN `!K. (C_K:num->A->bool) (SUC K) SUBSET C_K K` + (LABEL_TAC "Cdec") THENL + [GEN_TAC THEN EXPAND_TAC "C_K" THEN + REWRITE_TAC[SUBSET; UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(X_CHOOSE_THEN `a:num` MP_TAC) THEN + DISCH_THEN(X_CHOOSE_THEN `b:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `a + 1` THEN EXISTS_TAC `b:num` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `K + (a + 1) = SUC K + a` SUBST1_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `K + (a + 1) + b = SUC K + a + b` SUBST1_TAC THENL + [ARITH_TAC; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* INTERS {C_K} SUBSET {x | sum Y not Cauchy at rate eps/2} *) + (* Actually: INTERS {C_K} has prob 0 because sum Y converges a.s. *) + SUBGOAL_THEN `prob p (INTERS {(C_K:num->A->bool) K | K IN (:num)}) = &0` + (LABEL_TAC "CK0") THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Extract null event B from almost_surely *) + UNDISCH_TAC `almost_surely p {x:A | ?L. ((\n. sum(0..n) + (\i. (Y:num->A->real) i x)) ---> L) sequentially}` THEN + REWRITE_TAC[almost_surely; null_event] THEN + DISCH_THEN(X_CHOOSE_THEN `B:A->bool` STRIP_ASSUME_TAC) THEN + (* prob(INTERS C_K) <= prob(B) = 0 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob p (B:A->bool)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Show INTERS C_K SUBSET B *) + MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + ~(x IN {x | ?L. ((\n. sum(0..n) (\i. (Y:num->A->real) i x)) ---> L) + sequentially})}` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(x:A) IN prob_carrier p` ASSUME_TAC THENL + [SUBGOAL_THEN `(x:A) IN (C_K:num->A->bool) 0` MP_TAC THENL + [ASM_REWRITE_TAC[]; + EXPAND_TAC "C_K" THEN + REWRITE_TAC[UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + MESON_TAC[]]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* x is in every C_K, so partial sums not Cauchy, hence diverge *) + REWRITE_TAC[NOT_EXISTS_THM] THEN X_GEN_TAC `L:real` THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o + REWRITE_RULE[REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `eps / &4`) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `N0:num`) THEN + (* Use SUC N0 so range starts >= 1, avoiding edge case *) + SUBGOAL_THEN `(x:A) IN (C_K:num->A->bool) (SUC N0)` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "C_K" THEN + REWRITE_TAC[UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `aa:num` + (X_CHOOSE_THEN `bb:num` STRIP_ASSUME_TAC)) THEN + SUBGOAL_THEN `abs(sum(0..SUC N0+aa+bb) + (\i. (Y:num->A->real) i x) - L) < eps / &4` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(sum(0..(SUC N0+aa)-1) + (\i. (Y:num->A->real) i x) - L) < eps / &4` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `(SUC N0 + aa) - 1`) THEN + ANTS_TAC THENL [ARITH_TAC; SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `sum(SUC N0+aa..SUC N0+aa+bb) + (\i. (Y:num->A->real) i x) = + sum(0..SUC N0+aa+bb) (\i. Y i x) - + sum(0..(SUC N0+aa)-1) (\i. Y i x)` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `!a b c:real. a + b = c ==> b = c - a`) THEN + MATCH_MP_TAC SUM_COMBINE_L THEN ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `abs(sum(SUC N0 + aa..SUC N0 + aa + bb) + (\i. (Y:num->A->real) i x)) >= eps / &2` THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* By PROB_CONTINUITY_FROM_ABOVE: prob(C_K) -> 0 *) + MP_TAC(ISPECL [`p:A prob_space`; `C_K:num->A->bool`] + PROB_CONTINUITY_FROM_ABOVE) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + (* Get K1 with prob(C_{K1}) < 1/2 *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `&1 / &2`) THEN + ANTS_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `K1:num`) THEN + SUBGOAL_THEN `prob p ((C_K:num->A->bool) K1) < &1 / &2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `K1:num`) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= p ==> abs(p - &0) < &1 / &2 ==> p < &1 / &2`) THEN + MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Take K = max(K0, K1), get m,n from non-Cauchy *) + REMOVE_THEN "NC" (MP_TAC o SPEC `K0 + K1:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LT] THEN + DISCH_THEN(X_CHOOSE_THEN `m1:num` (X_CHOOSE_THEN `n1:num` + STRIP_ASSUME_TAC)) THEN + (* Key facts: m1 >= K0, m1 >= K1 *) + SUBGOAL_THEN `K0:num <= m1` ASSUME_TAC THENL + [UNDISCH_TAC `m1:num >= K0 + K1` THEN + MESON_TAC[LE_TRANS; LE_ADD; GE]; ALL_TAC] THEN + SUBGOAL_THEN `K1:num <= m1` ASSUME_TAC THENL + [UNDISCH_TAC `m1:num >= K0 + K1` THEN + MESON_TAC[LE_TRANS; LE_ADDR; GE]; ALL_TAC] THEN + (* Derive m1 <= n1 from non-triviality of sum *) + SUBGOAL_THEN `m1:num <= n1` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + SUBGOAL_THEN `sum(m1..n1) (\n. expectation p (\x:A. + (Y:num->A->real) n x)) = &0` MP_TAC THENL + [MATCH_MP_TAC SUM_TRIV_NUMSEG THEN ASM_REWRITE_TAC[GSYM NOT_LE]; + UNDISCH_TAC `eps <= abs(sum(m1..n1) + (\n. expectation p (\x:A. (Y:num->A->real) n x)))` THEN + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* For x in carrier \ C_K1: |sum(m1..n1)(Y(x))| < eps/2 *) + (* So |sum(m1..n1)(Z(x))| >= eps/2 *) + (* Hence carrier \ C_{K1} SUBSET {abs(sum(m1..n1)(Z)) >= eps/2} *) + SUBGOAL_THEN `(prob_carrier p DIFF (C_K:num->A->bool) K1) SUBSET + {x:A | x IN prob_carrier p /\ + abs(sum(m1..n1) (\i. (Z:num->A->real) i x)) >= eps / &2}` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* x not in C_{K1}, so for all a,b: |sum(K1+a..K1+a+b)(Y(x))| < eps/2 *) + SUBGOAL_THEN `!a b. abs(sum(K1 + a..K1 + a + b) + (\i. (Y:num->A->real) i x)) < eps / &2` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + UNDISCH_TAC `~((x:A) IN (C_K:num->A->bool) K1)` THEN + EXPAND_TAC "C_K" THEN + REWRITE_TAC[UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + REWRITE_TAC[NOT_EXISTS_THM] THEN + DISCH_THEN(MP_TAC o SPECL [`a:num`; `b:num`]) THEN + REWRITE_TAC[DE_MORGAN_THM; real_ge; REAL_NOT_LE] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* With a = m1 - K1, b = n1 - m1: + |sum(m1..n1)(Y(x))| < eps/2 *) + SUBGOAL_THEN `abs(sum(m1..n1) (\i. (Y:num->A->real) i x)) < eps / &2` + ASSUME_TAC THENL + [SUBGOAL_THEN `K1 + (m1 - K1) = m1:num` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `K1 + (m1 - K1) + (n1 - m1) = n1:num` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m1 - K1:num`; `n1 - m1:num`]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* sum(m1..n1)(Z(x)) = sum(m1..n1)(Y(x)) - sum(m1..n1)(E[Y]) *) + SUBGOAL_THEN `sum(m1..n1) (\i. (Z:num->A->real) i x) = + sum(m1..n1) (\i. (Y:num->A->real) i x) - + sum(m1..n1) (\i. expectation p (\y:A. Y i y))` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH + `eps <= abs(e) /\ abs(y) < eps / &2 + ==> abs(y - e) >= eps / &2`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Apply Chebyshev to sum(m1..n1)(Z) *) + (* First: reindex sum(m1..n1)(Z) = sum(0..n1-m1)(\j. Z(m1+j)) *) + ABBREV_TAC `nn = n1 - m1:num` THEN + SUBGOAL_THEN `m1 + nn = n1:num` ASSUME_TAC THENL + [EXPAND_TAC "nn" THEN + ASM_ARITH_TAC; ALL_TAC] THEN + (* The Chebyshev event is also an event *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + abs(sum(m1..n1) (\i. (Z:num->A->real) i x)) >= eps / &2} + IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + SUBGOAL_THEN `n1 = m1 + nn:num` (fun th -> REWRITE_TAC[th; SUM_REINDEX_SHIFT]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* prob(carrier \ C_{K1}) <= prob({abs(sum Z) >= eps/2}) *) + SUBGOAL_THEN `prob p (prob_carrier p DIFF (C_K:num->A->bool) K1) <= + prob p {x:A | x IN prob_carrier p /\ + abs(sum(m1..n1) (\i. (Z:num->A->real) i x)) >= eps / &2}` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN + ASM_SIMP_TAC[PROB_COMPL_IN_EVENTS] THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP (REWRITE_RULE[IMP_CONJ] + SUBSET_TRANS)) THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + (* prob(carrier \ C_{K1}) > 1/2 *) + SUBGOAL_THEN `&1 / &2 < prob p (prob_carrier p DIFF + (C_K:num->A->bool) K1)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(C_K:num->A->bool) K1`] + PROB_COMPL) THEN + ASM_SIMP_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Apply Chebyshev: prob({abs(sum Z) >= eps/2}) <= Var(sum Z) / (eps/2)^2 *) + (* Need: Var(sum(m1..n1)(Z)) = sum(m1..n1)(Var(Z)) = sum(m1..n1)(Var(Y)) *) + SUBGOAL_THEN `variance p (\x:A. sum(m1..n1) + (\i. (Z:num->A->real) i x)) = + sum(m1..n1) (\i. variance p (\x. Z i x))` ASSUME_TAC THENL + [SUBGOAL_THEN `n1 = m1 + nn:num` (fun th -> REWRITE_TAC[th; SUM_REINDEX_SHIFT]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\i (x:A). (Z:num->A->real) (m1 + i) x`; `nn:num`] + VARIANCE_SUM_UNCORRELATED) THEN BETA_TAC THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MATCH_MP_TAC o check (fun t -> + try fst(dest_forall(concl t)) = `i:num` with _ -> false)) THEN + UNDISCH_TAC `~(i:num = j)` THEN ARITH_TAC]; + SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `sum(m1..n1) (\i. variance p (\x:A. + (Z:num->A->real) i x)) = + sum(m1..n1) (\i. variance p (\x. (Y:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* The variance bound: sum(m1..n1)(Var(Y)) < (eps/2)^2 / 2 *) + SUBGOAL_THEN `sum(m1..n1) (\i. variance p (\x:A. + (Y:num->A->real) i x)) < (eps / &2) pow 2 / &2` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(K0..n1) (\i. variance p (\x:A. + (Y:num->A->real) i x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN + REWRITE_TAC[FINITE_NUMSEG] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_NUMSEG] THEN + UNDISCH_TAC `K0:num <= m1` THEN ARITH_TAC; + REWRITE_TAC[IN_DIFF; IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `n1 = K0 + (n1 - K0):num` SUBST1_TAC THENL + [UNDISCH_TAC `K0:num <= m1` THEN UNDISCH_TAC `m1:num <= n1` THEN + ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* E[sum Z] = 0 *) + SUBGOAL_THEN `expectation p + (\x:A. sum(m1..n1) (\i. (Z:num->A->real) i x)) = &0` + (LABEL_TAC "EsumZ") THENL + [SUBGOAL_THEN `n1 = m1 + nn:num` + (fun th -> REWRITE_TAC[th]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_REINDEX_SHIFT] THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUM o + lhand o snd) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN BETA_TAC THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* integrable sum Z *) + SUBGOAL_THEN `integrable p (\x:A. sum(m1..n1) + (\i. (Z:num->A->real) i x))` (LABEL_TAC "IntSumZ") THENL + [SUBGOAL_THEN `n1 = m1 + nn:num` + (fun th -> REWRITE_TAC[th]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_REINDEX_SHIFT] THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN + REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Var(sum Z) / (eps/2)^2 < 1/2 *) + SUBGOAL_THEN `variance p (\x:A. sum(m1..n1) + (\i. (Z:num->A->real) i x)) / (eps / &2) pow 2 < &1 / &2` + (LABEL_TAC "VarBound") THENL + [SUBGOAL_THEN `&0 < (eps / &2) pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + (* Goal: Var(sum Z) < 1/2 * (eps/2)^2 *) + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(eps / &2) pow 2 / &2` THEN + CONJ_TAC THENL + [(* Var(sum Z) < (eps/2)^2/2 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `sum(m1..n1) (\i. variance p (\x:A. + (Y:num->A->real) i x))` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + (* (eps/2)^2/2 <= 1/2 * (eps/2)^2 *) + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Set equality: sum Z = sum Z - E[sum Z] since E[sum Z] = 0 *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + abs(sum(m1..n1) (\i. (Z:num->A->real) i x)) >= eps / &2} = + {x | x IN prob_carrier p /\ + abs((\x. sum(m1..n1) (\i. Z i x)) x - + expectation p (\x. sum(m1..n1) (\i. Z i x))) >= + eps / &2}` (LABEL_TAC "SetEq") THENL + [AP_TERM_TAC THEN REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN + USE_THEN "EsumZ" (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[REAL_SUB_RZERO]; + ALL_TAC] THEN + (* integrable (sum Z - E[sum Z])^2 = integrable (sum Z)^2 *) + SUBGOAL_THEN `integrable p (\x:A. ((\x. sum(m1..n1) + (\i. (Z:num->A->real) i x)) x - + expectation p (\x. sum(m1..n1) (\i. Z i x))) pow 2)` + (LABEL_TAC "IntPow") THENL + [USE_THEN "EsumZ" (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(nn + 1) * &2 * c) pow 2` THEN CONJ_TAC THENL + [SUBGOAL_THEN `n1 = m1 + nn:num` + (fun th -> REWRITE_TAC[th]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_REINDEX_SHIFT] THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(m1..n1) (\i. abs((Z:num->A->real) i x))` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(m1..n1) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_SIMP_TAC[]; + SUBGOAL_THEN `n1 = m1 + nn:num` + (fun th -> REWRITE_TAC[th]) THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[SUM_REINDEX_SHIFT; SUM_CONST_NUMSEG; SUB_0] THEN + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Chebyshev: prob({abs(f) >= t}) <= Var(f) / t^2 *) + SUBGOAL_THEN `prob p {x:A | x IN prob_carrier p /\ + abs(sum(m1..n1) (\i. (Z:num->A->real) i x)) >= eps / &2} < &1 / &2` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `variance p (\x:A. sum(m1..n1) + (\i. (Z:num->A->real) i x)) / (eps / &2) pow 2` THEN + CONJ_TAC THENL + [(* Chebyshev bound *) + USE_THEN "SetEq" SUBST1_TAC THEN + MATCH_MP_TAC CHEBYSHEV_INEQUALITY THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [USE_THEN "IntSumZ" ACCEPT_TAC; + USE_THEN "IntPow" (ACCEPT_TAC o BETA_RULE); + MP_TAC(ASSUME `&0 < eps`) THEN REAL_ARITH_TAC]; + USE_THEN "VarBound" ACCEPT_TAC]; + ALL_TAC] THEN + ASM_MESON_TAC[REAL_LTE_TRANS; REAL_LT_TRANS; REAL_LT_REFL]);; + +let THREE_SERIES_NECESSITY_INDEP = prove + (`!p:A prob_space (X:num->A->real) c. + &0 < c /\ + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + mutually_indep_rv_seq p X /\ + indep_events_seq p (\n. {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + almost_surely p {x | ?L. ((\n. sum(0..n) (\i. X i x)) ---> L) sequentially} + ==> real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs(X n x) > c}) /\ + real_summable (from 0) + (\n. expectation p (\x. min(max(X n x) (--c)) c)) /\ + real_summable (from 0) + (\n. variance p (\x. min(max(X n x) (--c)) c))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Phase 0: Setup -- abbreviations and basic facts *) + ABBREV_TAC + `(Y:num->A->real) n (x:A) = min(max((X:num->A->real) n x) (--c)) c` THEN + ABBREV_TAC + `(Z:num->A->real) n (x:A) = + (Y:num->A->real) n x - expectation p (\y. Y n y)` THEN + SUBGOAL_THEN `!n. random_variable p ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + (* Phase 1: C1 -- tail probability summability (done early for stack safety) *) + SUBGOAL_THEN `real_summable (from 0) + (\n. prob p {x | x IN prob_carrier p /\ abs((X:num->A->real) n x) > c})` + ASSUME_TAC THENL + [MATCH_MP_TAC THREE_SERIES_CONDITION1 THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* a.s. convergence of sum Y (done early for stack safety) *) + SUBGOAL_THEN `almost_surely p {x | ?L. ((\n. sum(0..n) + (\i. (Y:num->A->real) i x)) ---> L) sequentially}` ASSUME_TAC THENL + [PURE_REWRITE_TAC[GSYM(ASSUME `!n (x:A). + min(max((X:num->A->real) n x) (--c)) c = + (Y:num->A->real) n x`)] THEN + MATCH_MP_TAC THREE_SERIES_REDUCTION THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Y:num->A->real) n x)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Y" THEN + MATCH_MP_TAC INTEGRABLE_CLAMP THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). abs((Y:num->A->real) n x) <= c` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN EXPAND_CURRY_TAC "Y" THEN + REWRITE_TAC[real_max; real_min] THEN + REPEAT COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Y:num->A->real) n x pow 2)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(c:real) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n. abs(expectation p (\y:A. (Y:num->A->real) n y)) <= c` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\y:A. abs((Y:num->A->real) n y))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_LE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\y:A. c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[EXPECTATION_CONST; REAL_ABS_REFL] THEN + ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `mutually_indep_rv_seq p (Y:num->A->real)` ASSUME_TAC THENL + [SUBGOAL_THEN `(Y:num->A->real) = + (\i x. min(max((X:num->A->real) i x) (--c)) c)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_CLAMP THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `mutually_indep_rv_seq p (Z:num->A->real)` ASSUME_TAC THENL + [SUBGOAL_THEN `(Z:num->A->real) = + (\i x. (Y:num->A->real) i x - expectation p (\y. Y i y))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC MUTUALLY_INDEP_RV_SEQ_SHIFT_VARYING THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Z:num->A->real) n x)` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation p (\x:A. (Z:num->A->real) n x) = &0` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + MATCH_MP_TAC(REAL_ARITH `a = b ==> a - b = &0`) THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + SUBGOAL_THEN + `!n (x:A). x IN prob_carrier p ==> abs((Z:num->A->real) n x) <= &2 * c` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN EXPAND_CURRY_TAC "Z" THEN + MATCH_MP_TAC(REAL_ARITH + `abs a <= c /\ abs b <= c ==> abs(a - b) <= &2 * c`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Z:num->A->real) n x pow 2)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&2 * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!i j. ~(i = j) ==> + covariance p (\x:A. (Y:num->A->real) i x) (\x. Y j x) = &0` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC COVARIANCE_BOUNDED_INDEP THEN + MAP_EVERY EXISTS_TAC [`c:real`; `c:real`] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_MESON_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_MESON_TAC[]; + SUBGOAL_THEN `(\x:A. (Y:num->A->real) i x) = Y i` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. (Y:num->A->real) j x) = Y j` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + UNDISCH_TAC `mutually_indep_rv_seq p (Y:num->A->real)` THEN + DISCH_THEN(MP_TAC o MATCH_MP MUTUALLY_INDEP_RV_SEQ_PAIRWISE) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!n. &0 <= variance p (\x:A. (Y:num->A->real) n x)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `(\x:A. ((Y:num->A->real) n x - + expectation p (\y. Y n y)) pow 2) = (\x. Z n x pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN AP_THM_TAC THEN + AP_TERM_TAC THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!n. variance p (\x:A. sum(0..n) + (\i. (Y:num->A->real) i x)) = + sum(0..n) (\i. variance p (\x. Y i x))` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\i (x:A). (Y:num->A->real) i x`; `n:num`] + VARIANCE_SUM_UNCORRELATED) THEN BETA_TAC THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[]]; + SIMP_TAC[]]; ALL_TAC] THEN + (* Phase 2: C3 -- variance summability *) + SUBGOAL_THEN `real_summable (from 0) + (\n. variance p (\x:A. (Y:num->A->real) n x))` ASSUME_TAC THENL + [ASM_CASES_TAC `!N. sum(0..N) (\i. variance p (\x:A. + (Y:num->A->real) i x)) < (&2 * c) pow 2` THENL + [(* Case A: partial sums bounded, use REAL_SUMMABLE_BOUND_PARTIAL *) + MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC `(&2 * c) pow 2` THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]; + (* Case B: partial sums reach (2c)^2, use V2 *) + POP_ASSUM MP_TAC THEN REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LT] THEN + DISCH_THEN(X_CHOOSE_TAC `N0:num`) THEN + MP_TAC(ISPECL [`p:A prob_space`; `Y:num->A->real`; `&32`] + SUMMABLE_VARIANCE_FROM_CONVERGENCE_V2) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) n` ETA_AX)] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) i` ETA_AX)] THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Y:num->A->real) j` ETA_AX)] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + (* integrable (sum Y)^2 and (sum Y)^4 *) + SUBGOAL_THEN `!n (x:A). abs(sum(0..n) (\i. (Y:num->A->real) i x)) <= + &(n + 1) * c` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Y:num->A->real) i x))` THEN + CONJ_TAC THENL [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Y:num->A->real) i = (\x:A. Y i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * c) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * c) pow 4` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + CONJ_TAC THENL + [ALL_TAC; ASM_REWRITE_TAC[]] THEN + (* Fourth moment bound: exists N0 s.t. for n >= N0, + E[(sum Y)^4] <= 32 * E[(sum Y)^2]^2 *) + EXISTS_TAC `N0:num` THEN GEN_TAC THEN DISCH_TAC THEN + ABBREV_TAC + `(T_n:A->real) (x:A) = sum(0..n) (\i. (Z:num->A->real) i x)` THEN + ABBREV_TAC + `M_n = sum(0..n) (\i. expectation p (\y:A. (Y:num->A->real) i y))` THEN + SUBGOAL_THEN `!x:A. sum(0..n) (\i. (Y:num->A->real) i x) = + (T_n:A->real) x + M_n` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_CURRY_TAC "T_n" THEN EXPAND_TAC "M_n" THEN + EXPAND_CURRY_TAC "Z" THEN + REWRITE_TAC[GSYM SUM_ADD_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). abs((Z:num->A->real) n x) <= &2 * c` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN EXPAND_CURRY_TAC "Z" THEN + MATCH_MP_TAC(REAL_ARITH + `abs a <= c /\ abs b <= c ==> abs(a - b) <= &2 * c`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x)` ASSUME_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC INTEGRABLE_SUM THEN + REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (\x:A. (T_n:A->real) x) = &0` + ASSUME_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUM o lhand o snd) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN BETA_TAC THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * &2 * c) pow 2` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i x))` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN REWRITE_TAC[SUM_ABS_NUMSEG]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. &2 * (T_n:A->real) x * M_n)` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. &2 * (T_n:A->real) x * M_n) = + (\x. (&2 * M_n) * T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + SUBGOAL_THEN `(T_n:A->real) = (\x:A. T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (\x:A. (T_n:A->real) x pow 4)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * &2 * c) pow 4` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN + MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Z:num->A->real) i = (\x. Z i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN REWRITE_TAC[REAL_ABS_POS] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. abs((Z:num->A->real) i x))` THEN + CONJ_TAC THENL + [EXPAND_CURRY_TAC "T_n" THEN REWRITE_TAC[SUM_ABS_NUMSEG]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i:num. &2 * c)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= expectation p (\x:A. (T_n:A->real) x pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[REAL_LE_POW_2]; + ALL_TAC] THEN + (* Fourth moment bound for T_n from FOURTH_MOMENT_BOUND_INDEP_CENTERED *) + SUBGOAL_THEN `expectation p (\x:A. (T_n:A->real) x pow 4) <= + (&2 * c) pow 2 * expectation p (\x. T_n x pow 2) + + &3 * expectation p (\x. T_n x pow 2) pow 2` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `Z:num->A->real`; `&2 * c`] + FOURTH_MOMENT_BOUND_INDEP_CENTERED) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_REAL_ARITH_TAC; + GEN_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Z:num->A->real) i` ETA_AX)] THEN + ASM_REWRITE_TAC[]; + GEN_TAC THEN + ONCE_REWRITE_TAC[GSYM(ISPEC `(Z:num->A->real) i` ETA_AX)] THEN + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 4) = + (\x. (T_n:A->real) x pow 4)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (Z:num->A->real) i x) pow 2) = + (\x. (T_n:A->real) x pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SIMP_TAC[]; + ALL_TAC] THEN + (* Key: (2c)^2 <= E[T_n^2] because sum Var(Y) >= (2c)^2 for n >= N0 *) + SUBGOAL_THEN `(&2 * c) pow 2 <= expectation p + (\x:A. (T_n:A->real) x pow 2)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..n) (\i. variance p (\x:A. (Y:num->A->real) i x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `sum(0..N0) (\i. variance p (\x:A. (Y:num->A->real) i x))` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `sum(0..N0) (\i. variance p (\x:A. + (Y:num->A->real) i x)) + + sum(N0+1..n) (\i. variance p (\x. Y i x)) = + sum(0..n) (\i. variance p (\x. Y i x))` (fun th -> + GEN_REWRITE_TAC RAND_CONV [GSYM th]) THENL + [MATCH_MP_TAC SUM_COMBINE_R THEN ASM_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a <= a + b`) THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..n) (\i. variance p (\x:A. + (Y:num->A->real) i x)) = + expectation p (\x. (T_n:A->real) x pow 2)` SUBST1_TAC THENL + [ONCE_REWRITE_TAC[GSYM(ASSUME `!n. variance p (\x:A. sum(0..n) + (\i. (Y:num->A->real) i x)) = + sum(0..n) (\i. variance p (\x. Y i x))`)] THEN + (* variance(sum Y) = E[(sum Y - E[sum Y])^2] *) + REWRITE_TAC[variance] THEN + (* E[sum Y] = M_n *) + SUBGOAL_THEN `expectation p (\y:A. sum(0..n) + (\i. (Y:num->A->real) i y)) = M_n` SUBST1_TAC THENL + [W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUM o + lhand o snd) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_NUMSEG; LE_0] THEN GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(Y:num->A->real) i = (\x. Y i x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `!i. expectation p ((Y:num->A->real) i) = + expectation p (\y:A. Y i y)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* sum Y x - M_n = T_n x *) + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* So E[T_n^4] <= (2c)^2 * E[T_n^2] + 3 * E[T_n^2]^2 + <= E[T_n^2] * E[T_n^2] + 3 * E[T_n^2]^2 = 4 * E[T_n^2]^2 *) + SUBGOAL_THEN `expectation p (\x:A. (T_n:A->real) x pow 4) <= + &4 * expectation p (\x. T_n x pow 2) pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&2 * c) pow 2 * expectation p + (\x:A. (T_n:A->real) x pow 2) + + &3 * expectation p (\x. T_n x pow 2) pow 2` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. (T_n:A->real) x pow 2) * + expectation p (\x. T_n x pow 2) + + &3 * expectation p (\x. T_n x pow 2) pow 2` THEN + CONJ_TAC THENL + [ONCE_REWRITE_TAC[REAL_LE_RADD] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* E[2*T_n*M_n] = 0 *) + SUBGOAL_THEN `expectation p (\x:A. &2 * (T_n:A->real) x * M_n) = &0` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. &2 * (T_n:A->real) x * M_n) = + (\x. (&2 * M_n) * T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_CMUL o + lhand o snd) THEN + ANTS_TAC THENL + [SUBGOAL_THEN `(T_n:A->real) = (\x:A. T_n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN `expectation p (T_n:A->real) = + expectation p (\x:A. T_n x)` SUBST1_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* E[(sum Y)^2] = E[T_n^2] + M_n^2 *) + SUBGOAL_THEN `expectation p + (\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2) = + expectation p (\x. (T_n:A->real) x pow 2) + M_n pow 2` + SUBST1_TAC THENL + [SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (Y:num->A->real) i x) pow 2) = + (\x. (T_n:A->real) x pow 2 + &2 * T_n x * M_n + M_n pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o + lhand o snd) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o + rand o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[EXPECTATION_CONST] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* (a+b)^4 <= 8*(a^4+b^4) *) + SUBGOAL_THEN `!(a:real) b. (a + b) pow 4 <= &8 * (a pow 4 + b pow 4)` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&2 * (a pow 2 + b pow 2)) pow 2` THEN CONJ_TAC THENL + [SUBGOAL_THEN `(a + b:real) pow 4 = ((a + b) pow 2) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV; + ALL_TAC] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; ALL_TAC] THEN + MP_TAC(SPEC `a - b:real` REAL_LE_POW_2) THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPEC `(a:real) pow 2 - b pow 2` REAL_LE_POW_2) THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Main chain: E[(sum Y)^4] = E[(T_n + M_n)^4] + <= 8*(E[T_n^4] + M_n^4) <= 8*(4*E[T_n^2]^2 + M_n^4) + = 32*E[T_n^2]^2 + 8*M_n^4 + <= 32*(E[T_n^2] + M_n^2)^2 = 32*E[(sum Y)^2]^2 *) + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&8 * + (expectation p (\x:A. (T_n:A->real) x pow 4) + M_n pow 4)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `expectation p + (\x:A. &8 * ((T_n:A->real) x pow 4 + M_n pow 4)) = + &8 * (expectation p (\x. T_n x pow 4) + M_n pow 4)` + ASSUME_TAC THENL + [W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_CMUL o + lhand o snd) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o + lhand o snd) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST]; + ALL_TAC] THEN + FIRST_X_ASSUM(fun th -> GEN_REWRITE_TAC RAND_CONV [GSYM th]) THEN + MATCH_MP_TAC EXPECTATION_MONO THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `(&(n + 1) * c) pow 4` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + SUBGOAL_THEN `(\x:A. (T_n:A->real) x + M_n) = + (\x. sum(0..n) (\i. (Y:num->A->real) i x))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + CONV_TAC SYM_CONV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_POS]; + SUBGOAL_THEN `(T_n:A->real) (x:A) + M_n = + sum(0..n) (\i. (Y:num->A->real) i x)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]]]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&8 * + (&4 * expectation p (\x:A. (T_n:A->real) x pow 2) pow 2 + + M_n pow 4)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_LE_RADD] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(M_n:real) pow 4 = (M_n pow 2) pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= &2 * expectation p + (\x:A. (T_n:A->real) x pow 2) * (M_n:real) pow 2` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[REAL_LE_POW_2]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= (M_n:real) pow 2 * M_n pow 2` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_LE_POW_2]; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SIMP_TAC[ETA_AX]]; ALL_TAC] THEN + (* Phase 3: C2 -- expectation summability *) + SUBGOAL_THEN `real_summable (from 0) + (\n. expectation p (\x:A. (Y:num->A->real) n x))` ASSUME_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `Y:num->A->real`; + `Z:num->A->real`; `c:real`] EXPECTATION_SUMMABLE_CHEBYSHEV) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Phase 4: Combine C1, C2, C3 *) + SUBGOAL_THEN `!n (x:A). min(max((X:num->A->real) n x) (--c)) c = + (Y:num->A->real) n x` (fun th -> REWRITE_TAC[th]) THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[]);; diff --git a/Probability/distributions.ml b/Probability/distributions.ml new file mode 100644 index 00000000..267560d0 --- /dev/null +++ b/Probability/distributions.ml @@ -0,0 +1,1864 @@ +(* ========================================================================= *) +(* Standard discrete distributions: Bernoulli, Binomial, Poisson, *) +(* and Geometric. *) +(* *) +(* Defines what it means for a random variable to have a Bernoulli or *) +(* Binomial distribution, proves expectation, variance, and the connection *) +(* between indicators and Bernoulli RVs. *) +(* *) +(* Also defines the Poisson PMF and proves the Poisson limit theorem: *) +(* Bin(n, lam/n) -> Poisson(lam) pointwise as n -> infinity. *) +(* *) +(* Defines the Geometric PMF and proves normalization and mean. *) +(* ========================================================================= *) + +needs "Probability/clt.ml";; + +(* ========================================================================= *) +(* Bernoulli random variables *) +(* ========================================================================= *) + +(* A Bernoulli(q) random variable takes values 0 and 1 with P(X=1)=q *) +let bernoulli_rv = new_definition + `bernoulli_rv (p:A prob_space) (X:A->real) (q:real) <=> + simple_rv p X /\ + &0 <= q /\ q <= &1 /\ + (!x. x IN prob_carrier p ==> X x = &0 \/ X x = &1) /\ + prob p {x | x IN prob_carrier p /\ X x = &1} = q`;; + +(* P(X=0) = 1 - q for Bernoulli *) +let BERNOULLI_RV_PROB_ZERO = prove + (`!p:A prob_space X q. + bernoulli_rv p X q + ==> prob p {x | x IN prob_carrier p /\ X x = &0} = &1 - q`, + REPEAT GEN_TAC THEN REWRITE_TAC[bernoulli_rv] THEN STRIP_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x = &0} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x = &1}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x = &1} IN prob_events p` + ASSUME_TAC THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x = &1} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x <= &0}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + UNDISCH_TAC `simple_rv (p:A prob_space) (X:A->real)` THEN + REWRITE_TAC[simple_rv; random_variable] THEN MESON_TAC[]]; + ASM_SIMP_TAC[PROB_COMPL]]);; + +(* E[X] = q for Bernoulli *) +let BERNOULLI_RV_EXPECTATION = prove + (`!p:A prob_space X q. + bernoulli_rv p X q ==> simple_expectation p X = q`, + REPEAT GEN_TAC THEN REWRITE_TAC[bernoulli_rv] THEN STRIP_TAC THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ X x = &1}` THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x = &1} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ (X:A->real) x <= &0}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + UNDISCH_TAC `simple_rv (p:A prob_space) (X:A->real)` THEN + REWRITE_TAC[simple_rv; random_variable] THEN MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `!z:A. z IN prob_carrier p ==> X z = indicator_fn A z` + ASSUME_TAC THENL + [X_GEN_TAC `z:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [UNDISCH_TAC `(z:A) IN A` THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + UNDISCH_TAC `~((z:A) IN A)` THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM; DE_MORGAN_THM; NOT_IMP] THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation p X = + simple_expectation p (indicator_fn (A:A->bool))` SUBST1_TAC THENL + [REWRITE_TAC[simple_expectation] THEN + SUBGOAL_THEN `IMAGE (X:A->real) (prob_carrier p) = + IMAGE (indicator_fn (A:A->bool)) (prob_carrier p)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN EXISTS_TAC `x':A` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + X_GEN_TAC `v:real` THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]]; + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR]]);; + +(* Var(X) = q(1-q) for Bernoulli *) +let BERNOULLI_RV_VARIANCE = prove + (`!p:A prob_space X q. + bernoulli_rv p X q ==> simple_variance p X = q * (&1 - q)`, + REPEAT GEN_TAC THEN REWRITE_TAC[bernoulli_rv] THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) X = q` ASSUME_TAC THENL + [MATCH_MP_TAC BERNOULLI_RV_EXPECTATION THEN + ASM_REWRITE_TAC[bernoulli_rv]; ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_VARIANCE_ALT] THEN + SUBGOAL_THEN `(\x:A. (X:A->real) x pow 2) = (\x. X x * X x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_2]; ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x:A. X x * X x) = + simple_expectation p X` + SUBST1_TAC THENL + [REWRITE_TAC[simple_expectation] THEN + SUBGOAL_THEN `IMAGE (\x:A. (X:A->real) x * X x) (prob_carrier p) = + IMAGE X (prob_carrier p)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THENL + [EXISTS_TAC `x':A` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x':A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + EXISTS_TAC `x':A` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x':A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN + X_GEN_TAC `v:real` THEN AP_TERM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + EQ_TAC THEN STRIP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(X:A->real) z * X z = v` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(X:A->real) z = v` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC]]; + ASM_REWRITE_TAC[] THEN CONV_TAC REAL_RING]);; + +(* Indicator functions are Bernoulli RVs *) +let INDICATOR_BERNOULLI = prove + (`!p:A prob_space a. + a IN prob_events p + ==> bernoulli_rv p (indicator_fn a) (prob p a)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[bernoulli_rv] THEN REPEAT CONJ_TAC THENL + [ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_LE_1 THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[indicator_fn] THEN REPEAT STRIP_TAC THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN REAL_ARITH_TAC; + AP_TERM_TAC THEN REWRITE_TAC[indicator_fn; EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THENL + [ASM_CASES_TAC `(z:A) IN a` THEN ASM_REWRITE_TAC[] THEN + CONV_TAC REAL_RAT_REDUCE_CONV; + MP_TAC(ISPECL [`p:A prob_space`; `a:A->bool`] PROB_EVENT_SUBSET) THEN + ASM_REWRITE_TAC[SUBSET] THEN ASM_MESON_TAC[]]]);; + + +(* ========================================================================= *) +(* Binomial random variables *) +(* ========================================================================= *) + +(* A Binomial(n,q) random variable takes values in {0,..,n} with + P(X=k) = C(n,k) * q^k * (1-q)^(n-k) *) +let binomial_rv = new_definition + `binomial_rv (p:A prob_space) (X:A->real) (n:num) (q:real) <=> + simple_rv p X /\ + &0 <= q /\ q <= &1 /\ + (!x. x IN prob_carrier p ==> ?k. k <= n /\ X x = &k) /\ + !k. k <= n ==> + prob p {x | x IN prob_carrier p /\ X x = &k} = + &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)`;; + +(* Bernoulli(q) is Binomial(1, q) *) +let BERNOULLI_IS_BINOMIAL_1 = prove + (`!p:A prob_space X q. + bernoulli_rv p X q ==> binomial_rv p X 1 q`, + REPEAT GEN_TAC THEN REWRITE_TAC[bernoulli_rv; binomial_rv] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `z:A` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THENL + [EXISTS_TAC `0` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + EXISTS_TAC `1` THEN ASM_REWRITE_TAC[LE_REFL]]; + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `k = 0 \/ k = 1` STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; + ASM_REWRITE_TAC[binom; BINOM_REFL; SUB_REFL; SUB] THEN + CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[real_pow; REAL_POW_1; REAL_MUL_LID; REAL_MUL_RID] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x = &0} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ X x = &1}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x = &1} IN prob_events p` + ASSUME_TAC THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ X x = &1} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ (X:A->real) x <= &0}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN + ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN + UNDISCH_TAC `simple_rv (p:A prob_space) (X:A->real)` THEN + REWRITE_TAC[simple_rv; random_variable] THEN MESON_TAC[]]; + ASM_SIMP_TAC[PROB_COMPL]]; + ASM_REWRITE_TAC[binom; BINOM_REFL] THEN + CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[real_pow; REAL_POW_1; REAL_MUL_LID; REAL_MUL_RID]]]);; + + +(* ========================================================================= *) +(* Auxiliary: first and second moment identities for binomial sums *) +(* These are derived from the REAL_BINOMIAL_THEOREM via differentiation. *) +(* ========================================================================= *) + +let SUM_BINOMIAL_FIRST_MOMENT = prove + (`!n q. sum(0..n) + (\k. &k * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)) = &n * q`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN + `!x:real y:real. + sum(0..n) (\k. &k * &(binom(n,k)) * x pow (k - 1) * y pow (n - k)) = + &n * (x + y) pow (n - 1)` + (LABEL_TAC "deriv") THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC REAL_DERIVATIVE_UNIQUE_ATREAL THEN + MAP_EVERY EXISTS_TAC + [`\x:real. sum(0..n) + (\k. &(binom(n,k)) * x pow k * (y:real) pow (n - k))`; + `x:real`] THEN + SUBGOAL_THEN + `!x:real. sum(0..n) + (\k. &(binom(n,k)) * x pow k * (y:real) pow (n - k)) = + (x + y) pow n` + (LABEL_TAC "bt") THENL + [REWRITE_TAC[REAL_BINOMIAL_THEOREM]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC HAS_REAL_DERIVATIVE_SUM THEN REWRITE_TAC[FINITE_NUMSEG]; + ASM_REWRITE_TAC[]] THEN + REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN CONV_TAC REAL_RING; + ALL_TAC] THEN + REMOVE_THEN "deriv" (MP_TAC o SPECL [`q:real`; `&1 - q`]) THEN + REWRITE_TAC[REAL_SUB_ADD2; REAL_POW_ONE; REAL_MUL_RID] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + REWRITE_TAC[GSYM SUM_RMUL] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[REAL_ARITH + `(k * b * xk * y) * x:real = k * b * (x * xk) * y`] THEN + REWRITE_TAC[GSYM(CONJUNCT2 real_pow)] THEN + DISJ_CASES_TAC(ARITH_RULE `k = 0 \/ SUC(k - 1) = k`) THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO]);; + +(* Second central moment identity from BERNSTEIN_LEMMA *) +let SUM_BINOMIAL_SECOND_MOMENT = prove + (`!n q. sum(0..n) + (\k. (&k - &n * q) pow 2 * + &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)) = + &n * q * (&1 - q)`, + REPEAT GEN_TAC THEN + MP_TAC(SPECL [`n:num`; `q:real`] BERNSTEIN_LEMMA) THEN + REWRITE_TAC[bernstein] THEN + MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + CONV_TAC REAL_RING);; + + +(* ========================================================================= *) +(* Binomial expectation and variance via simple_expectation *) +(* ========================================================================= *) + +(* E[X] = n*q for Binomial(n,q) *) +let BINOMIAL_RV_EXPECTATION = prove + (`!p:A prob_space X n q. + binomial_rv p X n q ==> simple_expectation p X = &n * q`, + REPEAT GEN_TAC THEN REWRITE_TAC[binomial_rv] THEN STRIP_TAC THEN + REWRITE_TAC[simple_expectation] THEN + SUBGOAL_THEN `IMAGE (X:A->real) (prob_carrier p) SUBSET {&k | k <= n}` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `FINITE (IMAGE (X:A->real) (prob_carrier p))` ASSUME_TAC THENL + [MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\k:num. &k) (0..n)` THEN CONJ_TAC THENL + [MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]; + FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP + (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE; IN_NUMSEG; LE_0] THEN + MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `{v:real | v IN IMAGE (X:A->real) (prob_carrier p)} = + IMAGE X (prob_carrier p)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM]; ALL_TAC] THEN + SUBGOAL_THEN + `sum (IMAGE (X:A->real) (prob_carrier p)) + (\v. v * prob p {x:A | x IN prob_carrier p /\ (X:A->real) x = v}) = + sum (IMAGE (\k:num. &k) (0..n)) + (\v. v * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (X:A->real) x = v})` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o MATCH_MP + (REWRITE_RULE[IMP_CONJ] SUBSET_TRANS)) THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE; IN_NUMSEG; LE_0] THEN + MESON_TAC[]; + X_GEN_TAC `v:real` THEN + REWRITE_TAC[IN_IMAGE; IN_NUMSEG; LE_0] THEN STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (X:A->real) x = v} = {}` + (fun th -> REWRITE_TAC[th; PROB_EMPTY; REAL_MUL_RZERO]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SIMP_TAC[FINITE_NUMSEG; SUM_IMAGE; IN_NUMSEG; LE_0; REAL_OF_NUM_EQ] THEN + REWRITE_TAC[o_DEF] THEN BETA_TAC THEN + SUBGOAL_THEN + `!k. k IN 0..n ==> + &k * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (X:A->real) x = &k} = + &k * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)` + (fun th -> SIMP_TAC[th; SUM_EQ]) THENL + [X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_NUMSEG; LE_0] THEN + DISCH_TAC THEN AP_TERM_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_BINOMIAL_FIRST_MOMENT]]);; + +let SUM_BINOMIAL_SECOND_RAW_MOMENT = prove + (`!n q. sum(0..n) + (\k. &k pow 2 * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)) = + &n * q * (&1 - q) + (&n * q) pow 2`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN + `!k. k IN 0..n ==> + &k pow 2 * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k) = + (&k - &n * q) pow 2 * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k) + + &2 * (&n * q) * &k * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k) - + (&n * q) pow 2 * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN CONV_TAC REAL_RING; ALL_TAC] THEN + SUBGOAL_THEN + `sum(0..n) (\k. &k pow 2 * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k)) = + sum(0..n) (\k. + (&k - &n * q) pow 2 * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k) + + &2 * (&n * q) * &k * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k) - + (&n * q) pow 2 * &(binom(n,k)) * q pow k * + (&1 - q) pow (n - k))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN + FIRST_X_ASSUM(fun th -> REWRITE_TAC[IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC(REWRITE_RULE[IN_NUMSEG] th)) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SUM_SUB_NUMSEG; SUM_ADD_NUMSEG; SUM_LMUL] THEN + REWRITE_TAC[SUM_BINOMIAL_SECOND_MOMENT; SUM_BINOMIAL_FIRST_MOMENT] THEN + REWRITE_TAC[GSYM bernstein; SUM_BERNSTEIN] THEN REAL_ARITH_TAC);; + +(* Var(X) = n*q*(1-q) for Binomial(n,q) *) +let BINOMIAL_RV_VARIANCE = prove + (`!p:A prob_space X n q. + binomial_rv p X n q ==> simple_variance p X = &n * q * (&1 - q)`, + REPEAT GEN_TAC THEN REWRITE_TAC[binomial_rv] THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) X = &n * q` + ASSUME_TAC THENL + [MATCH_MP_TAC BINOMIAL_RV_EXPECTATION THEN + ASM_REWRITE_TAC[binomial_rv]; ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_VARIANCE_ALT] THEN + (* Suffices to show E[X^2] = nq(1-q) + (nq)^2 *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x:A. (X:A->real) x pow 2) = + &n * q * (&1 - q) + (&n * q) pow 2` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + REWRITE_TAC[simple_expectation] THEN + SUBGOAL_THEN + `{v:real | v IN IMAGE (\x:A. (X:A->real) x pow 2) (prob_carrier p)} = + IMAGE (\x. X x pow 2) (prob_carrier p)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM]; ALL_TAC] THEN + SUBGOAL_THEN + `IMAGE (\x:A. (X:A->real) x pow 2) (prob_carrier p) SUBSET + IMAGE (\k:num. (&k) pow 2) (0..n)` + ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_IMAGE; IN_NUMSEG; LE_0] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Extend sum to IMAGE (\k. (&k)^2) (0..n) *) + SUBGOAL_THEN + `sum (IMAGE (\x:A. (X:A->real) x pow 2) (prob_carrier p)) + (\v. v * prob p + {x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = v}) = + sum (IMAGE (\k:num. (&k) pow 2) (0..n)) + (\v. v * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = v})` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_SUPERSET THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + X_GEN_TAC `v:real` THEN REWRITE_TAC[IN_IMAGE; IN_NUMSEG; LE_0] THEN + STRIP_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = v} = {}` + (fun th -> REWRITE_TAC[th; PROB_EMPTY; REAL_MUL_RZERO]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `z:A` THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN REWRITE_TAC[] THEN + EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Apply SUM_IMAGE using injectivity of k |-> (&k)^2 on naturals *) + MP_TAC(ISPECL [`\k:num. (&k) pow 2`; + `\v:real. v * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = v}`; + `0..n`] SUM_IMAGE) THEN + ANTS_TAC THENL + [BETA_TAC THEN REWRITE_TAC[IN_NUMSEG; LE_0] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&x = &y` (fun th -> REWRITE_TAC[GSYM REAL_OF_NUM_EQ; th]) THEN + MATCH_MP_TAC REAL_POW_EQ THEN EXISTS_TAC `2` THEN + ASM_REWRITE_TAC[REAL_POS] THEN ARITH_TAC; + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[o_DEF] THEN BETA_TAC] THEN + (* Now: sum(0..n)(\k. (&k)^2 * P({X^2 = (&k)^2})) = nq(1-q) + (nq)^2 *) + (* Show {X^2 = (&k)^2} = {X = &k} using non-negativity, then substitute *) + SUBGOAL_THEN + `!k. k IN 0..n ==> + &k pow 2 * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = (&k) pow 2} = + &k pow 2 * &(binom(n,k)) * q pow k * (&1 - q) pow (n - k)` + (fun th -> SIMP_TAC[th; SUM_EQ]) THENL + [X_GEN_TAC `k:num` THEN REWRITE_TAC[IN_NUMSEG; LE_0] THEN + DISCH_TAC THEN AP_TERM_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:A->real) x pow 2 = (&k) pow 2} = + {x | x IN prob_carrier p /\ X x = &k}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + EQ_TAC THENL + [DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `z:A`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN + SUBGOAL_THEN `(X:A->real) z = &k` + (fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC REAL_POW_EQ THEN EXISTS_TAC `2` THEN + ASM_REWRITE_TAC[REAL_POS] THEN ARITH_TAC; + DISCH_TAC THEN ASM_REWRITE_TAC[]]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[SUM_BINOMIAL_SECOND_RAW_MOMENT]]);; + + +(* ========================================================================= *) +(* Poisson distribution *) +(* ========================================================================= *) + +(* The Poisson distribution has infinite support {0,1,2,...}, so it cannot *) +(* be a simple_rv. We work with its PMF as an analytic object and prove *) +(* normalization and the Poisson limit theorem. *) + +(* Real exponential power series: exp(x) = sum_{n=0}^infty x^n/n! *) +let REAL_EXP_CONVERGES = prove + (`!x. ((\n. x pow n / &(FACT n)) real_sums exp(x)) (from 0)`, + GEN_TAC THEN REWRITE_TAC[REAL_SUMS_COMPLEX] THEN + SUBGOAL_THEN `Cx o (\n. x pow n / &(FACT n)) = + (\n. Cx(x) pow n / Cx(&(FACT n)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; o_THM; CX_DIV; CX_POW]; + REWRITE_TAC[CX_EXP] THEN ACCEPT_TAC(SPEC `Cx(x:real)` CEXP_CONVERGES)]);; + +(* Poisson PMF: P(X = k) = e^{-lam} * lam^k / k! *) +let poisson_pmf = new_definition + `poisson_pmf (lam:real) (k:num) = exp(--lam) * lam pow k / &(FACT k)`;; + +(* The Poisson PMF sums to 1 *) +let POISSON_PMF_SUMS = prove + (`!lam. (poisson_pmf lam real_sums &1) (from 0)`, + GEN_TAC THEN + SUBGOAL_THEN `poisson_pmf lam = + (\k. exp(--lam) * lam pow k / &(FACT k))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; poisson_pmf]; ALL_TAC] THEN + SUBGOAL_THEN `&1 = exp(--lam) * exp(lam)` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_EXP_ADD; REAL_ADD_LINV; REAL_EXP_0]; + MATCH_MP_TAC REAL_SERIES_LMUL THEN REWRITE_TAC[REAL_EXP_CONVERGES]]);; + +(* Poisson PMF is non-negative *) +let POISSON_PMF_POS = prove + (`!lam k. &0 <= lam ==> &0 <= poisson_pmf lam k`, + REPEAT STRIP_TAC THEN REWRITE_TAC[poisson_pmf] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_EXP_POS_LE]; + MATCH_MP_TAC REAL_LE_DIV THEN ASM_SIMP_TAC[REAL_POW_LE; REAL_POS]]);; + +(* ========================================================================= *) +(* Auxiliary limit lemmas for the Poisson limit theorem *) +(* ========================================================================= *) + +(* If f(n+1) -> l then f(n) -> l *) +let REALLIM_SHIFT_SUC = prove + (`!f l. ((\n. f(SUC n)) ---> l) sequentially ==> (f ---> l) sequentially`, + REPEAT STRIP_TAC THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `?m. n = SUC m /\ N <= m` STRIP_ASSUME_TAC THENL + [EXISTS_TAC `n - 1` THEN ASM_ARITH_TAC; ASM_SIMP_TAC[]]);; + +(* (1 - c/n)^n -> e^{-c} for c > 0 (shifted version of REALLIM_POW_EXP_NEG) *) +let REALLIM_POW_EXP_NEG' = prove + (`!c. &0 < c ==> ((\n. (&1 - c / &n) pow n) ---> exp(--c)) sequentially`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC REALLIM_SHIFT_SUC THEN + REWRITE_TAC[ADD1] THEN + FIRST_X_ASSUM(MP_TAC o MATCH_MP REALLIM_POW_EXP_NEG) THEN + REWRITE_TAC[ADD1]);; + +(* (n - k) / n -> 1 as n -> infinity *) +let REALLIM_RATIO_TO_1 = prove + (`!k. ((\n. &(n - k) / &n) ---> &1) sequentially`, + GEN_TAC THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. &1 - &k / &n` THEN CONJ_TAC THENL + [REWRITE_TAC[] THEN REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `k + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `k <= n /\ 0 < n` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN POP_ASSUM MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[GSYM REAL_OF_NUM_SUB] THEN + MATCH_MP_TAC(REAL_FIELD `&0 < n ==> &1 - k / n = (n - k) / n`) THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`sequentially:(num)net`; `(\n:num. &1):num->real`; + `(\n:num. &k / &n):num->real`; `&1`; `&0`] REALLIM_SUB) THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[real_div] THEN + SUBGOAL_THEN `&0 = &k * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_N]]]]);; + +(* binom(n,k) / n^k -> 1/k! as n -> infinity *) +let REALLIM_BINOM_OVER_NPOWER = prove + (`!k. ((\n. &(binom(n,k)) / &n pow k) ---> inv(&(FACT k))) sequentially`, + INDUCT_TAC THENL + [REWRITE_TAC[binom; FACT; real_pow; REAL_INV_1; REAL_DIV_1; + REALLIM_CONST]; + ALL_TAC] THEN + SUBGOAL_THEN + `inv(&(FACT(SUC k))) = inv(&(FACT k)) * inv(&(SUC k))` + SUBST1_TAC THENL + [REWRITE_TAC[FACT; GSYM REAL_OF_NUM_MUL; REAL_INV_MUL] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `((\n. &(binom(n,SUC k)) / &n pow SUC k) ---> + inv(&(FACT k)) * inv(&(SUC k))) sequentially` + MP_TAC THENL + [ALL_TAC; REWRITE_TAC[]] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n. (&(binom(n,k)) / &n pow k) * + (&(n - k) / (&n * &(SUC k)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `SUC k` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `k <= n /\ 0 < n` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN POP_ASSUM MP_TAC THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(&n = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN + UNDISCH_TAC `0 < n` THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(&n pow k = &0)` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_POW_EQ_0] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `~(&(SUC k) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]; ALL_TAC] THEN + SUBGOAL_THEN `SUC k * binom(n,SUC k) = (n - k) * binom(n,k)` + ASSUME_TAC THENL + [MP_TAC(SPECL [`n:num`; `k:num`] BINOM_BOTTOM_STEP) THEN + REWRITE_TAC[ADD1]; ALL_TAC] THEN + SUBGOAL_THEN + `&(binom(n,SUC k)) = &((n - k) * binom(n,k)) / &(SUC k)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `&(SUC k) * &(binom(n,SUC k)) = &((n - k) * binom(n,k))` + MP_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_EQ] THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[REAL_FIELD + `~(a = &0) ==> (a * b = c <=> b = c / a)`]]; + ALL_TAC] THEN + REWRITE_TAC[real_pow; GSYM REAL_OF_NUM_MUL] THEN + ASM_SIMP_TAC[REAL_FIELD + `~(nk = &0) /\ ~(n = &0) /\ ~(sk = &0) ==> + ((nk' * bnk) / sk) / (n * nk) = + (bnk / nk) * (nk' / (n * sk))`]; + ALL_TAC] THEN + SUBGOAL_THEN + `inv(&(FACT k)) * inv(&(SUC k)) = + inv(&(FACT k)) * (&1 * inv(&(SUC k)))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_LID]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_MUL THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(\n. &(n - k) / (&n * &(SUC k))) = + (\n. (&(n - k) / &n) * inv(&(SUC k)))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_INV_MUL] THEN REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_RMUL THEN REWRITE_TAC[REALLIM_RATIO_TO_1]]);; + + +(* ========================================================================= *) +(* Poisson limit theorem *) +(* ========================================================================= *) + +(* Bin(n, lam/n) -> Poisson(lam) pointwise as n -> infinity *) +let POISSON_LIMIT = prove + (`!k lam. &0 < lam ==> + ((\n. &(binom(n,k)) * (lam / &n) pow k * + (&1 - lam / &n) pow (n - k)) + ---> poisson_pmf lam k) sequentially`, + REPEAT STRIP_TAC THEN REWRITE_TAC[poisson_pmf] THEN + SUBGOAL_THEN + `exp(--lam) * lam pow k / &(FACT k) = + inv(&(FACT k)) * (lam pow k * exp(--lam))` + SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN CONV_TAC REAL_RING; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n. (&(binom(n,k)) / &n pow k) * + (lam pow k * (&1 - lam / &n) pow (n - k))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + MP_TAC(SPEC `lam:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + EXISTS_TAC `M + k + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `~(&n pow k = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0; REAL_OF_NUM_EQ; DE_MORGAN_THM] THEN + DISJ1_TAC THEN UNDISCH_TAC `M + k + 1 <= n` THEN ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_DIV] THEN + ASM_SIMP_TAC[REAL_FIELD + `~(nk = &0) ==> b / nk * (lk * rest) = b * lk / nk * rest`]; + ALL_TAC] THEN + MATCH_MP_TAC REALLIM_MUL THEN REWRITE_TAC[REALLIM_BINOM_OVER_NPOWER] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n. (&1 - lam / &n) pow n / (&1 - lam / &n) pow k` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + MP_TAC(SPEC `lam:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `P:num`) THEN + EXISTS_TAC `P + k + 1` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC(GSYM REAL_POW_SUB) THEN CONJ_TAC THENL + [SUBGOAL_THEN `lam < &n` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&P` THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + UNDISCH_TAC `P + k + 1 <= n` THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < &n` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `lam / &n < &1` MP_TAC THENL + [ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + UNDISCH_TAC `P + k + 1 <= n` THEN ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `exp(--lam) = exp(--lam) / &1` SUBST1_TAC THENL + [REWRITE_TAC[REAL_DIV_1]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_DIV THEN CONJ_TAC THENL + [ASM_SIMP_TAC[REALLIM_POW_EXP_NEG']; ALL_TAC] THEN + CONJ_TAC THENL + [SUBGOAL_THEN `((\n:num. &1 - lam / &n) ---> &1) sequentially` + MP_TAC THENL + [MP_TAC(ISPECL [`sequentially:(num)net`; `(\n:num. &1):num->real`; + `(\n:num. lam / &n):num->real`; `&1`; `&0`] + REALLIM_SUB) THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[real_div] THEN + SUBGOAL_THEN `&0 = lam * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REALLIM_LMUL THEN REWRITE_TAC[REALLIM_1_OVER_N]]]; + DISCH_TAC THEN + SUBGOAL_THEN `&1 = &1 pow k` + (fun th -> ONCE_REWRITE_TAC[th]) THENL + [REWRITE_TAC[REAL_POW_ONE]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_POW THEN ASM_REWRITE_TAC[REAL_POW_ONE]]; + REAL_ARITH_TAC]);; + + +(* ========================================================================= *) +(* Geometric distribution *) +(* ========================================================================= *) + +(* PMF: geometric_pmf p k = p * (1-p)^k for k = 0, 1, 2, ... *) +(* Counts the number of failures before the first success. *) + +let geometric_pmf = new_definition + `geometric_pmf (p:real) (k:num) = p * (&1 - p) pow k`;; + +(* The Geometric PMF sums to 1 *) +let GEOMETRIC_PMF_SUMS = prove + (`!p. &0 < p /\ p <= &1 + ==> (geometric_pmf p real_sums &1) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `((\k. p * (&1 - p) pow k) real_sums + (p * ((&1 - p) pow 0 / (&1 - (&1 - p))))) (from 0)` + MP_TAC THENL + [MATCH_MP_TAC REAL_SERIES_LMUL THEN + MATCH_MP_TAC REAL_SUMS_GP THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o check (is_conj o concl)) THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `p * (&1 - p) pow 0 / (&1 - (&1 - p)) = &1` SUBST1_TAC THENL + [REWRITE_TAC[real_pow; REAL_MUL_RID] THEN + SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_DIV_REFL; REAL_DIV_LMUL]; + ALL_TAC] THEN + SUBGOAL_THEN `geometric_pmf p = (\k. p * (&1 - p) pow k)` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; geometric_pmf]);; + +(* Non-negativity of the Geometric PMF *) +let GEOMETRIC_PMF_POS = prove + (`!p k. &0 <= p /\ p <= &1 ==> &0 <= geometric_pmf p k`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[geometric_pmf] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_POW_LE THEN ASM_REAL_ARITH_TAC]);; + + +(* ========================================================================= *) +(* Analytic infrastructure for the Geometric mean *) +(* ========================================================================= *) + +(* Derivative of the finite geometric sum: *) +(* d/dx[sum_{k=0}^n x^k] = sum_{k=0}^n k*x^{k-1} *) +(* = (1 - (n+1)*x^n + n*x^{n+1}) / (1-x)^2 *) +let SUM_GP_DERIVATIVE = prove + (`!n x:real. ~(x = &1) ==> + sum(0..n) (\k. &k * x pow (k - 1)) = + (&1 - &(SUC n) * x pow n + &n * x pow (SUC n)) / (&1 - x) pow 2`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_DERIVATIVE_UNIQUE_ATREAL THEN + MAP_EVERY EXISTS_TAC + [`\x:real. sum(0..n) (\k. x pow k)`; `x:real`] THEN + SUBGOAL_THEN + `!x:real. sum(0..n) (\k. x pow k) = + if x = &1 then &(SUC n) else (&1 - x pow (SUC n)) / (&1 - x)` + (LABEL_TAC "gp") THENL + [GEN_TAC THEN REWRITE_TAC[SUM_GP] THEN + SUBGOAL_THEN `~(n < 0)` (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + COND_CASES_TAC THENL + [ASM_REWRITE_TAC[REAL_POW_ONE; SUB_0] THEN ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_pow; REAL_MUL_LID; SUB_0]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC HAS_REAL_DERIVATIVE_SUM THEN REWRITE_TAC[FINITE_NUMSEG] THEN + REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN CONV_TAC REAL_RING; + ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_TRANSFORM_ATREAL THEN + EXISTS_TAC `\x. (&1 - x pow (SUC n)) / (&1 - x)` THEN + EXISTS_TAC `abs(x - &1)` THEN + CONJ_TAC THENL + [UNDISCH_TAC `~(x = &1)` THEN REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `x':real` THEN DISCH_TAC THEN + REMOVE_THEN "gp" (MP_TAC o SPEC `x':real`) THEN + SUBGOAL_THEN `~(x' = &1)` (fun th -> REWRITE_TAC[th]) THENL + [UNDISCH_TAC `abs(x' - x) < abs(x - &1)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SIMP_TAC[]; + ALL_TAC] THEN + REAL_DIFF_TAC THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `SUC n - 1 = n` SUBST1_TAC THENL [ARITH_TAC; ALL_TAC] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[real_pow; REAL_MUL_LID; REAL_MUL_RID] THEN + SUBGOAL_THEN `&(SUC n) = &n + &1` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_SUC] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC);; + +(* Closed form for sum_{k=0}^n k * x^k *) +let SUM_KX_POW = prove + (`!n z:real. ~(z = &1) ==> + sum(0..n) (\k. &k * z pow k) = + z * (&1 - &(SUC n) * z pow n + &n * z pow (SUC n)) / + (&1 - z) pow 2`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MP_TAC(SPECL [`n:num`; `z:real`] SUM_GP_DERIVATIVE) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `sum(0..n) (\k. &k * z pow k) = + z * sum(0..n) (\k. &k * z pow (k - 1))` + SUBST1_TAC THENL [ALL_TAC; ASM_REWRITE_TAC[]] THEN + SPEC_TAC(`n:num`, `n:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + ASM_REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + AP_TERM_TAC THEN + SUBGOAL_THEN `SUC n' - 1 = n'` SUBST1_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_pow; REAL_MUL_AC]);; + +(* Real version of n * z^n -> 0, derived from complex LIM_N_TIMES_POWN *) +let REALLIM_N_TIMES_POWN = prove + (`!z:real. abs z < &1 ==> ((\n. &n * z pow n) ---> &0) sequentially`, + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REALLIM_COMPLEX; o_DEF; CX_MUL; CX_POW] THEN + MP_TAC(SPEC `Cx(z)` LIM_N_TIMES_POWN) THEN + REWRITE_TAC[COMPLEX_NORM_CX] THEN ASM_REWRITE_TAC[]);; + +(* Infinite series: sum_{k=0}^{inf} k * x^k = x / (1-x)^2 *) +let REAL_SUMS_KX_POW = prove + (`!x. abs(x) < &1 ==> + ((\k. &k * x pow k) real_sums (x / (&1 - x) pow 2)) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `~(x = &1)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~((&1 - x) pow 2 = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0; ARITH] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_sums; FROM_0; INTER_UNIV] THEN + ASM_SIMP_TAC[SUM_KX_POW] THEN + SUBGOAL_THEN `x / (&1 - x) pow 2 = x * &1 / (&1 - x) pow 2` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_DIV THEN ASM_REWRITE_TAC[REALLIM_CONST] THEN + (* Need (1 - (SUC n)*x^n + n*x^{SUC n}) -> 1 *) + SUBGOAL_THEN `((\n. &(SUC n) * x pow n) ---> &0) sequentially` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_SUC; REAL_ADD_RDISTRIB; REAL_MUL_LID] THEN + SUBGOAL_THEN `&0 = &0 + &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_N_TIMES_POWN THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_POWN THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. (&1 - &(SUC n) * x pow n) + &n * x pow (SUC n)` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`sequentially:(num)net`; + `\n:num. &1 - &(SUC n) * x pow n`; + `\n:num. &n * x pow (SUC n)`; + `&1`; `&0`] REALLIM_ADD) THEN + REWRITE_TAC[REAL_ADD_RID] THEN + DISCH_THEN MATCH_MP_TAC THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`sequentially:(num)net`; + `\n:num. &1`; + `\n:num. &(SUC n) * x pow n`; + `&1`; `&0`] REALLIM_SUB) THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REALLIM_CONST] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[real_pow] THEN + SUBGOAL_THEN `(\n. &n * x * x pow n) = (\n. x * (&n * x pow n))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 = x * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_N_TIMES_POWN THEN ASM_REWRITE_TAC[]);; + +(* Mean of Geometric distribution: E[X] = (1-p)/p *) +let GEOMETRIC_MEAN_SERIES = prove + (`!p. &0 < p /\ p <= &1 + ==> ((\k. &k * geometric_pmf p k) real_sums (&1 - p) / p) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(\k. &k * geometric_pmf p k) = (\k. p * (&k * (&1 - p) pow k))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; geometric_pmf] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(&1 - p) / p = p * ((&1 - p) / (&1 - (&1 - p)) pow 2)` + SUBST1_TAC THENL + [SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_2] THEN + ASM_SIMP_TAC[REAL_FIELD + `~(p = &0) ==> p * (&1 - p) / (p * p) = (&1 - p) / p`]; + MATCH_MP_TAC REAL_SERIES_LMUL THEN + MATCH_MP_TAC REAL_SUMS_KX_POW THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o check (is_conj o concl)) THEN + ASM_REAL_ARITH_TAC]);; + +(* ====================================================================== *) +(* Geometric variance: Var(X) = (1-p)/p^2 *) +(* ====================================================================== *) + +(* Analytic infrastructure: second derivative of finite GP sum *) + +let REAL_POW_OFFSET2 = prove + (`!x:real k. 2 <= k ==> x pow k = x pow 2 * x pow (k - 2)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_POW_ADD] THEN + AP_TERM_TAC THEN ASM_ARITH_TAC);; + +let REALLIM_NSQUARED_TIMES_POWN = prove + (`!z:real. abs z < &1 + ==> ((\n. &n pow 2 * z pow n) ---> &0) sequentially`, + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN + EXISTS_TAC `\n. (&n * sqrt(abs z) pow n) pow 2` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW; REAL_ABS_NUM] THEN + REWRITE_TAC[REAL_POW_MUL; REAL_POW_2] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[GSYM REAL_POW_MUL] THEN + SUBGOAL_THEN `sqrt(abs z) * sqrt(abs z) = abs z` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_POW_2; SQRT_POW2] THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC REALLIM_NULL_POW THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_N_TIMES_POWN THEN + SUBGOAL_THEN `&0 <= sqrt(abs z)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 <= x ==> abs x = x`] THEN + SUBGOAL_THEN `&1 = sqrt(&1)` SUBST1_TAC THENL + [REWRITE_TAC[SQRT_1]; ALL_TAC] THEN + REWRITE_TAC[SQRT_MONO_LT_EQ] THEN ASM_REAL_ARITH_TAC; + ARITH_TAC]);; + +let POLY_IDENTITY = prove + (`!A B C N y:real. + B = A * y /\ C = B * y + ==> (--((N + &1) * N * A) + N * (N + &1) * B) * (&1 - y) * (&1 - y) - + (&1 - (N + &1) * B + N * C) * &2 * (&1 - y) * -- &1 = + (&2 - N * (N + &1) * A + + &2 * (N - &1) * (N + &1) * B - N * (N - &1) * C) * + (&1 - y)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + CONV_TAC REAL_RING);; + +let SUM_GP_SECOND_DERIVATIVE = prove + (`!n x:real. ~(x = &1) ==> + sum(0..n) (\k. &k * (&k - &1) * x pow (k - 2)) = + (&2 - &n * &(SUC n) * x pow (n - 1) + + &2 * (&n - &1) * &(SUC n) * x pow n - + &n * (&n - &1) * x pow (SUC n)) / (&1 - x) pow 3`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_DERIVATIVE_UNIQUE_ATREAL THEN + MAP_EVERY EXISTS_TAC + [`\x:real. sum(0..n) (\k. &k * x pow (k - 1))`; `x:real`] THEN + SUBGOAL_THEN + `!x:real. ~(x = &1) ==> + sum(0..n) (\k. &k * x pow (k - 1)) = + (&1 - &(SUC n) * x pow n + &n * x pow (SUC n)) / (&1 - x) pow 2` + (LABEL_TAC "deriv1") THENL + [MATCH_ACCEPT_TAC SUM_GP_DERIVATIVE; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC HAS_REAL_DERIVATIVE_SUM THEN REWRITE_TAC[FINITE_NUMSEG] THEN + REPEAT STRIP_TAC THEN REAL_DIFF_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN + ASM_CASES_TAC `k = 0` THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `1 <= k` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&(k - 1) = &k - &1` SUBST1_TAC THENL + [ASM_SIMP_TAC[REAL_OF_NUM_SUB]; ALL_TAC] THEN + SUBGOAL_THEN `k - 1 - 1 = k - 2` SUBST1_TAC THENL + [ASM_ARITH_TAC; REFL_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC HAS_REAL_DERIVATIVE_TRANSFORM_ATREAL THEN + EXISTS_TAC + `\x. (&1 - &(SUC n) * x pow n + &n * x pow (SUC n)) / + (&1 - x) pow 2` THEN + EXISTS_TAC `abs(x - &1)` THEN + CONJ_TAC THENL + [UNDISCH_TAC `~(x = &1)` THEN REAL_ARITH_TAC; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `x':real` THEN DISCH_TAC THEN + SUBGOAL_THEN `~(x' = &1)` ASSUME_TAC THENL + [UNDISCH_TAC `abs(x' - x) < abs(x - &1)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REMOVE_THEN "deriv1" (MP_TAC o SPEC `x':real`) THEN + ASM_REWRITE_TAC[] THEN SIMP_TAC[]; + ALL_TAC] THEN + REAL_DIFF_TAC THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RID; REAL_SUB_LZERO] THEN + SUBGOAL_THEN `SUC n - 1 = n` SUBST1_TAC THENL [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `2 - 1 = 1` SUBST1_TAC THENL [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_1] THEN + SUBGOAL_THEN `~(&1 - x = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~((&1 - x) pow 4 = &0) /\ ~((&1 - x) pow 3 = &0)` + ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_POW] THEN CONV_TAC NUM_REDUCE_CONV THEN + ASM_SIMP_TAC[REAL_FIELD + `~(c pow 4 = &0) /\ ~(c pow 3 = &0) ==> + (a / c pow 4 = b / c pow 3 <=> a = b * c)`] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_SUC; REAL_POW_2] THEN + ASM_CASES_TAC `n = 0` THENL + [ASM_REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[real_pow; REAL_MUL_LZERO; REAL_MUL_RZERO; + REAL_ADD_LID; REAL_SUB_RZERO; REAL_SUB_LZERO; REAL_NEG_0; + REAL_ADD_RID; REAL_MUL_LID; REAL_MUL_RID] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `1 <= n` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC POLY_IDENTITY THEN + CONJ_TAC THENL + [SUBGOAL_THEN `n = SUC(n - 1)` + (fun th -> GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [th]) THENL + [ASM_ARITH_TAC; REWRITE_TAC[real_pow; REAL_MUL_AC]]; + REWRITE_TAC[real_pow; REAL_MUL_AC]]);; + +let SUM_KK1X_POW = prove + (`!n z:real. ~(z = &1) ==> + sum(0..n) (\k. &k * (&k - &1) * z pow k) = + z pow 2 * (&2 - &n * &(SUC n) * z pow (n - 1) + + &2 * (&n - &1) * &(SUC n) * z pow n - + &n * (&n - &1) * z pow (SUC n)) / (&1 - z) pow 3`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `(\k. &k * (&k - &1) * z pow k) = + (\k. z pow 2 * (&k * (&k - &1) * z pow (k - 2)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `i:num` THEN + ASM_CASES_TAC `i < 2` THENL + [SUBGOAL_THEN `i = 0 \/ i = 1` DISJ_CASES_TAC THENL + [ASM_ARITH_TAC; ALL_TAC; ALL_TAC] THEN ASM_REWRITE_TAC[] THEN + CONV_TAC NUM_REDUCE_CONV THEN CONV_TAC REAL_RAT_REDUCE_CONV THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `2 <= i` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_POW_OFFSET2] THEN REWRITE_TAC[REAL_MUL_AC]; + ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL] THEN + ASM_SIMP_TAC[SUM_GP_SECOND_DERIVATIVE] THEN + REWRITE_TAC[real_div; REAL_MUL_AC]);; + +let POW_PRED = prove + (`!x:real n. ~(x = &0) /\ 1 <= n ==> x pow (n - 1) = x pow n * inv x`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_EQ_RCANCEL_IMP THEN EXISTS_TAC `x:real` THEN + ASM_REWRITE_TAC[] THEN + CONV_TAC(RAND_CONV(REWR_CONV(GSYM REAL_MUL_ASSOC))) THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_RID] THEN + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [GSYM REAL_POW_1] THEN + REWRITE_TAC[GSYM REAL_POW_ADD] THEN + SUBGOAL_THEN `n - 1 + 1 = n` (fun th -> REWRITE_TAC[th]) THEN + ASM_ARITH_TAC);; + +(* Limit of the numerator in the second derivative GP closed form *) +let NUMERATOR_LIMIT = prove + (`!x:real. abs x < &1 + ==> ((\n. &2 - &n * &(SUC n) * x pow (n - 1) + + &2 * (&n - &1) * &(SUC n) * x pow n - + &n * (&n - &1) * x pow (SUC n)) ---> &2) sequentially`, + GEN_TAC THEN DISCH_TAC THEN + ASM_CASES_TAC `x = &0` THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. &2` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `2` THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `1 <= n - 1 /\ ~(n - 1 = 0) /\ ~(SUC n = 0) /\ ~(n = 0)` + STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_POW_ZERO] THEN REAL_ARITH_TAC; + REWRITE_TAC[REALLIM_CONST]]; + ALL_TAC] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\n:num. &2 + (-- inv(x) + &2 - x) * (&n pow 2 * x pow n) + + (-- inv(x) + x) * (&n * x pow n) + + (-- &2) * x pow n` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `1` THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN + ASM_SIMP_TAC[POW_PRED] THEN + REWRITE_TAC[real_pow; GSYM REAL_OF_NUM_SUC] THEN + REWRITE_TAC[REAL_POW_2] THEN + SUBGOAL_THEN `inv(x) * x = &1` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_MUL_LINV]; ALL_TAC] THEN + CONV_TAC REAL_RING; + ALL_TAC] THEN + SUBGOAL_THEN `&2 = &2 + &0` + (fun th -> GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; ALL_TAC] THEN + SUBGOAL_THEN `&0 = &0 + &0` + (fun th -> GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [SUBGOAL_THEN `&0 = (-- inv x + &2 - x) * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_NSQUARED_TIMES_POWN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 = &0 + &0` + (fun th -> GEN_REWRITE_TAC (RATOR_CONV o RAND_CONV) [th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_ADD THEN CONJ_TAC THENL + [SUBGOAL_THEN `&0 = (-- inv x + x) * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_N_TIMES_POWN THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&0 = (-- &2) * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_POWN THEN ASM_REWRITE_TAC[]]);; + +(* Infinite series: sum of k*(k-1)*x^k *) +let REAL_SUMS_KK1X_POW = prove + (`!x:real. abs x < &1 + ==> ((\k. &k * (&k - &1) * x pow k) real_sums + (&2 * x pow 2 / (&1 - x) pow 3)) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[real_sums; FROM_INTER_NUMSEG] THEN + ASM_CASES_TAC `x = &1` THENL + [ASM_MESON_TAC[REAL_ARITH `~(abs(&1) < &1)`]; ALL_TAC] THEN + ASM_SIMP_TAC[SUM_KK1X_POW] THEN + SUBGOAL_THEN `~((&1 - x) pow 3 = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(\n. x pow 2 * (&2 - &n * &(SUC n) * x pow (n - 1) + + &2 * (&n - &1) * &(SUC n) * x pow n - + &n * (&n - &1) * x pow (SUC n)) / (&1 - x) pow 3) = + (\n. x pow 2 / (&1 - x) pow 3 * + (&2 - &n * &(SUC n) * x pow (n - 1) + + &2 * (&n - &1) * &(SUC n) * x pow n - + &n * (&n - &1) * x pow (SUC n)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + ASM_SIMP_TAC[real_div; REAL_INV_MUL; REAL_MUL_AC]; + ALL_TAC] THEN + SUBGOAL_THEN `&2 * x pow 2 / (&1 - x) pow 3 = + x pow 2 / (&1 - x) pow 3 * &2` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC NUMERATOR_LIMIT THEN ASM_REWRITE_TAC[]);; + +(* Second factorial moment: E[X(X-1)] = 2(1-p)^2/p^2 *) +let GEOMETRIC_SECOND_FACTORIAL_MOMENT = prove + (`!p. &0 < p /\ p <= &1 + ==> ((\k. &k * (&k - &1) * geometric_pmf p k) real_sums + (&2 * (&1 - p) pow 2 / p pow 2)) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(\k. &k * (&k - &1) * geometric_pmf p k) = + (\k. p * (&k * (&k - &1) * (&1 - p) pow k))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; geometric_pmf] THEN GEN_TAC THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `&2 * (&1 - p) pow 2 / p pow 2 = + p * (&2 * (&1 - p) pow 2 / (&1 - (&1 - p)) pow 3)` SUBST1_TAC THENL + [SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_FIELD + `~(p = &0) ==> + p * &2 * (&1 - p) pow 2 / p pow 3 = + &2 * (&1 - p) pow 2 / p pow 2`]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_SERIES_LMUL THEN + MATCH_MP_TAC REAL_SUMS_KK1X_POW THEN + FIRST_X_ASSUM(STRIP_ASSUME_TAC o check (is_conj o concl)) THEN + ASM_REAL_ARITH_TAC);; + +(* Second moment: E[X^2] = 2(1-p)^2/p^2 + (1-p)/p *) +let GEOMETRIC_SECOND_MOMENT = prove + (`!p. &0 < p /\ p <= &1 + ==> ((\k. &k pow 2 * geometric_pmf p k) real_sums + (&2 * (&1 - p) pow 2 / p pow 2 + (&1 - p) / p)) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `(\k. &k pow 2 * geometric_pmf p k) = + (\k. &k * (&k - &1) * geometric_pmf p k + + &k * geometric_pmf p k)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_SERIES_ADD THEN + ASM_SIMP_TAC[GEOMETRIC_SECOND_FACTORIAL_MOMENT; GEOMETRIC_MEAN_SERIES]);; + +(* Variance: Var(X) = (1-p)/p^2 *) +let GEOMETRIC_VARIANCE_SERIES = prove + (`!p. &0 < p /\ p <= &1 + ==> ((\k. (&k - (&1 - p) / p) pow 2 * geometric_pmf p k) real_sums + (&1 - p) / p pow 2) (from 0)`, + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k pow 2 * geometric_pmf p k) real_sums + (&2 * (&1 - p) pow 2 / p pow 2 + (&1 - p) / p)) (from 0)` ASSUME_TAC + THENL [ASM_SIMP_TAC[GEOMETRIC_SECOND_MOMENT]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k * geometric_pmf p k) real_sums (&1 - p) / p) (from 0)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[GEOMETRIC_MEAN_SERIES]; ALL_TAC] THEN + SUBGOAL_THEN `(geometric_pmf p real_sums &1) (from 0)` ASSUME_TAC THENL + [ASM_SIMP_TAC[GEOMETRIC_PMF_SUMS]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. (-- &2 * (&1 - p) / p) * &k * geometric_pmf p k) real_sums + (-- &2 * (&1 - p) / p) * (&1 - p) / p) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_LMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. ((&1 - p) / p) pow 2 * geometric_pmf p k) real_sums + ((&1 - p) / p) pow 2 * &1) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_LMUL THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k pow 2 * geometric_pmf p k + + (-- &2 * (&1 - p) / p) * &k * geometric_pmf p k) real_sums + (&2 * (&1 - p) pow 2 / p pow 2 + (&1 - p) / p) + + (-- &2 * (&1 - p) / p) * (&1 - p) / p) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. (&k pow 2 * geometric_pmf p k + + (-- &2 * (&1 - p) / p) * &k * geometric_pmf p k) + + ((&1 - p) / p) pow 2 * geometric_pmf p k) real_sums + ((&2 * (&1 - p) pow 2 / p pow 2 + (&1 - p) / p) + + (-- &2 * (&1 - p) / p) * (&1 - p) / p) + + ((&1 - p) / p) pow 2 * &1) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(\k. (&k - (&1 - p) / p) pow 2 * geometric_pmf p k) = + (\k. (&k pow 2 * geometric_pmf p k + + (-- &2 * (&1 - p) / p) * &k * geometric_pmf p k) + + ((&1 - p) / p) pow 2 * geometric_pmf p k)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(&1 - p) / p pow 2 = + ((&2 * (&1 - p) pow 2 / p pow 2 + (&1 - p) / p) + + (-- &2 * (&1 - p) / p) * (&1 - p) / p) + + ((&1 - p) / p) pow 2 * &1` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `~(p = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + ASM_REWRITE_TAC[]);; + +(* ====================================================================== *) +(* Negative binomial distribution: NB(r, p) *) +(* Counts failures before the r-th success in Bernoulli(p) trials. *) +(* PMF: binom(k+r-1, k) * p^r * (1-p)^k *) +(* ====================================================================== *) + +(* ---------------------------------------------------------------------- *) +(* Infrastructure: polynomial times geometric -> 0 *) +(* ---------------------------------------------------------------------- *) + +(* General: n^r * z^n -> 0 for |z| < 1, by induction on r. + Base: z^n -> 0. Step: compare with n * sqrt(|z|)^n using IH. *) +let REALLIM_POW_TIMES_POWN = prove + (`!r z. abs z < &1 + ==> ((\n. &n pow r * z pow n) ---> &0) sequentially`, + INDUCT_TAC THENL + [REWRITE_TAC[real_pow; REAL_MUL_LID] THEN REWRITE_TAC[REALLIM_POWN]; + ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_COMPARISON) THEN + EXISTS_TAC `\n. &n * sqrt(abs z) pow n` THEN CONJ_TAC THENL + [SUBGOAL_THEN `abs(sqrt(abs z)) < &1` ASSUME_TAC THENL + [SUBGOAL_THEN `&0 <= sqrt(abs z)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 <= x ==> abs x = x`] THEN + SUBGOAL_THEN `&1 = sqrt(&1)` SUBST1_TAC THENL + [REWRITE_TAC[SQRT_1]; ALL_TAC] THEN + REWRITE_TAC[SQRT_MONO_LT_EQ] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `sqrt(abs z)`) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `eventually (\n. &n pow r * sqrt(abs z) pow n <= &1) sequentially` + MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN + REWRITE_TAC[REAL_SUB_RZERO; EVENTUALLY_SEQUENTIALLY] THEN + MESON_TAC[REAL_ARITH `abs x < &1 ==> x <= &1`]; + ALL_TAC] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] EVENTUALLY_MONO) THEN + REWRITE_TAC[] THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW; REAL_ABS_NUM] THEN + SUBGOAL_THEN `abs z pow n = sqrt(abs z) pow n * sqrt(abs z) pow n` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_POW_ADD; GSYM MULT_2; GSYM REAL_POW_POW] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + MP_TAC(SPEC `abs(z:real)` SQRT_POW_2) THEN + REWRITE_TAC[REAL_ABS_POS] THEN MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[real_pow; REAL_MUL_ASSOC] THEN + SUBGOAL_THEN + `((&n * &n pow r) * sqrt(abs z) pow n) * sqrt(abs z) pow n = + &n * (&n pow r * sqrt(abs z) pow n) * sqrt(abs z) pow n` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sqrt(abs z) pow n = &1 * sqrt(abs z) pow n` + (fun th -> GEN_REWRITE_TAC RAND_CONV [th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC SQRT_POS_LE THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC REALLIM_N_TIMES_POWN THEN + SUBGOAL_THEN `&0 <= sqrt(abs z)` ASSUME_TAC THENL + [MATCH_MP_TAC SQRT_POS_LE THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 <= x ==> abs x = x`] THEN + SUBGOAL_THEN `&1 = sqrt(&1)` SUBST1_TAC THENL + [REWRITE_TAC[SQRT_1]; ALL_TAC] THEN + REWRITE_TAC[SQRT_MONO_LT_EQ] THEN ASM_REAL_ARITH_TAC);; + +(* Binomial coefficient bound: binom(n,k) <= n^k *) +let BINOM_LE_POW = prove + (`!n k. binom(n,k) <= n EXP k`, + INDUCT_TAC THENL + [INDUCT_TAC THEN REWRITE_TAC[binom; EXP; LE_REFL; LE_0]; ALL_TAC] THEN + INDUCT_TAC THENL + [REWRITE_TAC[binom; EXP; LE_REFL]; ALL_TAC] THEN + REWRITE_TAC[binom; EXP] THEN + MATCH_MP_TAC LE_TRANS THEN + EXISTS_TAC `n EXP (SUC k) + n EXP k` THEN CONJ_TAC THENL + [MATCH_MP_TAC LE_ADD2 THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `SUC k`) THEN REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[EXP] THEN + SUBGOAL_THEN `n * n EXP k + n EXP k = SUC n * n EXP k` + SUBST1_TAC THENL + [REWRITE_TAC[MULT_CLAUSES]; ALL_TAC] THEN + MATCH_MP_TAC LE_MULT2 THEN REWRITE_TAC[LE_REFL; LE] THEN + MATCH_MP_TAC EXP_MONO_LE_IMP THEN ARITH_TAC);; + +(* Symmetry of binom on sum: binom(m+n, m) = binom(m+n, n) *) +let BINOM_SYMM_ADD = prove + (`!m n. binom(m + n, m) = binom(m + n, n)`, + REPEAT GEN_TAC THEN + MP_TAC(SPECL [`n:num`; `m:num`] BINOM_FACT) THEN + MP_TAC(SPECL [`m:num`; `n:num`] BINOM_FACT) THEN + REWRITE_TAC[ARITH_RULE `n + m = m + n:num`] THEN + DISCH_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `FACT m * FACT n * binom(m + n, n) = + FACT m * FACT n * binom(m + n, m)` MP_TAC THENL + [ASM_MESON_TAC[MULT_AC]; ALL_TAC] THEN + REWRITE_TAC[EQ_MULT_LCANCEL; MULT_EQ_0; FACT_NZ] THEN + MESON_TAC[]);; + +(* Binomial coefficient times geometric -> 0 *) +let REALLIM_BINOM_POWN = prove + (`!r z. abs z < &1 + ==> ((\N. &(binom(N + r, r)) * z pow N) ---> &0) sequentially`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_COMPARISON) THEN + EXISTS_TAC `\N. &((N + r) EXP r) * abs(z) pow N` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_POW] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_NUM; REAL_OF_NUM_LE; BINOM_LE_POW]; + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC(INST_TYPE [`:num`,`:A`] REALLIM_NULL_COMPARISON) THEN + EXISTS_TAC `\N. &2 pow r * (&N pow r * abs(z) pow N)` THEN CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `r:num` THEN + X_GEN_TAC `N:num` THEN DISCH_TAC THEN REWRITE_TAC[REAL_ABS_MUL] THEN + REWRITE_TAC[REAL_ABS_NUM; REAL_ABS_POW] THEN + REWRITE_TAC[REAL_ARITH `abs(abs z) = abs z`] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_POW; REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN + MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `(2 * N) EXP r` THEN CONJ_TAC THENL + [MATCH_MP_TAC EXP_MONO_LE_IMP THEN ASM_ARITH_TAC; + REWRITE_TAC[MULT_EXP] THEN ARITH_TAC]; + MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 = &2 pow r * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_POW_TIMES_POWN THEN + ASM_REAL_ARITH_TAC);; + +(* ---------------------------------------------------------------------- *) +(* Core series identity: NB generating function *) +(* sum_{k=0}^{inf} binom(k+n, k) * x^k = inv((1-x)^{n+1}) *) +(* ---------------------------------------------------------------------- *) + +(* binom(n,n) = 1 for all n *) +let BINOM_DIAG = prove + (`!n. binom(n,n) = 1`, + GEN_TAC THEN + MP_TAC(SPECL [`0`; `n:num`] BINOM_FACT) THEN + REWRITE_TAC[ADD_CLAUSES; FACT; MULT_CLAUSES] THEN + DISCH_TAC THEN + SUBGOAL_THEN `FACT n * binom(n,n) = FACT n * 1` MP_TAC THENL + [ASM_REWRITE_TAC[MULT_CLAUSES]; ALL_TAC] THEN + REWRITE_TAC[EQ_MULT_LCANCEL; FACT_NZ]);; + +(* Pascal identity in the form needed for telescoping *) +let BINOM_PASCAL_ADD = prove + (`!N n. binom(SUC N + SUC n, SUC N) = + binom(N + SUC n, SUC N) + binom(N + SUC n, N)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `SUC N + SUC n = SUC(N + SUC n)` SUBST1_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[binom]);; + +(* Finite telescoping: (1-x) * sum B(k+n+1,k)*x^k = sum B(k+n,k)*x^k - error *) +let NB_SERIES_TELESCOPING = prove + (`!n x N. + (&1 - x) * sum(0..N) (\k. &(binom(k + SUC n, k)) * x pow k) = + sum(0..N) (\k. &(binom(k + n, k)) * x pow k) - + &(binom(N + SUC n, N)) * x pow (SUC N)`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_REFL] THEN + REWRITE_TAC[ADD_CLAUSES; binom; real_pow; REAL_MUL_RID; REAL_MUL_LID] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + FIRST_X_ASSUM(fun th -> REWRITE_TAC[th]) THEN + SUBGOAL_THEN `&(binom(SUC N + SUC n, SUC N)) = + &(binom(N + SUC n, SUC N)) + &(binom(N + SUC n, N))` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_ADD; BINOM_PASCAL_ADD]; ALL_TAC] THEN + SUBGOAL_THEN `N + SUC n = SUC N + n` (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_pow] THEN CONV_TAC REAL_RING);; + +(* The negative binomial generating function *) +let NB_SERIES = prove + (`!n x. abs x < &1 ==> + ((\k. &(binom(k + n, k)) * x pow k) real_sums + inv((&1 - x) pow (SUC n))) (from 0)`, + INDUCT_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `(\k. &(binom(k + 0, k)) * x pow k) = (\k. x pow k)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; ADD_CLAUSES; BINOM_DIAG; REAL_MUL_LID]; + ALL_TAC] THEN + SUBGOAL_THEN `inv((&1 - x) pow SUC 0) = x pow 0 / (&1 - x)` + SUBST1_TAC THENL + [REWRITE_TAC[real_pow; REAL_MUL_LID; REAL_POW_1; real_div; REAL_MUL_LID; + REAL_MUL_RID]; ALL_TAC] THEN + MATCH_MP_TAC REAL_SUMS_GP THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `~(&1 - x = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:real`) THEN + ASM_REWRITE_TAC[real_sums; FROM_0; INTER_UNIV] THEN DISCH_TAC THEN + REWRITE_TAC[real_sums; FROM_0; INTER_UNIV] THEN + MATCH_MP_TAC REALLIM_TRANSFORM_EVENTUALLY THEN + EXISTS_TAC `\N. inv(&1 - x) * + (sum(0..N) (\k. &(binom(k + n, k)) * x pow k) - + &(binom(N + SUC n, N)) * x pow (SUC N))` THEN + CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN + MP_TAC(SPECL [`n:num`; `x:real`; `n':num`] NB_SERIES_TELESCOPING) THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + ASM_SIMP_TAC[REAL_MUL_ASSOC; REAL_MUL_LINV; REAL_MUL_LID]; + ALL_TAC] THEN + SUBGOAL_THEN + `inv((&1 - x) pow SUC(SUC n)) = + inv(&1 - x) * (inv((&1 - x) pow SUC n) - &0)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_SUB_RZERO; real_pow; REAL_INV_MUL]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_SUB THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(\N. &(binom(N + SUC n, N)) * x pow SUC N) = + (\N. x * (&(binom(N + SUC n, SUC n)) * x pow N))` SUBST1_TAC + THENL + [REWRITE_TAC[FUN_EQ_THM; BINOM_SYMM_ADD; real_pow] THEN + GEN_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 = x * &0` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN + MATCH_MP_TAC REALLIM_BINOM_POWN THEN ASM_REWRITE_TAC[]);; + +(* ========================================================================= *) +(* Negative Binomial Distribution NB(r, p) *) +(* r = number of successes, p = success probability, k = number of failures *) +(* PMF: binom(k+r-1, k) * p^r * (1-p)^k *) +(* ========================================================================= *) + +let neg_binomial_pmf = new_definition + `neg_binomial_pmf r p k = + &(binom(k + r - 1, k)) * p pow r * (&1 - p) pow k`;; + +(* Non-negativity of negative binomial PMF *) +let NEG_BINOMIAL_PMF_POS = prove + (`!r p k. &0 < p /\ p <= &1 ==> &0 <= neg_binomial_pmf r p k`, + REPEAT STRIP_TAC THEN REWRITE_TAC[neg_binomial_pmf] THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC REAL_POW_LE THEN ASM_REAL_ARITH_TAC]);; + +(* Normalization: negative binomial PMF sums to 1 *) +let NEG_BINOMIAL_PMF_SUMS = prove + (`!r p. 1 <= r /\ &0 < p /\ p <= &1 + ==> ((\k. neg_binomial_pmf r p k) real_sums &1) (from 0)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[neg_binomial_pmf] THEN + SUBGOAL_THEN `(\k. &(binom(k + r - 1, k)) * p pow r * (&1 - p) pow k) = + (\k. p pow r * &(binom(k + r - 1, k)) * (&1 - p) pow k)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(p pow r = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0; DE_MORGAN_THM] THEN + DISJ1_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(&1 - p) < &1` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `SUC(r - 1) = r` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`r - 1`; `&1 - p`] NB_SERIES) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o MATCH_MP REAL_SERIES_LMUL) THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(p:real) pow r`) THEN + REWRITE_TAC[] THEN + ASM_SIMP_TAC[REAL_MUL_RINV]);; + +(* Geometric distribution is negative binomial with r = 1 *) +let GEOMETRIC_IS_NEG_BINOMIAL_1 = prove + (`!p k. geometric_pmf p k = neg_binomial_pmf 1 p k`, + REPEAT GEN_TAC THEN REWRITE_TAC[geometric_pmf; neg_binomial_pmf] THEN + REWRITE_TAC[ARITH_RULE `k + 1 - 1 = k`; BINOM_DIAG; real_pow] THEN + REAL_ARITH_TAC);; + +(* Binomial coefficient diagonal identity: + k * binom(k+r-1, k) = r * binom(k+r-1, k-1) + Used for computing moments of the negative binomial. *) +let BINOM_KBINOM_IDENTITY = prove + (`!k r. 1 <= k /\ 1 <= r + ==> k * binom(k + r - 1, k) = r * binom(k + r - 1, k - 1)`, + REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`r - 1`; `k:num`] BINOM_FACT) THEN + MP_TAC(SPECL [`r:num`; `k - 1`] BINOM_FACT) THEN + SUBGOAL_THEN `r - 1 + k = k + r - 1` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `r + (k - 1) = k + r - 1` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + REPEAT DISCH_TAC THEN + SUBGOAL_THEN `FACT k = k * FACT(k - 1)` ASSUME_TAC THENL + [SUBGOAL_THEN `k = SUC(k - 1)` (fun th -> + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [th]) THENL + [ASM_ARITH_TAC; REWRITE_TAC[FACT]] THEN + SUBGOAL_THEN `SUC(k - 1) = k` (fun th -> REWRITE_TAC[th]) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `FACT r = r * FACT(r - 1)` ASSUME_TAC THENL + [SUBGOAL_THEN `r = SUC(r - 1)` (fun th -> + GEN_REWRITE_TAC (LAND_CONV o RAND_CONV) [th]) THENL + [ASM_ARITH_TAC; REWRITE_TAC[FACT]] THEN + SUBGOAL_THEN `SUC(r - 1) = r` (fun th -> REWRITE_TAC[th]) THEN + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `FACT(r - 1) * FACT(k - 1) * (k * binom(k + r - 1, k)) = + FACT(k + r - 1) /\ + FACT(r - 1) * FACT(k - 1) * (r * binom(k + r - 1, k - 1)) = + FACT(k + r - 1)` + MP_TAC THENL + [CONJ_TAC THEN ASM_MESON_TAC[MULT_AC]; ALL_TAC] THEN + STRIP_TAC THEN + SUBGOAL_THEN + `FACT(r - 1) * (FACT(k - 1) * (k * binom(k + r - 1, k))) = + FACT(r - 1) * (FACT(k - 1) * (r * binom(k + r - 1, k - 1)))` + MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[EQ_MULT_LCANCEL; FACT_NZ]);; + +(* Mean of negative binomial: E[X] = r * (1-p) / p *) +let NEG_BINOMIAL_MEAN_SERIES = prove + (`!r p. 1 <= r /\ &0 < p /\ p <= &1 + ==> ((\k. &k * neg_binomial_pmf r p k) real_sums &r * (&1 - p) / p) + (from 0)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[neg_binomial_pmf] THEN + MP_TAC(SPECL + [`\k. &k * &(binom (k + r - 1,k)) * p pow r * (&1 - p) pow k`; + `&r * (&1 - p) / p`; `1`; `0`] + REAL_SUMS_OFFSET_REV) THEN + REWRITE_TAC[ARITH; SUM_SING_NUMSEG] THEN + SUBGOAL_THEN `&0 * &(binom (0 + r - 1,0)) * p pow r * (&1 - p) pow 0 = &0` + (fun th -> REWRITE_TAC[th]) THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_RID] THEN + DISCH_TAC THEN FIRST_ASSUM(fun th -> MATCH_MP_TAC th) THEN + POP_ASSUM(K ALL_TAC) THEN + GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [ARITH_RULE `1 = 0 + 1`] THEN + REWRITE_TAC[GSYM(SPEC `1` REAL_SUMS_REINDEX)] THEN + SUBGOAL_THEN `!x:num. (x + 1) + r - 1 = x + r` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(\x. &(x + 1) * &(binom (x + r,x + 1)) * p pow r * (&1 - p) pow (x + 1)) = + (\x. &r * (&1 - p) * p pow r * (&(binom(x + r, x)) * (&1 - p) pow x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:num` THEN + SUBGOAL_THEN `(x + 1) * binom(x + r, x + 1) = r * binom(x + r, x)` + ASSUME_TAC THENL + [MP_TAC(SPECL [`x + 1`; `r:num`] BINOM_KBINOM_IDENTITY) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(x + 1) + r - 1 = x + r` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(x + 1) - 1 = x` (fun th -> REWRITE_TAC[th]) THEN + ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(ASSUME_TAC o + REWRITE_RULE[GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_EQ]) THEN + ONCE_REWRITE_TAC[ARITH_RULE `x + 1 = SUC x`] THEN + REWRITE_TAC[CONJUNCT2 real_pow; REAL_MUL_ASSOC] THEN + ONCE_REWRITE_TAC[ADD1] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `abs(&1 - p) < &1` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`r:num`; `&1 - p`] NB_SERIES) THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o MATCH_MP REAL_SERIES_LMUL) THEN + DISCH_THEN(MP_TAC o SPEC `&r * (&1 - p) * p pow r`) THEN REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN + `(\x:num. &r * (&1 - p) * p pow r * &(binom (x + r,x)) * (&1 - p) pow x) = + (\n. (&r * (&1 - p) * p pow r) * &(binom (n + r,n)) * (&1 - p) pow n)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `&r * (&1 - p) / p = (&r * (&1 - p) * p pow r) * inv(p pow SUC r)` + SUBST1_TAC THENL + [REWRITE_TAC[real_div; real_pow; REAL_INV_MUL] THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(p pow r = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0; DE_MORGAN_THM] THEN + DISJ1_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `p pow r * inv(p pow r) = &1` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_MUL_RINV]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `(((&r * (&1 - p)) * p pow r) * inv p) * inv (p pow r) = + ((&r * (&1 - p)) * inv p) * (p pow r * inv (p pow r))` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; + ASM_REWRITE_TAC[]]);; + +(* Double diagonal identity for second factorial moments *) +let BINOM_KBINOM_IDENTITY2 = prove + (`!k r. 2 <= k /\ 1 <= r + ==> k * (k - 1) * binom(k + r - 1, k) = + r * (r + 1) * binom(k + r - 1, k - 2)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `k * binom(k + r - 1, k) = r * binom(k + r - 1, k - 1)` + ASSUME_TAC THENL + [MATCH_MP_TAC BINOM_KBINOM_IDENTITY THEN ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`k - 1`; `r + 1`] BINOM_KBINOM_IDENTITY) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `k - 1 + (r + 1) - 1 = k + r - 1 /\ k - 1 - 1 = k - 2` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN REWRITE_TAC[MULT_ASSOC] THEN + SUBGOAL_THEN `(k * (k - 1)) * binom(k + r - 1, k) = + (k - 1) * (k * binom(k + r - 1, k))` SUBST1_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(k - 1) * r * binom(k + r - 1, k - 1) = + r * ((k - 1) * binom(k + r - 1, k - 1))` SUBST1_TAC THENL + [ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC);; + +(* Second factorial moment: E[X(X-1)] = r(r+1)((1-p)/p)^2 *) +let NEG_BINOMIAL_SECOND_FACTORIAL_MOMENT = prove + (`!r p. 1 <= r /\ &0 < p /\ p <= &1 + ==> ((\k. &k * (&k - &1) * neg_binomial_pmf r p k) real_sums + &r * (&r + &1) * ((&1 - p) / p) pow 2) (from 0)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[neg_binomial_pmf] THEN + ABBREV_TAC + `f = \k. &k * (&k - &1) * &(binom (k + r - 1,k)) * + p pow r * (&1 - p) pow k` THEN + MP_TAC(SPECL [`f:num->real`; + `&r * (&r + &1) * ((&1 - p) / p) pow 2`; `2`; `0`] + REAL_SUMS_OFFSET_REV) THEN + REWRITE_TAC[ARITH] THEN + SUBGOAL_THEN `sum (0..1) f = &0` (fun th -> REWRITE_TAC[th]) THENL + [EXPAND_TAC "f" THEN + REWRITE_TAC[num_CONV `1`; SUM_CLAUSES_NUMSEG; LE_0] THEN + CONV_TAC NUM_REDUCE_CONV THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_RID] THEN + DISCH_TAC THEN FIRST_ASSUM(fun th -> MATCH_MP_TAC th) THEN + POP_ASSUM(K ALL_TAC) THEN EXPAND_TAC "f" THEN + GEN_REWRITE_TAC (RAND_CONV o RAND_CONV) [ARITH_RULE `2 = 0 + 2`] THEN + REWRITE_TAC[GSYM(SPEC `2` REAL_SUMS_REINDEX)] THEN + SUBGOAL_THEN `!x:num. (x + 2) + r - 1 = x + r + 1` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!x:num. &(x + 2) - &1 = &(x + 1)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x. &(x + 2) * &(x + 1) * &(binom (x + r + 1,x + 2)) * + p pow r * (&1 - p) pow (x + 2)) = + (\x. &r * (&r + &1) * (&1 - p) pow 2 * p pow r * + (&(binom(x + (r + 1), x)) * (&1 - p) pow x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:num` THEN + SUBGOAL_THEN `(x + 2) * (x + 1) * binom(x + r + 1, x + 2) = + r * (r + 1) * binom(x + r + 1, x)` ASSUME_TAC THENL + [MP_TAC(SPECL [`x + 2`; `r:num`] BINOM_KBINOM_IDENTITY2) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(x + 2) + r - 1 = x + r + 1` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(x + 2) - 1 = x + 1 /\ (x + 2) - 2 = x` + (fun th -> REWRITE_TAC[th]) THEN + ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(&1 - p) pow (x + 2) = (&1 - p) pow 2 * (&1 - p) pow x` + SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_POW_ADD] THEN AP_TERM_TAC THEN ARITH_TAC; + ALL_TAC] THEN + FIRST_X_ASSUM(ASSUME_TAC o + REWRITE_RULE[GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_EQ]) THEN + SUBGOAL_THEN `x + r + 1 = x + (r + 1)` (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&(r + 1) = &r + &1` ASSUME_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC; ALL_TAC] THEN + RULE_ASSUM_TAC(REWRITE_RULE[REAL_MUL_ASSOC]) THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `abs(&1 - p) < &1` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`r + 1`; `&1 - p`] NB_SERIES) THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&1 - (&1 - p) = p` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o MATCH_MP REAL_SERIES_LMUL) THEN + DISCH_THEN(MP_TAC o SPEC `&r * (&r + &1) * (&1 - p) pow 2 * p pow r`) THEN + REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN + `(\x:num. &r * (&r + &1) * (&1 - p) pow 2 * p pow r * + &(binom (x + (r + 1),x)) * (&1 - p) pow x) = + (\n. (&r * (&r + &1) * (&1 - p) pow 2 * p pow r) * + &(binom (n + (r + 1),n)) * (&1 - p) pow n)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `&r * (&r + &1) * ((&1 - p) / p) pow 2 = + (&r * (&r + &1) * (&1 - p) pow 2 * p pow r) * inv (p pow SUC (r + 1))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_DIV; real_div; REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(p pow r = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_POW_EQ_0; DE_MORGAN_THM] THEN + DISJ1_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `SUC(r + 1) = 2 + r` (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_ADD; REAL_INV_MUL] THEN + SUBGOAL_THEN `p pow r * inv(p pow r) = &1` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_MUL_RINV]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + SUBGOAL_THEN + `((((&r * (&r + &1)) * (&1 - p) pow 2) * p pow r) * inv (p pow 2)) * + inv (p pow r) = + (((&r * (&r + &1)) * (&1 - p) pow 2) * inv (p pow 2)) * + (p pow r * inv(p pow r))` + SUBST1_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; + ASM_REWRITE_TAC[]]);; + +(* Variance of negative binomial: Var(X) = r(1-p)/p^2 *) +let NEG_BINOMIAL_VARIANCE_SERIES = prove + (`!r p. 1 <= r /\ &0 < p /\ p <= &1 + ==> ((\k. (&k - &r * (&1 - p) / p) pow 2 * neg_binomial_pmf r p k) + real_sums &r * (&1 - p) / p pow 2) (from 0)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `~(p = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k * (&k - &1) * neg_binomial_pmf r p k) real_sums + &r * (&r + &1) * ((&1 - p) / p) pow 2) (from 0)` ASSUME_TAC THENL + [ASM_SIMP_TAC[NEG_BINOMIAL_SECOND_FACTORIAL_MOMENT]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k * neg_binomial_pmf r p k) real_sums &r * (&1 - p) / p) + (from 0)` ASSUME_TAC THENL + [ASM_SIMP_TAC[NEG_BINOMIAL_MEAN_SERIES]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. neg_binomial_pmf r p k) real_sums &1) (from 0)` ASSUME_TAC THENL + [ASM_SIMP_TAC[NEG_BINOMIAL_PMF_SUMS]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. (-- &2 * &r * (&1 - p) / p) * &k * neg_binomial_pmf r p k) + real_sums (-- &2 * &r * (&1 - p) / p) * &r * (&1 - p) / p) + (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_LMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. (&r * (&1 - p) / p) pow 2 * neg_binomial_pmf r p k) real_sums + (&r * (&1 - p) / p) pow 2 * &1) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_LMUL THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN + `((\k. &k * (&k - &1) * neg_binomial_pmf r p k + + &k * neg_binomial_pmf r p k) real_sums + &r * (&r + &1) * ((&1 - p) / p) pow 2 + &r * (&1 - p) / p) + (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. (&k * (&k - &1) * neg_binomial_pmf r p k + + &k * neg_binomial_pmf r p k) + + (-- &2 * &r * (&1 - p) / p) * &k * neg_binomial_pmf r p k) + real_sums + (&r * (&r + &1) * ((&1 - p) / p) pow 2 + &r * (&1 - p) / p) + + (-- &2 * &r * (&1 - p) / p) * &r * (&1 - p) / p) (from 0)` ASSUME_TAC + THENL + [MATCH_MP_TAC REAL_SERIES_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `((\k. ((&k * (&k - &1) * neg_binomial_pmf r p k + + &k * neg_binomial_pmf r p k) + + (-- &2 * &r * (&1 - p) / p) * &k * neg_binomial_pmf r p k) + + (&r * (&1 - p) / p) pow 2 * neg_binomial_pmf r p k) real_sums + ((&r * (&r + &1) * ((&1 - p) / p) pow 2 + &r * (&1 - p) / p) + + (-- &2 * &r * (&1 - p) / p) * &r * (&1 - p) / p) + + (&r * (&1 - p) / p) pow 2 * &1) (from 0)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SERIES_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(\k. (&k - &r * (&1 - p) / p) pow 2 * neg_binomial_pmf r p k) = + (\k. ((&k * (&k - &1) * neg_binomial_pmf r p k + + &k * neg_binomial_pmf r p k) + + (-- &2 * &r * (&1 - p) / p) * &k * neg_binomial_pmf r p k) + + (&r * (&1 - p) / p) pow 2 * neg_binomial_pmf r p k)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `&r * (&1 - p) / p pow 2 = + ((&r * (&r + &1) * ((&1 - p) / p) pow 2 + &r * (&1 - p) / p) + + (-- &2 * &r * (&1 - p) / p) * &r * (&1 - p) / p) + + (&r * (&1 - p) / p) pow 2 * &1` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `~(p = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + ASM_REWRITE_TAC[]);; diff --git a/Probability/expectation.ml b/Probability/expectation.ml index 2ec4faa6..b79e0b14 100644 --- a/Probability/expectation.ml +++ b/Probability/expectation.ml @@ -103,10 +103,7 @@ let RANDOM_VARIABLE_LEVEL_SET = prove {x | x IN prob_carrier p /\ X x <= v} DIFF {x | x IN prob_carrier p /\ X x < v}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x v:real. x = v <=> x <= v /\ ~(x < v)`]; MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN CONJ_TAC THENL [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN SIMP_TAC[]; @@ -122,10 +119,7 @@ let RANDOM_VARIABLE_GT = prove `{x:A | x IN prob_carrier p /\ X x > v} = prob_carrier p DIFF {x | x IN prob_carrier p /\ X x <= v}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x v:real. x > v <=> ~(x <= v)`]; MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN SIMP_TAC[]]);; @@ -140,10 +134,7 @@ let RANDOM_VARIABLE_GE = prove `{x:A | x IN prob_carrier p /\ X x >= v} = prob_carrier p DIFF {x | x IN prob_carrier p /\ X x < v}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x v:real. x >= v <=> ~(x < v)`]; MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN MATCH_MP_TAC RANDOM_VARIABLE_OPEN_HALFLINE THEN ASM_REWRITE_TAC[]]);; @@ -158,10 +149,7 @@ let RANDOM_VARIABLE_OPEN_INTERVAL = prove {x | x IN prob_carrier p /\ X x < b} INTER {x | x IN prob_carrier p /\ X x > a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x a:real. x > a <=> a < x`]; MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL [MATCH_MP_TAC RANDOM_VARIABLE_OPEN_HALFLINE THEN ASM_REWRITE_TAC[]; MATCH_MP_TAC RANDOM_VARIABLE_GT THEN ASM_REWRITE_TAC[]]]);; @@ -330,10 +318,7 @@ let RANDOM_VARIABLE_MAX = prove {x | x IN prob_carrier p /\ X x <= a} INTER {x | x IN prob_carrier p /\ Y x <= a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_max] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x y a:real. max x y <= a <=> x <= a /\ y <= a`]; MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN RULE_ASSUM_TAC(REWRITE_RULE[random_variable]) THEN ASM_SIMP_TAC[]]);; @@ -351,10 +336,7 @@ let RANDOM_VARIABLE_MIN = prove {x | x IN prob_carrier p /\ X x <= a} UNION {x | x IN prob_carrier p /\ Y x <= a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_min] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x y a:real. min x y <= a <=> x <= a \/ y <= a`]; MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN RULE_ASSUM_TAC(REWRITE_RULE[random_variable]) THEN ASM_SIMP_TAC[]]);; @@ -377,10 +359,8 @@ let RANDOM_VARIABLE_ABS = prove {x | x IN prob_carrier p /\ X x <= a} INTER {x | x IN prob_carrier p /\ X x >= --a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - ASM_REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH + `!x a:real. abs x <= a <=> x <= a /\ x >= --a`]; MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN SIMP_TAC[]; @@ -2800,13 +2780,6 @@ let CHEBYSHEV_INEQUALITY_SIMPLE = prove [X_GEN_TAC `a:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; ASM_SIMP_TAC[REAL_POW_LT]]);; -(* Variance of constant is zero *) -let SIMPLE_VARIANCE_CONST = prove - (`!p:A prob_space c. simple_variance p (\x. c) = &0`, - REPEAT GEN_TAC THEN - REWRITE_TAC[simple_variance; SIMPLE_EXPECTATION_CONST] THEN - REAL_ARITH_TAC);; - (* Variance of scaled rv: Var(cX) = c^2 * Var(X) *) let SIMPLE_VARIANCE_CMUL = prove (`!p:A prob_space X c. @@ -2849,8 +2822,8 @@ let converges_in_prob_const = new_definition converges_in_prob p X (\x. c)`;; (* L2 (mean-square) convergence *) -let converges_L2 = new_definition - `converges_L2 (p:A prob_space) (X:num->A->real) (L:A->real) <=> +let simple_converges_L2 = new_definition + `simple_converges_L2 (p:A prob_space) (X:num->A->real) (L:A->real) <=> ((\n. simple_expectation p (\x. (X n x - L x) pow 2)) ---> &0) sequentially`;; (* ========================================================================= *) @@ -4338,9 +4311,7 @@ let SIMPLE_RV_GE_EVENT = prove SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (h:A->real) x >= c} = prob_carrier p DIFF {x | x IN prob_carrier p /\ h x < c}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - GEN_TAC THEN ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN - ASM_REWRITE_TAC[real_ge] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x c:real. x >= c <=> ~(x < c)`]; MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN MATCH_MP_TAC RANDOM_VARIABLE_OPEN_HALFLINE THEN ASM_MESON_TAC[simple_rv]]);; @@ -5479,8 +5450,7 @@ let SIMPLE_RV_LEVEL_SET_INTER_IN_EVENTS = prove {z | z IN prob_carrier p /\ X z = u} INTER {z | z IN prob_carrier p /\ Y z = v}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN - GEN_TAC THEN EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + [SET_TAC[]; MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN ASM_MESON_TAC[simple_rv]]);; @@ -5878,18 +5848,18 @@ let variance = new_definition `variance (p:A prob_space) (X:A->real) = expectation p (\x. (X x - expectation p X) pow 2)`;; -(* General characteristic function (real and imaginary parts) *) -let gen_char_fn_re = new_definition - `gen_char_fn_re (p:A prob_space) (X:A->real) (t:real) = +(* Characteristic function (real and imaginary parts) *) +let char_fn_re = new_definition + `char_fn_re (p:A prob_space) (X:A->real) (t:real) = expectation p (\x. cos(t * X x))`;; -let gen_char_fn_im = new_definition - `gen_char_fn_im (p:A prob_space) (X:A->real) (t:real) = +let char_fn_im = new_definition + `char_fn_im (p:A prob_space) (X:A->real) (t:real) = expectation p (\x. sin(t * X x))`;; -(* General CDF *) -let gen_cdf = new_definition - `gen_cdf (p:A prob_space) (X:A->real) (x:real) = +(* CDF *) +let cdf = new_definition + `cdf (p:A prob_space) (X:A->real) (x:real) = prob p {a | a IN prob_carrier p /\ X a <= x}`;; (* Bounded random variables are integrable *) @@ -6052,119 +6022,6 @@ let BOUNDED_EXPECTATION_POS = prove ASM_SIMP_TAC[]; REAL_ARITH_TAC]]);; -(* Linearity of expectation for simple RVs *) -let EXPECTATION_ADD_SIMPLE = prove - (`!p:A prob_space f g. - simple_rv p f /\ simple_rv p g - ==> expectation p (\x. f x + g x) = expectation p f + expectation p g`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (f:A->real) x + (g:A->real) x) = - simple_expectation p (\x. f x + g x)` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_ADD THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = simple_expectation p f` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (g:A->real) = simple_expectation p g` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_ADD]);; - -(* Scalar multiplication of expectation for simple RVs *) -let EXPECTATION_CMUL_SIMPLE = prove - (`!p:A prob_space c f. - simple_rv p f - ==> expectation p (\x. c * f x) = c * expectation p f`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. c * (f:A->real) x) = - simple_expectation p (\x. c * f x)` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_CMUL THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = simple_expectation p f` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_CMUL]);; - -(* Negation of expectation for simple RVs *) -let EXPECTATION_NEG_SIMPLE = prove - (`!p:A prob_space f. - simple_rv p f - ==> expectation p (\x. --(f x)) = --(expectation p f)`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. --((f:A->real) x)) = - simple_expectation p (\x. --(f x))` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_NEG THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = simple_expectation p f` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_NEG]);; - -(* Subtraction of expectation for simple RVs *) -let EXPECTATION_SUB_SIMPLE = prove - (`!p:A prob_space f g. - simple_rv p f /\ simple_rv p g - ==> expectation p (\x. f x - g x) = expectation p f - expectation p g`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (f:A->real) x - (g:A->real) x) = - simple_expectation p (\x. f x - g x)` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = simple_expectation p f` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (g:A->real) = simple_expectation p g` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_SUB]);; - -(* Monotonicity of expectation for simple RVs *) -let EXPECTATION_MONO_SIMPLE = prove - (`!p:A prob_space f g. - simple_rv p f /\ simple_rv p g /\ - (!x. x IN prob_carrier p ==> f x <= g x) - ==> expectation p f <= expectation p g`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = simple_expectation p f` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (g:A->real) = simple_expectation p g` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_MONO]);; - -(* Sum of expectations for simple RVs *) -let EXPECTATION_SUM_SIMPLE = prove - (`!p:A prob_space (X:num->A->real) n. - (!i. i <= n ==> simple_rv p (X i)) - ==> expectation p (\x. sum(0..n) (\i. X i x)) = - sum(0..n) (\i. expectation p (X i))`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x))` - ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_SUM_NUMSEG THEN ASM_MESON_TAC[IN_NUMSEG; LE_0]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) = - simple_expectation p (\x. sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SIMPLE_EXPECTATION_SUM_NUMSEG; IN_NUMSEG; LE_0] THEN - CONV_TAC SYM_CONV THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN - REPEAT STRIP_TAC THEN BETA_TAC THEN - MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN ASM_SIMP_TAC[]);; - (* Chebyshev's inequality using general variance *) let SIMPLE_CHEBYSHEV_INEQUALITY = prove (`!p:A prob_space X t. @@ -6265,27 +6122,6 @@ let COVARIANCE_INDEP_SIMPLE = prove ASM_SIMP_TAC[SIMPLE_COVARIANCE_INDEP]);; (* Var(X+Y) = Var(X) + Var(Y) + 2*Cov(X,Y) *) -let VARIANCE_ADD_SIMPLE = prove - (`!p:A prob_space X Y. simple_rv p X /\ simple_rv p Y - ==> variance p (\x. X x + Y x) = - variance p X + variance p Y + &2 * covariance p X Y`, - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `variance (p:A prob_space) (\x. X x + Y x) = - simple_variance p (\x:A. X x + Y x)` SUBST1_TAC THENL - [MATCH_MP_TAC VARIANCE_SIMPLE THEN MATCH_MP_TAC SIMPLE_RV_ADD THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[VARIANCE_SIMPLE; COVARIANCE_SIMPLE_AGREE] THEN - ASM_SIMP_TAC[SIMPLE_VARIANCE_ADD]);; - -(* Var(X+Y) = Var(X) + Var(Y) for independent RVs *) -let VARIANCE_ADD_INDEPENDENT = prove - (`!p:A prob_space X Y. simple_rv p X /\ simple_rv p Y /\ indep_rv p X Y - ==> variance p (\x. X x + Y x) = variance p X + variance p Y`, - REPEAT STRIP_TAC THEN - ASM_SIMP_TAC[VARIANCE_ADD_SIMPLE; COVARIANCE_INDEP_SIMPLE] THEN - REAL_ARITH_TAC);; - (* Var(sum_0^n X_i) = sum_0^n Var(X_i) for uncorrelated RVs *) let VARIANCE_SUM_UNCORRELATED_SIMPLE = prove (`!p:A prob_space X n. @@ -6328,16 +6164,16 @@ let VARIANCE_SUM_IID = prove REWRITE_TAC[ADD1]);; (* General L2 convergence *) -let gen_converges_L2 = new_definition - `gen_converges_L2 (p:A prob_space) (X:num->A->real) (L:A->real) <=> +let converges_L2 = new_definition + `converges_L2 (p:A prob_space) (X:num->A->real) (L:A->real) <=> ((\n. expectation p (\x. (X n x - L x) pow 2)) ---> &0) sequentially`;; -(* Agreement: gen_converges_L2 = converges_L2 for simple RVs *) -let GEN_CONVERGES_L2_AGREE = prove +(* Agreement: converges_L2 = simple_converges_L2 for simple RVs *) +let CONVERGES_L2_AGREE = prove (`!p:A prob_space X L. (!n. simple_rv p (X n)) /\ simple_rv p L - ==> (gen_converges_L2 p X L <=> converges_L2 p X L)`, + ==> (converges_L2 p X L <=> simple_converges_L2 p X L)`, REPEAT STRIP_TAC THEN - REWRITE_TAC[gen_converges_L2; converges_L2] THEN + REWRITE_TAC[converges_L2; simple_converges_L2] THEN AP_THM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `n:num` THEN BETA_TAC THEN MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN @@ -8090,13 +7926,12 @@ let RV_LEVEL_GE_IN_EVENTS = prove REPEAT GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ f x >= a} = prob_carrier p DIFF {x | x IN prob_carrier p /\ (f:A->real) x < a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN GEN_TAC THEN - ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x a:real. x >= a <=> ~(x < a)`]; MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN REWRITE_TAC[PROB_CARRIER_IN_EVENTS] THEN SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (f:A->real) x < a} = {x | x IN prob_carrier p /\ (\x. --(f x)) x > --a}` SUBST1_TAC THENL [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN BETA_TAC THEN - ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + SET_TAC[REAL_ARITH `!x a:real. x < a <=> --x > --a`]; MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN MATCH_MP_TAC RANDOM_VARIABLE_NEG THEN ASM_REWRITE_TAC[]]]);; @@ -8128,6 +7963,16 @@ let VARIANCE_CONST = prove REPEAT GEN_TAC THEN REWRITE_TAC[variance; EXPECTATION_CONST] THEN REWRITE_TAC[REAL_SUB_REFL; REAL_POW_ZERO; ARITH; EXPECTATION_CONST]);; +(* Corollary: simple_variance of constant is zero *) +let SIMPLE_VARIANCE_CONST = prove + (`!p:A prob_space c. simple_variance p (\x. c) = &0`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `simple_variance (p:A prob_space) (\x:A. c:real) = + variance p (\x. c)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC VARIANCE_SIMPLE THEN + REWRITE_TAC[SIMPLE_RV_CONST]; + REWRITE_TAC[VARIANCE_CONST]]);; + (* Variance is nonneg *) let VARIANCE_NONNEG = prove (`!p:A prob_space f. integrable p (\x. (f x - expectation p f) pow 2) @@ -8295,8 +8140,8 @@ let CHEBYSHEV_INEQUALITY = prove SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ abs((X:A->real) x - mu) >= t} = {x | x IN prob_carrier p /\ X x - mu >= t} UNION {x | x IN prob_carrier p /\ --(X x - mu) >= t}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM] THEN GEN_TAC THEN - ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH + `!x t:real. abs x >= t <=> x >= t \/ --x >= t`]; MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THENL [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB_CONST THEN ASM_REWRITE_TAC[]; @@ -8422,103 +8267,6 @@ let EXPECTATION_SUM = prove FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; REWRITE_TAC[]]]);; -(* Weak Law of Large Numbers *) -(* For pairwise independent, identically distributed simple RVs with common *) -(* mean mu and variance sigma2: P(|Sn/(n+1) - mu| >= epsilon) <= sigma2/((n+1)*epsilon^2) *) -let SIMPLE_WEAK_LAW_OF_LARGE_NUMBERS = prove - (`!p:A prob_space X n mu sigma2 epsilon. - (!i. i <= n ==> simple_rv p (X i)) /\ - (!i j. i <= n /\ j <= n /\ ~(i = j) ==> indep_rv p (X i) (X j)) /\ - (!i. i <= n ==> expectation p (X i) = mu) /\ - (!i. i <= n ==> variance p (X i) = sigma2) /\ - &0 < epsilon - ==> prob p {x | x IN prob_carrier p /\ - abs(sum(0..n) (\i. X i x) / &(n + 1) - mu) >= epsilon} <= - sigma2 / (&(n + 1) * epsilon pow 2)`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - ABBREV_TAC `Xbar = \x:A. sum(0..n) (\i. (X:num->A->real) i x) / &(n + 1)` THEN - (* Xbar is simple_rv *) - SUBGOAL_THEN `simple_rv (p:A prob_space) Xbar` ASSUME_TAC THENL - [EXPAND_TAC "Xbar" THEN - SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) / &(n + 1)) = - (\x. inv(&(n + 1)) * sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN - MATCH_MP_TAC SIMPLE_RV_CMUL THEN - MATCH_MP_TAC SIMPLE_RV_SUM THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `!x:A. sum (0..n) (\i. (X:num->A->real) i x) / &(n + 1) = Xbar x` - (fun th -> REWRITE_TAC[th]) THENL - [GEN_TAC THEN EXPAND_TAC "Xbar" THEN REWRITE_TAC[]; ALL_TAC] THEN - (* E[Xbar] = mu *) - SUBGOAL_THEN `expectation (p:A prob_space) Xbar = mu` ASSUME_TAC THENL - [EXPAND_TAC "Xbar" THEN - SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) / &(n + 1)) = - (\x. inv(&(n + 1)) * sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. inv(&(n + 1)) * sum(0..n) (\i. (X:num->A->real) i x)) = - inv(&(n + 1)) * expectation p (\x. sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_CMUL THEN - MATCH_MP_TAC INTEGRABLE_SUM THEN GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) = - sum(0..n) (\i. expectation p (X i))` SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_SUM THEN GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[SUM_CONST_NUMSEG; SUB_0] THEN - REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN - REWRITE_TAC[REAL_MUL_ASSOC] THEN - SUBGOAL_THEN `inv(&n + &1) * (&n + &1) = &1` SUBST1_TAC THENL - [MATCH_MP_TAC REAL_MUL_LINV THEN REAL_ARITH_TAC; REWRITE_TAC[REAL_MUL_LID]]; - ALL_TAC] THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (\x. sum(0..n) (\i. (X:num->A->real) i x))` ASSUME_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_SUM THEN ASM_SIMP_TAC[]; ALL_TAC] THEN - (* Var(Xbar) = sigma2 / (n+1) *) - SUBGOAL_THEN `variance (p:A prob_space) Xbar = sigma2 / &(n + 1)` ASSUME_TAC THENL - [EXPAND_TAC "Xbar" THEN - SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) / &(n + 1)) = - (\x. inv(&(n + 1)) * sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN - SUBGOAL_THEN `variance (p:A prob_space) (\x:A. inv(&(n + 1)) * sum(0..n) (\i. (X:num->A->real) i x)) = - inv(&(n + 1)) pow 2 * variance p (\x. sum(0..n) (\i. X i x))` SUBST1_TAC THENL - [MATCH_MP_TAC VARIANCE_CMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_REWRITE_TAC[]; - SUBGOAL_THEN `(\x:A. (\x. sum(0..n) (\i. (X:num->A->real) i x)) x pow 2) = - (\x. sum(0..n) (\i. X i x) pow 2)` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM]; ALL_TAC] THEN - SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) pow 2) = - (\x. (\x. sum(0..n) (\i. X i x)) x * (\x. sum(0..n) (\i. X i x)) x)` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; REAL_POW_2]; ALL_TAC] THEN - MATCH_MP_TAC INTEGRABLE_SIMPLE THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN - ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN `variance (p:A prob_space) (\x:A. sum(0..n) (\i. (X:num->A->real) i x)) = - sum(0..n) (\i. variance p (X i))` SUBST1_TAC THENL - [MATCH_MP_TAC VARIANCE_SUM_UNCORRELATED_SIMPLE THEN CONJ_TAC THENL - [ASM_SIMP_TAC[]; - REPEAT STRIP_TAC THEN MATCH_MP_TAC COVARIANCE_INDEP_SIMPLE THEN ASM_SIMP_TAC[]]; - ALL_TAC] THEN - ASM_SIMP_TAC[SUM_CONST_NUMSEG; SUB_0] THEN - REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN - SUBGOAL_THEN `~(&n + &1 = &0)` ASSUME_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN - REWRITE_TAC[REAL_POW_2; real_div] THEN - SUBGOAL_THEN `(inv(&n + &1) * inv(&n + &1)) * ((&n + &1) * sigma2) = - inv(&n + &1) * (inv(&n + &1) * (&n + &1)) * sigma2` SUBST1_TAC THENL - [REAL_ARITH_TAC; ALL_TAC] THEN - ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* Apply Chebyshev *) - SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ abs (Xbar x - mu) >= epsilon} = - {x | x IN prob_carrier p /\ abs (Xbar x - expectation (p:A prob_space) Xbar) >= epsilon}` - SUBST1_TAC THENL - [ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `prob p {x:A | x IN prob_carrier p /\ abs (Xbar x - expectation (p:A prob_space) Xbar) >= epsilon} <= - variance p Xbar / epsilon pow 2` MP_TAC THENL - [MATCH_MP_TAC SIMPLE_CHEBYSHEV_INEQUALITY THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_div; REAL_INV_MUL; GSYM REAL_MUL_ASSOC]]);; - (* ========================================================================= *) (* Phase 13: Generalizing covariance and variance to integrable functions *) (* ========================================================================= *) @@ -8578,21 +8326,6 @@ let INTEGRABLE_MUL_SQUARE = prove MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> x <= abs x`) THEN MATCH_MP_TAC REAL_LE_ADD THEN REWRITE_TAC[REAL_LE_POW_2]]]);; -(* Covariance is symmetric (no hypotheses needed) *) -let COVARIANCE_SYM_GENERAL = prove - (`!p:A prob_space X Y. covariance p X Y = covariance p Y X`, - REPEAT GEN_TAC THEN REWRITE_TAC[covariance] THEN - MATCH_MP_TAC EXPECTATION_EXT THEN - GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC);; - -(* Cov(X,X) = Var(X) (no hypotheses needed) *) -let COVARIANCE_SELF_GENERAL = prove - (`!p:A prob_space X. covariance p X X = variance p X`, - REPEAT GEN_TAC THEN REWRITE_TAC[covariance; variance] THEN - MATCH_MP_TAC EXPECTATION_EXT THEN - GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN - REWRITE_TAC[REAL_POW_2]);; - (* Cov(X,Y) = E[XY] - E[X]*E[Y] for integrable X, Y, XY *) let COVARIANCE_ALT = prove (`!p:A prob_space X Y. @@ -9543,9 +9276,7 @@ let RANDOM_VARIABLE_STRICT_LT = prove REPEAT STRIP_TAC THEN SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ X x < a} = prob_carrier p DIFF {x | x IN prob_carrier p /\ X x >= a}` SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - GEN_TAC THEN ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + [SET_TAC[REAL_ARITH `!x a:real. x < a <=> ~(x >= a)`]; MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN ASM_REWRITE_TAC[]]);; @@ -9796,10 +9527,10 @@ let INTEGRABLE_SIN_CMUL = prove REPEAT STRIP_TAC THEN REWRITE_TAC[SIN_BOUND]]);; (* Bounds on generalized characteristic function components *) -let GEN_CHAR_FN_RE_BOUND = prove +let CHAR_FN_RE_BOUND = prove (`!p:A prob_space X t. random_variable p X - ==> abs(gen_char_fn_re p X t) <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_re] THEN + ==> abs(char_fn_re p X t) <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_re] THEN MP_TAC(SPECL [`p:A prob_space`; `(\x:A. cos(t * (X:A->real) x))`; `&1`] EXPECTATION_BOUND) THEN BETA_TAC THEN ANTS_TAC THENL @@ -9809,10 +9540,10 @@ let GEN_CHAR_FN_RE_BOUND = prove REPEAT STRIP_TAC THEN REWRITE_TAC[COS_BOUND]]; SIMP_TAC[]]);; -let GEN_CHAR_FN_IM_BOUND = prove +let CHAR_FN_IM_BOUND = prove (`!p:A prob_space X t. random_variable p X - ==> abs(gen_char_fn_im p X t) <= &1`, - REPEAT STRIP_TAC THEN REWRITE_TAC[gen_char_fn_im] THEN + ==> abs(char_fn_im p X t) <= &1`, + REPEAT STRIP_TAC THEN REWRITE_TAC[char_fn_im] THEN MP_TAC(SPECL [`p:A prob_space`; `(\x:A. sin(t * (X:A->real) x))`; `&1`] EXPECTATION_BOUND) THEN BETA_TAC THEN ANTS_TAC THENL @@ -9823,11 +9554,11 @@ let GEN_CHAR_FN_IM_BOUND = prove SIMP_TAC[]]);; (* Characteristic function values at t=0 *) -let GEN_CHAR_FN_RE_ZERO = prove +let CHAR_FN_RE_ZERO = prove (`!p:A prob_space X. random_variable p X - ==> gen_char_fn_re p X (&0) = &1`, + ==> char_fn_re p X (&0) = &1`, REPEAT STRIP_TAC THEN - REWRITE_TAC[gen_char_fn_re; REAL_MUL_LZERO; COS_0; EXPECTATION_CONST]);; + REWRITE_TAC[char_fn_re; REAL_MUL_LZERO; COS_0; EXPECTATION_CONST]);; (* Auxiliary: n <= 2^n for all n *) let LE_2_EXP = prove @@ -9853,7 +9584,10 @@ let MONO_SEQ_LE = prove (* Monotone Convergence Theorem for bounded nonneg random variables: If gn are random variables, nonneg, monotone, converging pointwise to f, - and f is bounded by B, then nn_expectation(gn n) -> nn_expectation(f) *) + and f is bounded by B, then nn_expectation(gn n) -> nn_expectation(f). + Note: this is a special case of MCT_NN_EXPECTATION (unbounded version), + but this bounded version is used in the proof of MCT_NN_EXPECTATION + itself (for truncated approximations), so it must be proved first. *) let MCT_NN_EXPECTATION_RV = prove (`!p:A prob_space gn f B. (!n. random_variable p (gn n)) /\ @@ -10030,6 +9764,247 @@ let MCT_NN_EXPECTATION_RV = prove (* constant -> nn_exp(f) *) REWRITE_TAC[REALLIM_CONST]]);; +(* Monotone Convergence Theorem without pointwise bound on limit. + Only requires integrable X_n, nonneg, monotone, pointwise convergence, + and uniformly bounded nn_expectations. Drops the f(x) <= B hypothesis + from MCT_NN_EXPECTATION_RV. *) +let MCT_NN_EXPECTATION = prove + (`!p:A prob_space X f. + (!n. integrable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= X (SUC n) x) /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) /\ + (?B. !n. nn_expectation p (X n) <= B) + ==> ((\n. nn_expectation p (X n)) ---> nn_expectation p f) sequentially`, + REPEAT STRIP_TAC THEN + (* Step 0: Derive basic facts *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= f x` ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n:num. (X:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). x IN prob_carrier p ==> (X:num->A->real) n x <= f x` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n:num. (X:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `n:num` THEN REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`X:num->A->real`; `prob_carrier (p:A prob_space)`] + MONO_SEQ_LE) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. random_variable p ((X:num->A->real) n)` ASSUME_TAC THENL [ + ASM_MESON_TAC[integrable]; ALL_TAC] THEN + (* Step 1: nn_exp(X_n) nondecreasing *) + SUBGOAL_THEN `!n:num. nn_expectation p ((X:num->A->real) n) + <= nn_expectation p (X (SUC n))` ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 2: L = lim nn_exp(X_n) exists *) + SUBGOAL_THEN `!m n:num. m <= n ==> + nn_expectation p ((X:num->A->real) m) <= nn_expectation p (X n)` + ASSUME_TAC THENL [ + MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(SPEC `\n:num. nn_expectation p ((X:num->A->real) n)` + CONVERGENT_REAL_BOUNDED_MONOTONE) THEN + ANTS_TAC THENL [ + CONJ_TAC THENL [ + REWRITE_TAC[real_bounded; FORALL_IN_IMAGE; IN_UNIV; BETA_THM] THEN + EXISTS_TAC + `abs(nn_expectation p ((X:num->A->real) 0)) + abs(B)` THEN + X_GEN_TAC `m:num` THEN + MATCH_MP_TAC(REAL_ARITH + `a <= x /\ x <= B ==> abs(x) <= abs(a) + abs(B)`) THEN + CONJ_TAC THENL [ + FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC; + ASM_REWRITE_TAC[]]; + DISJ1_TAC THEN REWRITE_TAC[BETA_THM] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[BETA_THM] THEN + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + SUBGOAL_THEN `!n:num. nn_expectation p ((X:num->A->real) n) <= L` + ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\m:num. nn_expectation p ((X:num->A->real) m)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `n:num` THEN REPEAT STRIP_TAC THEN REWRITE_TAC[BETA_THM] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + ALL_TAC] THEN + (* Step 3: nn_exp(f) <= L *) + SUBGOAL_THEN `nn_expectation p (f:A->real) <= L` ASSUME_TAC THENL [ + REWRITE_TAC[nn_expectation] THEN + MATCH_MP_TAC REAL_SUP_LE THEN CONJ_TAC THENL [ + MATCH_MP_TAC NN_EXPECT_SET_NONEMPTY THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + (* For each g in the set, get bound Mg and use truncation *) + MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Mg:real`) THEN + SUBGOAL_THEN `&0 <= Mg` ASSUME_TAC THENL [ + ASM_MESON_TAC[REAL_LE_TRANS; PROB_CARRIER_NONEMPTY; MEMBER_NOT_EMPTY]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation p (\x:A. min (f x) Mg)` THEN CONJ_TAC THENL [ + MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + EXISTS_TAC `Mg:real` THEN GEN_TAC THEN DISCH_TAC THEN + REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). min ((X:num->A->real) n x) Mg`; + `\x:A. min ((f:A->real) x) Mg`; `Mg:real`] + MCT_NN_EXPECTATION_RV) THEN + BETA_TAC THEN ANTS_TAC THENL [ + REPEAT CONJ_TAC THENL [ + GEN_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; + `(X:num->A->real) n`; `(\x:A. Mg):A->real`] + RANDOM_VARIABLE_MIN) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH + `a <= b ==> min a c <= min b c`) THEN ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC REALLIM_MIN THEN + REWRITE_TAC[REALLIM_CONST] THEN ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REAL_ARITH_TAC]; + DISCH_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n:num. nn_expectation p (\x:A. min (X n x) Mg)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; + EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation p ((X:num->A->real) n)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC NN_EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL [ + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REAL_ARITH_TAC]]]]; + ALL_TAC] THEN + (* Step 4: random_variable p f and integrable p f *) + SUBGOAL_THEN `random_variable p (f:A->real)` ASSUME_TAC THENL [ + MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `X:num->A->real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable p (f:A->real)` ASSUME_TAC THENL [ + REWRITE_TAC[integrable] THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `L:real` THEN REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> g x <= (f:A->real) x` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((f:A->real) x)` THEN ASM_SIMP_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x <= x`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Use the nn_exp bound: same truncation argument inline *) + MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Mg:real`) THEN + SUBGOAL_THEN `&0 <= Mg` ASSUME_TAC THENL [ + ASM_MESON_TAC[REAL_LE_TRANS; PROB_CARRIER_NONEMPTY; MEMBER_NOT_EMPTY]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation p (\x:A. min (f x) Mg)` THEN CONJ_TAC THENL [ + MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [ + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + EXISTS_TAC `Mg:real` THEN GEN_TAC THEN DISCH_TAC THEN + REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). min ((X:num->A->real) n x) Mg`; + `\x:A. min ((f:A->real) x) Mg`; `Mg:real`] + MCT_NN_EXPECTATION_RV) THEN + BETA_TAC THEN ANTS_TAC THENL [ + REPEAT CONJ_TAC THENL [ + GEN_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; + `(X:num->A->real) n`; `(\x:A. Mg):A->real`] + RANDOM_VARIABLE_MIN) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC(REAL_ARITH + `a <= b ==> min a c <= min b c`) THEN ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC REALLIM_MIN THEN + REWRITE_TAC[REALLIM_CONST] THEN ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REAL_ARITH_TAC]; + DISCH_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n:num. nn_expectation p (\x:A. min (X n x) Mg)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; + EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation p ((X:num->A->real) n)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC NN_EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL [ + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; + REPEAT STRIP_TAC THEN REAL_ARITH_TAC]]]; + ALL_TAC] THEN + (* Step 5: nn_exp(X_n) <= nn_exp(f) for all n *) + SUBGOAL_THEN `!n:num. nn_expectation p ((X:num->A->real) n) + <= nn_expectation p f` ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 6: L <= nn_exp(f) *) + SUBGOAL_THEN `L <= nn_expectation p (f:A->real)` ASSUME_TAC THENL [ + MP_TAC(ISPECL [`sequentially`; + `\n:num. nn_expectation p ((X:num->A->real) n)`; + `L:real`; `nn_expectation p (f:A->real)`] REALLIM_UBOUND) THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + DISCH_THEN MATCH_MP_TAC THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Conclude: nn_exp(f) = L *) + SUBGOAL_THEN `nn_expectation p (f:A->real) = L` ASSUME_TAC THENL [ + ASM_REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]);; + +(* MCT variant: integrable limit instead of nn_expectation bound *) +let MCT_NN_EXPECTATION_INTEGRABLE = prove + (`!p:A prob_space X f. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= X (SUC n) x) /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + integrable p f + ==> ((\n. nn_expectation p (X n)) ---> nn_expectation p f) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n (x:A). x IN prob_carrier p ==> + (X:num->A->real) n x <= f x` ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n. (X:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `n:num` THEN REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`X:num->A->real`; `prob_carrier (p:A prob_space)`] + MONO_SEQ_LE) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p ((X:num->A->real) n)` ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `f:A->real` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= b /\ &0 <= b ==> abs a <= abs b`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC MCT_NN_EXPECTATION THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `nn_expectation p (f:A->real)` THEN + GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN + ASM_SIMP_TAC[]);; + (* ========================================================================= *) (* Fatou's lemma for bounded nonneg random variables *) (* ========================================================================= *) @@ -10775,21 +10750,216 @@ let FATOU_INTEGRABLE = prove REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC]; ASM_REWRITE_TAC[]]]);; -(* ========================================================================= *) -(* KOLMOGOROV 0-1 LAW *) -(* Tail events of independent event sequences have probability 0 or 1. *) -(* Uses the Dynkin pi-lambda theorem (proved above) to bootstrap *) -(* independence from finite intersections to sigma-algebras. *) -(* ========================================================================= *) - -let tail_sigma = new_definition - `tail_sigma (p:A prob_space) (B:num->A->bool) = - INTERS {sigma_generated (prob_carrier p) (IMAGE B (from n)) | n IN (:num)}`;; - -let fin_inters = new_definition - `fin_inters (p:A prob_space) (B:num->A->bool) S = - {prob_carrier p} UNION - {INTERS (IMAGE B s) | FINITE s /\ s SUBSET S /\ ~(s = {})}`;; +(* Helper: min(liminf f, M) <= liminf(min(f, M)) for nonneg sequences. + Key lemma for the general Fatou's lemma below. *) +let REAL_LIMINF_MIN_CONST_LE = prove + (`!f M. (!n. &0 <= f n) /\ &0 <= M + ==> min (real_liminf f) M <= real_liminf (\n. min (f n) M)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `an = \n. inf {(f:num->real) k | k >= n}` THEN + ABBREV_TAC `bn = \n. inf {min ((f:num->real) k) M | k >= n}` THEN + SUBGOAL_THEN `real_liminf f = sup {(an:num->real) n | n IN (:num)}` + SUBST1_TAC THENL + [REWRITE_TAC[real_liminf] THEN AP_TERM_TAC THEN + EXPAND_TAC "an" THEN REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `real_liminf (\n. min ((f:num->real) n) M) = + sup {(bn:num->real) n | n IN (:num)}` SUBST1_TAC THENL + [REWRITE_TAC[real_liminf] THEN AP_TERM_TAC THEN + EXPAND_TAC "bn" THEN REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + (* min(an n, M) <= bn n *) + SUBGOAL_THEN `!n:num. min ((an:num->real) n) M <= (bn:num->real) n` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "bn" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `min ((f:num->real) n) M` THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(an:num->real) n` THEN + CONJ_TAC THENL + [REAL_ARITH_TAC; + EXPAND_TAC "an" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `k:num` THEN + ASM_REWRITE_TAC[]]]; + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Bounds on bn: 0 <= bn n <= M *) + SUBGOAL_THEN `!n:num. &0 <= (bn:num->real) n /\ bn n <= M` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "bn" THEN REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `min ((f:num->real) n) M` THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_LE_MIN] THEN ASM_SIMP_TAC[]]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `min ((f:num->real) n) M` THEN CONJ_TAC THENL + [MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_LE_MIN] THEN ASM_SIMP_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]]; + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Case split *) + ASM_CASES_TAC `!n:num. (an:num->real) n <= M` THENL + [(* Case A: all an n <= M => sup{an} <= M, min(sup,M)=sup <= sup{bn} *) + SUBGOAL_THEN `sup {(an:num->real) n | n IN (:num)} <= M` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SUP_LE THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `(an:num->real) 0` THEN EXISTS_TAC `0` THEN REFL_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `min (sup {(an:num->real) n | n IN (:num)}) M = + sup {(an:num->real) n | n IN (:num)}` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= b ==> min a b = a`) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_SUP_LE THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `(an:num->real) 0` THEN EXISTS_TAC `0` THEN REFL_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(bn:num->real) n` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `min ((an:num->real) n) M` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> a <= min a b`) THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN EXISTS_TAC `M:real` THEN + EXISTS_TAC `(bn:num->real) n` THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `n:num` THEN + REFL_TAC; + REAL_ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]]]; + (* Case B: some an N > M => min(sup,M) <= M <= sup{bn} *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `M:real` THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_SUP THEN EXISTS_TAC `M:real` THEN + EXISTS_TAC `(bn:num->real) N` THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `N:num` THEN + REFL_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `min ((an:num->real) N) M` THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]]]);; + +(* General Fatou's Lemma (most general form): requires only integrability, + nonnegativity, nonneg liminf, and bounded expectations. No pointwise + bound on X_n or inf-tails is needed. The nonneg liminf condition + 0 <= real_liminf(X_n x) ensures nn_expectation is well-defined in + HOL Light (where sup of unbounded sets is arbitrary). *) +let FATOU_LEMMA_GEN = prove + (`!p:A prob_space X. + (!n. integrable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!x. x IN prob_carrier p ==> &0 <= real_liminf (\n. X n x)) /\ + (?B. !n. nn_expectation p (X n) <= B) + ==> nn_expectation p (\x. real_liminf (\n. X n x)) + <= real_liminf (\n. nn_expectation p (X n))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC NN_EXPECTATION_LE_FROM_SIMPLE THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `h:A->real` THEN REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN `?Bg. !x:A. x IN prob_carrier p ==> (h:A->real) x <= Bg` + (X_CHOOSE_TAC `Bg:real`) THENL + [MATCH_MP_TAC SIMPLE_RV_BOUNDED THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ABBREV_TAC `M = max Bg (&1)` THEN + SUBGOAL_THEN `&0 < M` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> (h:A->real) x <= M` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `Bg:real` THEN ASM_SIMP_TAC[] THEN + EXPAND_TAC "M" THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p + ==> (h:A->real) x <= real_liminf (\n. min ((X:num->A->real) n x) M)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `min (real_liminf (\n. (X:num->A->real) n x)) M` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_MIN] THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LIMINF_MIN_CONST_LE THEN + CONJ_TAC THENL + [GEN_TAC THEN ASM_SIMP_TAC[]; + ASM_REAL_ARITH_TAC]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `nn_expectation p (\x:A. real_liminf (\n. min ((X:num->A->real) n x) M))` + THEN CONJ_TAC THENL + [MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[] THEN + EXISTS_TAC `M:real` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LIMINF_UBOUND THEN + EXISTS_TAC `&0` THEN CONJ_TAC THENL + [GEN_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + GEN_TAC THEN REWRITE_TAC[REAL_MIN_LE] THEN + DISJ2_TAC THEN REAL_ARITH_TAC]; + MATCH_MP_TAC FATOU_INTEGRABLE THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[]]);; + +(* Fatou's Lemma with inf-tails bound: corollary of FATOU_LEMMA_GEN. + The inf-tails condition inf{X_k(x)|k>=n} <= C ensures real_liminf + is well-defined and nonneg (bounded monotone sequence of inf-tails). *) +let FATOU_LEMMA = prove + (`!p:A prob_space X C. + (!n. integrable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> inf {X k x | k >= n} <= C) /\ + (?B. !n. nn_expectation p (X n) <= B) + ==> nn_expectation p (\x. real_liminf (\n. X n x)) + <= real_liminf (\n. nn_expectation p (X n))`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC FATOU_LEMMA_GEN THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[real_liminf] THEN + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `C:real` THEN + EXISTS_TAC `inf {(X:num->A->real) k x | k >= 0:num}` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `0` THEN REFL_TAC; + MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(X:num->A->real) 0 x` THEN EXISTS_TAC `0` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]]; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]]; + EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[]]);; + + +(* ========================================================================= *) +(* KOLMOGOROV 0-1 LAW *) +(* Tail events of independent event sequences have probability 0 or 1. *) +(* Uses the Dynkin pi-lambda theorem (proved above) to bootstrap *) +(* independence from finite intersections to sigma-algebras. *) +(* ========================================================================= *) + +let tail_sigma = new_definition + `tail_sigma (p:A prob_space) (B:num->A->bool) = + INTERS {sigma_generated (prob_carrier p) (IMAGE B (from n)) | n IN (:num)}`;; + +let fin_inters = new_definition + `fin_inters (p:A prob_space) (B:num->A->bool) S = + {prob_carrier p} UNION + {INTERS (IMAGE B s) | FINITE s /\ s SUBSET S /\ ~(s = {})}`;; let INTERS_IMAGE_IN_EVENTS = prove (`!p:A prob_space B (s:num->bool). @@ -11231,6 +11401,7 @@ let KOLMOGOROV_ZERO_ONE = prove (* Fatou's Lemma for Events and Convergence Relationships *) (* ========================================================================= *) + (* Inner sets of liminf are increasing: intersecting over fewer terms gives a larger set *) let TAIL_INTERS_INCREASING = prove @@ -11514,2067 +11685,9673 @@ let REAL_LIMINF_LIMSUP_CONVERGES = prove [ASM_MESON_TAC[]; ALL_TAC] THEN ASM_REAL_ARITH_TAC);; -(* If liminf_events A = limsup_events A = E, then P(A_n) --> P(E) *) -let PROB_CONVERGENCE_EVENTS = prove - (`!p:A prob_space A E. - (!n. A n IN prob_events p) /\ - liminf_events A = E /\ limsup_events A = E - ==> ((\n. prob p (A n)) ---> prob p E) sequentially`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC(ISPECL [`\n:num. prob (p:A prob_space) ((A:num->A->bool) n)`; - `&0`; `&1`; `prob (p:A prob_space) (E:A->bool)`] - REAL_LIMINF_LIMSUP_CONVERGES) THEN - BETA_TAC THEN REPEAT CONJ_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; - GEN_TAC THEN MATCH_MP_TAC PROB_LE_1 THEN ASM_REWRITE_TAC[]; - MP_TAC(ISPECL [`p:A prob_space`; `A:num->A->bool`] - FATOU_EVENTS_LIMINF) THEN - ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; - MP_TAC(ISPECL [`p:A prob_space`; `A:num->A->bool`] - FATOU_EVENTS_LIMSUP) THEN - ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; +(* ------------------------------------------------------------------------- *) +(* Additional real_limsup bounds and monotonicity *) +(* ------------------------------------------------------------------------- *) -(* ========================================================================= *) -(* Convergence mode relationships *) -(* ========================================================================= *) +let REAL_LIMSUP_LBOUND = prove + (`!f (b:real) B. (!n. b <= f n) /\ (!n. f n <= B) + ==> b <= real_limsup f`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_limsup] THEN + MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `sup {(f:num->real) k | k >= 0:num}` THEN + EXISTS_TAC `0` THEN REFL_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) n` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) n` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]]);; -(* limsup of "bad" events is contained in the complement of the - convergence set *) -let LIMSUP_BAD_SUBSET_COMPL_CONV = prove - (`!p:A prob_space (X:num->A->real) (L:A->real) e. - &0 < e ==> - limsup_events - (\n. {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e}) - SUBSET - prob_carrier p DIFF - {x | x IN prob_carrier p /\ - ((\n. X n x) ---> L x) sequentially}`, - REPEAT STRIP_TAC THEN - REWRITE_TAC[LIMSUP_EVENTS_ALT; SUBSET; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `w:A` THEN DISCH_TAC THEN - CONJ_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN - STRIP_TAC THEN ASM_REWRITE_TAC[]; - REWRITE_TAC[BETA_THM] THEN - DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - UNDISCH_TAC `!m. ?n. n >= m /\ (w:A) IN prob_carrier p /\ - abs((X:num->A->real) n w - (L:A->real) w) >= e` THEN - DISCH_THEN(MP_TAC o SPEC `N:num`) THEN - DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN - SUBGOAL_THEN `abs((X:num->A->real) n w - (L:A->real) w) < e` - MP_TAC THENL - [FIRST_X_ASSUM MATCH_MP_TAC THEN - UNDISCH_TAC `n:num >= N` THEN REWRITE_TAC[GE]; - ASM_REAL_ARITH_TAC]]);; +let REAL_LIMSUP_UBOUND = prove + (`!f (b:real) B. (!n. b <= f n) /\ (!n. f n <= B) + ==> real_limsup f <= B`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_limsup] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sup {(f:num->real) k | k >= 0:num}` THEN CONJ_TAC THENL + [MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `b:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) n` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) n` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `0` THEN REFL_TAC]; + MATCH_MP_TAC REAL_SUP_LE THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(f:num->real) 0` THEN EXISTS_TAC `0` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]);; -(* Almost sure convergence implies convergence in probability *) -let ALMOST_SURE_IMP_IN_PROB = prove - (`!p:A prob_space (X:num->A->real) (L:A->real). - (!n:num e. &0 < e ==> - {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e} - IN prob_events p) /\ - {x:A | x IN prob_carrier p /\ - ((\n. X n x) ---> L x) sequentially} IN prob_events p /\ - converges_as p X L - ==> converges_in_prob p X L`, - REPEAT GEN_TAC THEN - REWRITE_TAC[converges_as; converges_in_prob] THEN - STRIP_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN - ABBREV_TAC `B = \n:num. - {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e}` THEN - SUBGOAL_THEN `!n. (B:num->A->bool) n IN prob_events p` ASSUME_TAC THENL - [GEN_TAC THEN EXPAND_TAC "B" THEN REWRITE_TAC[] THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* D_m = UNIONS{B_n | n >= m} is decreasing *) - ABBREV_TAC `DD = \m:num. UNIONS {(B:num->A->bool) n | n >= m}` THEN - SUBGOAL_THEN `!m. (DD:num->A->bool) m IN prob_events p` ASSUME_TAC THENL - [GEN_TAC THEN EXPAND_TAC "DD" THEN REWRITE_TAC[] THEN - MATCH_MP_TAC TAIL_UNION_IN_EVENTS THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `!m. (DD:num->A->bool) (SUC m) SUBSET DD m` ASSUME_TAC THENL - [GEN_TAC THEN EXPAND_TAC "DD" THEN REWRITE_TAC[] THEN - REWRITE_TAC[TAIL_UNION_DECREASING]; - ALL_TAC] THEN - (* limsup_events B = INTERS{DD_m} *) - SUBGOAL_THEN `limsup_events (B:num->A->bool) = - INTERS {DD m | m IN (:num)}` ASSUME_TAC THENL - [EXPAND_TAC "DD" THEN EXPAND_TAC "B" THEN REWRITE_TAC[limsup_events]; - ALL_TAC] THEN - (* P(limsup B) = 0 *) - SUBGOAL_THEN `prob p (limsup_events (B:num->A->bool)) = &0` - ASSUME_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC PROB_POSITIVE THEN - MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* limsup B SUBSET carrier DIFF {convergence set} *) +let REAL_LIMSUP_MONO = prove + (`!f g (b:real) B. (!n. f n <= g n) /\ (!n. b <= f n) /\ (!n. g n <= B) + ==> real_limsup f <= real_limsup g`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_limsup] THEN + MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `sup {(g:num->real) k | k >= 0:num}` THEN + EXISTS_TAC `0` THEN REFL_TAC; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `prob p (prob_carrier (p:A prob_space) DIFF - {x:A | x IN prob_carrier p /\ - ((\n. (X:num->A->real) n x) ---> L x) sequentially})` THEN - CONJ_TAC THENL - [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL - [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - CONJ_TAC THENL - [MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - EXPAND_TAC "B" THEN REWRITE_TAC[] THEN - MATCH_MP_TAC LIMSUP_BAD_SUBSET_COMPL_CONV THEN ASM_REWRITE_TAC[]; - ASM_SIMP_TAC[PROB_COMPL] THEN ASM_REAL_ARITH_TAC]; - ALL_TAC] THEN - (* P(DD_m) --> P(limsup B) via continuity from above *) - SUBGOAL_THEN - `((\m. prob p ((DD:num->A->bool) m)) ---> - prob p (limsup_events (B:num->A->bool))) sequentially` - ASSUME_TAC THENL - [SUBGOAL_THEN `limsup_events (B:num->A->bool) = - INTERS {(DD:num->A->bool) m | m IN (:num)}` SUBST1_TAC THENL - [ASM_REWRITE_TAC[]; - MATCH_MP_TAC PROB_CONTINUITY_FROM_ABOVE THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - (* P(DD_m) --> 0 *) - SUBGOAL_THEN `((\m. prob p ((DD:num->A->bool) m)) ---> &0) sequentially` - ASSUME_TAC THENL - [ASM_MESON_TAC[]; ALL_TAC] THEN - (* Rewrite goal in terms of B *) - SUBGOAL_THEN `(\n. prob p {x:A | x IN prob_carrier p /\ - abs ((X:num->A->real) n x - (L:A->real) x) >= e}) = - (\n. prob p ((B:num->A->bool) n))` SUBST1_TAC THENL - [EXPAND_TAC "B" THEN REWRITE_TAC[]; + EXISTS_TAC `sup {(f:num->real) k | k >= n}` THEN CONJ_TAC THENL + [MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `b:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) n'` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) n'` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n':num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[REAL_LE_TRANS]]]; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `n:num` THEN + REFL_TAC]; + MATCH_MP_TAC REAL_SUP_LE THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(f:num->real) n` THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(g:num->real) k` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(g:num->real) k` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `k:num` THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]]]]);; + +(* Key identity: liminf of (c - f) = c - limsup f for bounded sequences *) + +let REAL_LT_SUB_SWAP = + REAL_ARITH `!s c bprime:real. c - s < bprime ==> c - bprime < s`;; + +let REAL_LIMINF_CONST_MINUS = prove + (`!f (b:real) B c. (!n. b <= f n) /\ (!n. f n <= B) + ==> real_liminf (\n. c - f n) = c - real_limsup f`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_liminf; real_limsup] THEN + SUBGOAL_THEN + `!m:num. inf {c - (f:num->real) k | k >= m} = c - sup {f k | k >= m}` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_INF_UNIQUE THEN CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN X_GEN_TAC `y:real` THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[REAL_ARITH `c - s <= c - fj <=> fj <= s`] THEN + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) j` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `j:num` THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `bprime:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `c - bprime < sup {(f:num->real) k | k >= m}` ASSUME_TAC + THENL + [MP_TAC(ISPECL [`sup {(f:num->real) k | k >= m}`; + `c:real`; `bprime:real`] REAL_LT_SUB_SWAP) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`{(f:num->real) k | k >= m}`; + `c - bprime:real`] SUP_APPROACH) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(f:num->real) m` THEN EXISTS_TAC `m:num` THEN + REWRITE_TAC[GE; LE_REFL]; + EXISTS_TAC `B:real` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `z:real` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) ASSUME_TAC) THEN + EXISTS_TAC `c - (f:num->real) j` THEN CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `j:num` THEN + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]]]; ALL_TAC] THEN - (* Squeeze: 0 <= P(B_n) <= P(DD_n) --> 0 *) - MATCH_MP_TAC(ISPECL [`\n:num. &0`; - `\n:num. prob p ((B:num->A->bool) n)`; - `\m:num. prob p ((DD:num->A->bool) m)`; `&0`] - REALLIM_TRANSFORM_STRADDLE) THEN BETA_TAC THEN - REPEAT CONJ_TAC THENL - [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN - MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; - REWRITE_TAC[REALLIM_CONST]; - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN - MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN - EXPAND_TAC "DD" THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN_ELIM_THM] THEN - X_GEN_TAC `x:A` THEN DISCH_TAC THEN - EXISTS_TAC `(B:num->A->bool) n` THEN ASM_REWRITE_TAC[] THEN - EXISTS_TAC `n:num` THEN REWRITE_TAC[GE; LE_REFL]; - ASM_REWRITE_TAC[]]);; + MATCH_MP_TAC REAL_SUP_UNIQUE THEN CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN X_GEN_TAC `y:real` THEN + DISCH_THEN(X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[REAL_ARITH `c - s <= c - i <=> i <= s`] THEN + MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `b:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) n` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) n` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `p:num` THEN + REFL_TAC]; + X_GEN_TAC `bprime2:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `?p:num. sup {(f:num->real) k | k >= p} < c - bprime2` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPECL + [`{sup {(f:num->real) k | k >= n} | n IN (:num)}`; + `c - bprime2:real`] INF_APPROACH) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `sup {(f:num->real) k | k >= 0}` THEN + EXISTS_TAC `0` THEN REFL_TAC; + CONJ_TAC THENL + [EXISTS_TAC `b:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->real) n` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_SUP THEN + EXISTS_TAC `B:real` THEN EXISTS_TAC `(f:num->real) n` THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[REAL_LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[]]]; + MATCH_MP_TAC(REAL_ARITH + `bprime2 < c - i ==> i < c - bprime2`) THEN + ASM_REWRITE_TAC[]]]; + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `z:real` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_THEN `p:num` STRIP_ASSUME_TAC) ASSUME_TAC) THEN + EXISTS_TAC `p:num` THEN ASM_MESON_TAC[]]; + EXISTS_TAC `c - sup {(f:num->real) k | k >= p}` THEN + CONJ_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN EXISTS_TAC `p:num` THEN + REFL_TAC; + MATCH_MP_TAC(REAL_ARITH `s < c - bprime2 ==> bprime2 < c - s`) THEN + ASM_REWRITE_TAC[]]]]);; -(* L2 convergence implies convergence in probability *) -let L2_IMP_IN_PROB = prove - (`!p:A prob_space (X:num->A->real) (L:A->real). - (!n. simple_rv p (X n)) /\ simple_rv p L /\ - converges_L2 p X L - ==> converges_in_prob p X L`, - REPEAT GEN_TAC THEN - REWRITE_TAC[converges_L2; converges_in_prob] THEN - STRIP_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN - (* P(|X_n - L| >= e) <= E[(X_n - L)^2] / e^2 by Markov *) - SUBGOAL_THEN `!n. prob p {x:A | x IN prob_carrier p /\ - abs((X:num->A->real) n x - (L:A->real) x) >= e} <= - simple_expectation p (\x. (X n x - L x) pow 2) / e pow 2` +(* ------------------------------------------------------------------------- *) +(* Reverse Fatou's lemma: for bounded nonneg random variables, *) +(* real_limsup(E[X_n]) <= E[real_limsup(X_n)] *) +(* Proved by applying standard Fatou to (B - X_n). *) +(* ------------------------------------------------------------------------- *) + +let REVERSE_FATOU_LEMMA = prove + (`!p:A prob_space X B. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= B) + ==> real_limsup (\n. nn_expectation p (X n)) + <= nn_expectation p (\x. real_limsup (\n. X n x))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 <= B:real` ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + ASM_MESON_TAC[REAL_LE_TRANS]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. &0 <= nn_expectation (p:A prob_space) + ((X:num->A->real) n)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_POS THEN + ASM_SIMP_TAC[] THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. nn_expectation (p:A prob_space) + ((X:num->A->real) n) <= B` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_UPPER_BOUND THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 1: Apply Fatou to B - X_n *) + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. real_liminf (\n. B - (X:num->A->real) n x)) + <= real_liminf + (\n. nn_expectation p (\x. B - X n x))` ASSUME_TAC THENL - [GEN_TAC THEN - SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ - abs((X:num->A->real) n x - (L:A->real) x) >= e} = - {x | x IN prob_carrier p /\ (X n x - L x) pow 2 >= e pow 2}` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN - ASM_CASES_TAC `(a:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_ge; GSYM REAL_LE_SQUARE_ABS] THEN - ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> abs e = e`]; - MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_SQUARE THEN - MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - CONJ_TAC THENL - [X_GEN_TAC `a:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; - ASM_SIMP_TAC[REAL_POW_LT]]]]; + [MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. B - (X:num->A->real) n x`; `B:real`] + FATOU_NN_EXPECTATION) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + CONJ_TAC THENL + [REWRITE_TAC[RANDOM_VARIABLE_CONST]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> &0 <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; ALL_TAC] THEN - (* Squeeze: 0 <= P(...) <= E[...]/e^2 --> 0 *) - MATCH_MP_TAC(ISPECL [`\n:num. &0`; - `\n:num. prob (p:A prob_space) {x:A | x IN prob_carrier p /\ - abs((X:num->A->real) n x - (L:A->real) x) >= e}`; - `\n:num. simple_expectation (p:A prob_space) - (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / e pow 2`; - `&0`] REALLIM_TRANSFORM_STRADDLE) THEN BETA_TAC THEN - REPEAT CONJ_TAC THENL - [(* 0 <= prob(...) eventually *) - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - MATCH_MP_TAC PROB_POSITIVE THEN - MATCH_MP_TAC RANDOM_VARIABLE_GE THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) - (\x:A. abs((X:num->A->real) n x - (L:A->real) x))` MP_TAC THENL - [MATCH_MP_TAC SIMPLE_RV_ABS THEN - MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - REWRITE_TAC[simple_rv] THEN MESON_TAC[]]; - (* (\n. &0) ---> &0 *) - REWRITE_TAC[REALLIM_CONST]; - (* prob(...) <= E[...]/e^2 eventually *) - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN - REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; - (* E[(X_n - L)^2]/e^2 --> 0 *) - SUBGOAL_THEN `(\n. simple_expectation (p:A prob_space) - (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / e pow 2) = - (\n. inv(e pow 2) * simple_expectation p - (\x. (X n x - L x) pow 2))` + (* Step 2: nn_expectation p (\x. B - X n x) = B - nn_expectation p (X n) *) + SUBGOAL_THEN + `!n:num. nn_expectation (p:A prob_space) + (\x. B - (X:num->A->real) n x) = + B - nn_expectation p (X n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_CONST_MINUS THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 3: real_liminf(\n. B - X n x) = B - real_limsup(\n. X n x) *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + real_liminf (\n. B - (X:num->A->real) n x) = + B - real_limsup (\n. X n x)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LIMINF_CONST_MINUS THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 4: real_liminf(\n. B - E[X_n]) = B - real_limsup(\n. E[X_n]) *) + SUBGOAL_THEN + `real_liminf (\n:num. + B - nn_expectation (p:A prob_space) + ((X:num->A->real) n)) = + B - real_limsup (\n. nn_expectation p (X n))` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_CONST_MINUS THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 5: Rewrite RHS of Fatou inequality *) + SUBGOAL_THEN + `(\n:num. nn_expectation (p:A prob_space) + (\x. B - (X:num->A->real) n x)) = + (\n. B - nn_expectation p (X n))` + ASSUME_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 6: Combine - from Fatou we get *) + (* nn_exp(\x. B - limsup(\n. X n x)) <= B - limsup(\n. nn_exp(X n)) *) + (* Step 6a: rewrite LHS of Fatou: liminf(\n. B - Xnx) = B - limsup(\n. Xnx) *) + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. B - real_limsup (\n. (X:num->A->real) n x)) <= + B - real_limsup (\n. nn_expectation p (X n))` + ASSUME_TAC THENL + [SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. B - real_limsup (\n. (X:num->A->real) n x)) = + nn_expectation p (\x. real_liminf (\n. B - X n x))` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN - SUBGOAL_THEN `&0 = inv(e pow 2) * &0` SUBST1_TAC THENL - [REWRITE_TAC[REAL_MUL_RZERO]; ALL_TAC] THEN - MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN + DISCH_TAC THEN CONV_TAC SYM_CONV THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_liminf (\n:num. nn_expectation (p:A prob_space) + (\x:A. B - (X:num->A->real) n x))` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `real_liminf (\n:num. nn_expectation (p:A prob_space) + (\x:A. B - (X:num->A->real) n x)) = + real_liminf (\n. B - nn_expectation p (X n))` + SUBST1_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[REAL_LE_REFL]]]; + ALL_TAC] THEN + (* Step 7: Apply NN_EXPECTATION_CONST_MINUS to limsup *) + (* Need: random_variable p (\x. real_limsup(\n. X n x)) *) + (* and bounds on real_limsup(\n. X n x) *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + &0 <= real_limsup (\n. (X:num->A->real) n x) /\ + real_limsup (\n. X n x) <= B` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_liminf (\n. (X:num->A->real) n x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_LBOUND THEN + EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LIMINF_LE_LIMSUP THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]]; + MATCH_MP_TAC REAL_LIMSUP_UBOUND THEN + EXISTS_TAC `&0` THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `random_variable (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x))` + ASSUME_TAC THENL + [(* Prove random_variable p (\x. real_limsup(\n. X n x)) + Use: random_variable only depends on level sets within prob_carrier. + On prob_carrier: limsup(X) = B - liminf(B - X), so it suffices to + show B - liminf(B-X) is a random variable. *) + SUBGOAL_THEN + `random_variable (p:A prob_space) + (\x:A. B - real_liminf (\n. B - (X:num->A->real) n x))` + ASSUME_TAC THENL + [ + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + (* Need: random_variable p (\x. real_liminf(\n. B - X n x)) *) + (* real_liminf = sup of inf, inf is random variable by INF_SEQ *) + (* The increasing limit of gn = inf{B-Xk|k>=n} *) + MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `\n:num. \x:A. inf {B - (X:num->A->real) k x | k >= n}` THEN + CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_INF_SEQ THEN CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `x <= B ==> &0 <= B - x`) THEN + ASM_SIMP_TAC[]]; + (* Pointwise convergence: inf{B-Xk|k>=n} --> real_liminf(B-X) *) + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[real_liminf] THEN + MATCH_MP_TAC INCREASING_BOUNDED_CONVERGES_TO_SUP THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `B - (X:num->A->real) n x` THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`k:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `B - (X:num->A->real) n x` THEN CONJ_TAC THENL + [MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`k:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]]; + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> &0 <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + (* Monotonicity: inf{B-Xk|k>=n} <= inf{B-Xk|k>=SUC n} *) + GEN_TAC THEN MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `B - (X:num->A->real) (SUC n) x` THEN + EXISTS_TAC `SUC n` THEN REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`k':num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `k:num` THEN + ASM_REWRITE_TAC[GE] THEN + UNDISCH_TAC `k:num >= SUC n` THEN ARITH_TAC]]]]; + ALL_TAC] THEN + (* Bridge: on carrier, B - liminf(B-X) = limsup(X), so rv transfers *) + REWRITE_TAC[random_variable] THEN GEN_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + real_limsup (\n. (X:num->A->real) n x) <= a} = + {x | x IN prob_carrier p /\ + B - real_liminf (\n. B - X n x) <= a}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `!x:A. x IN prob_carrier p ==> + real_liminf (\n. B - (X:num->A->real) n x) = + B - real_limsup (\n. X n x)` THEN + DISCH_THEN(MP_TAC o SPEC `w:A`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + UNDISCH_TAC `random_variable (p:A prob_space) + (\x. B - real_liminf (\n. B - (X:num->A->real) n x))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(fun th -> REWRITE_TAC[SPEC `a:real` th])]; + (* Use random_variable limsup assumption *) + ALL_TAC] THEN + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x:A. B - real_limsup + (\n. (X:num->A->real) n x)) = + B - nn_expectation p + (\x. real_limsup (\n. X n x))` + ASSUME_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_CONST_MINUS THEN ASM_SIMP_TAC[] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Final: from B - nn_exp(limsup) <= B - limsup(nn_exp), get the result *) + ASM_REAL_ARITH_TAC);; -(* ========================================================================= *) -(* Abel summation by parts and Kronecker's lemma *) -(* ========================================================================= *) +(* RANDOM_VARIABLE_REAL_LIMINF: liminf of nonneg bounded RVs is a RV *) +let RANDOM_VARIABLE_REAL_LIMINF = prove + (`!p:A prob_space X B. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= B) + ==> random_variable p (\x. real_liminf (\n. X n x))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 <= B:real` ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + ASM_MESON_TAC[REAL_LE_TRANS]; + ALL_TAC] THEN + MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `\n:num. \x:A. inf {(X:num->A->real) k x | k >= n}` THEN + CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_INF_SEQ THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[real_liminf] THEN + MATCH_MP_TAC INCREASING_BOUNDED_CONVERGES_TO_SUP THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(X:num->A->real) n x` THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]]; + GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(X:num->A->real) n x` THEN CONJ_TAC THENL + [MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `n:num` THEN + REWRITE_TAC[GE; LE_REFL]]; + ASM_SIMP_TAC[]]; + GEN_TAC THEN MATCH_MP_TAC REAL_LE_INF THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `(X:num->A->real) (SUC n) x` THEN + EXISTS_TAC `SUC n` THEN REWRITE_TAC[GE; LE_REFL]; + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INF_LE_ELEMENT THEN CONJ_TAC THENL + [EXISTS_TAC `&0` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `k:num` THEN + ASM_REWRITE_TAC[GE] THEN + UNDISCH_TAC `k:num >= SUC n` THEN ARITH_TAC]]]]);; -let ABEL_SUMMATION_IDENTITY = prove - (`!b c n. - sum (0..SUC n) (\k. b k * c k) = - b (SUC n) * sum (0..SUC n) c - - sum (0..n) (\k. sum (0..k) c * (b (SUC k) - b k))`, - GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL - [REWRITE_TAC[SUM_CLAUSES_NUMSEG; ARITH_RULE `0 <= 0`; - ARITH_RULE `0 <= SUC 0`] THEN - REWRITE_TAC[SUM_SING_NUMSEG] THEN - REAL_ARITH_TAC; - ONCE_REWRITE_TAC[SUM_CLAUSES_NUMSEG] THEN - REWRITE_TAC[LE_0] THEN - FIRST_X_ASSUM SUBST1_TAC THEN - REAL_ARITH_TAC]);; +(* RANDOM_VARIABLE_REAL_LIMSUP: limsup of nonneg bounded RVs is a RV *) +let RANDOM_VARIABLE_REAL_LIMSUP = prove + (`!p:A prob_space X B. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= B) + ==> random_variable p (\x. real_limsup (\n. X n x))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 <= B:real` ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + ASM_MESON_TAC[REAL_LE_TRANS]; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x:A. B - real_liminf (\n. B - (X:num->A->real) n x))` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. B - (X:num->A->real) n x`; `B:real`] + RANDOM_VARIABLE_REAL_LIMINF) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> &0 <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + REWRITE_TAC[random_variable] THEN GEN_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + real_limsup (\n. (X:num->A->real) n x) <= a} = + {x | x IN prob_carrier p /\ + B - real_liminf (\n. B - X n x) <= a}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `real_liminf (\n. B - (X:num->A->real) n w) = + B - real_limsup (\n. X n w)` SUBST1_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_CONST_MINUS THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + REAL_ARITH_TAC]; + UNDISCH_TAC `random_variable (p:A prob_space) + (\x. B - real_liminf (\n. B - (X:num->A->real) n x))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(fun th -> REWRITE_TAC[SPEC `a:real` th])]);; -let REAL_ABS_TRIANGLE_SUB = REAL_ARITH `!x y. abs(x - y) <= abs x + abs y`;; +(* REAL_LIMSUP_SUB_CONST: shifting a bounded sequence by a constant *) +let REAL_LIMSUP_SUB_CONST = prove + (`!f b B d. (!n. b <= f n) /\ (!n. f n <= B) + ==> real_limsup (\n. f n - d) = real_limsup f - d`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`f:num->real`; `b:real`; `B:real`; `&2 * d`] + REAL_LIMINF_CONST_MINUS) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `real_liminf (\n. &2 * d - (f:num->real) n) = + d - real_limsup (\n. f n - d)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`\n:num. (f:num->real) n - d`; `b - d:real`; + `B - d:real`; `d:real`] REAL_LIMINF_CONST_MINUS) THEN + ANTS_TAC THENL + [CONJ_TAC THEN GEN_TAC THENL + [UNDISCH_TAC `!n. b <= (f:num->real) n` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC; + UNDISCH_TAC `!n. (f:num->real) n <= B` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `(\n. d - (\n. (f:num->real) n - d) n) = + (\n. &2 * d - f n)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[] THEN REAL_ARITH_TAC; + DISCH_THEN ACCEPT_TAC]]; + ASM_REAL_ARITH_TAC]);; -let KRONECKER_LEMMA = prove - (`!a b. - (!n. &0 < b(n)) /\ - (!n. b(n) <= b(n + 1)) /\ - (!M. ?N. !n. N <= n ==> M <= b(n)) /\ - real_summable (from 0) (\k. a(k) / b(k)) - ==> ((\n. inv(b(n)) * sum(0..n) a) ---> &0) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - ABBREV_TAC `c = \k:num. (a(k):real) / b(k)` THEN - ABBREV_TAC `S = real_infsum (from 0) (c:num->real)` THEN - SUBGOAL_THEN `((\n. sum(0..n) (c:num->real)) ---> S) sequentially` - ASSUME_TAC THENL - [UNDISCH_TAC `real_summable (from 0) (c:num->real)` THEN - UNDISCH_TAC `real_infsum (from 0) (c:num->real) = S` THEN - REWRITE_TAC[real_summable; real_sums; FROM_0; INTER_UNIV; - real_infsum] THEN - MESON_TAC[SELECT_AX]; - ALL_TAC] THEN - FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN - SUBGOAL_THEN `!n. ~(b(n:num) = &0)` ASSUME_TAC THENL - [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN - SUBGOAL_THEN `!k:num. (a(k):real) = b(k) * c(k)` ASSUME_TAC THENL - [GEN_TAC THEN EXPAND_TAC "c" THEN REWRITE_TAC[] THEN - REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN - ONCE_REWRITE_TAC[REAL_ARITH `(b * a) * c = a * (b * c):real`] THEN - ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_RID]; - ALL_TAC] THEN - SUBGOAL_THEN `?Cs. !k:num. abs(sum(0..k) (c:num->real)) <= Cs` - (X_CHOOSE_TAC `Cs:real`) THENL - [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN - DISCH_THEN(X_CHOOSE_TAC `N0:num`) THEN - EXISTS_TAC `sum(0..N0) (\k:num. abs(sum(0..k) (c:num->real))) + - abs(S:real) + &1` THEN - X_GEN_TAC `k:num` THEN ASM_CASES_TAC `k:num <= N0` THENL - [MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= y + abs S + &1`) THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..N0) - (\i:num. if i = k then abs(sum(0..k) (c:num->real)) else &0)` THEN +(* REAL_LIMINF_SUB_CONST: shifting a bounded sequence by a constant *) +let REAL_LIMINF_SUB_CONST = prove + (`!f b B d. (!n. b <= f n) /\ (!n. f n <= B) + ==> real_liminf (\n. f n - d) = real_liminf f - d`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`\n:num. --((f:num->real) n)`; `--B:real`; `--b:real`; + `--d:real`] REAL_LIMINF_CONST_MINUS) THEN + ANTS_TAC THENL + [CONJ_TAC THEN GEN_TAC THENL + [UNDISCH_TAC `!n. (f:num->real) n <= B` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC; + UNDISCH_TAC `!n. b <= (f:num->real) n` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `(\n. --d - (\n. --((f:num->real) n)) n) = + (\n. f n - d)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`\n:num. --((f:num->real) n)`; `--B:real`; `--b:real`; + `&0:real`] REAL_LIMINF_CONST_MINUS) THEN + ANTS_TAC THENL + [CONJ_TAC THEN GEN_TAC THENL + [UNDISCH_TAC `!n. (f:num->real) n <= B` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC; + UNDISCH_TAC `!n. b <= (f:num->real) n` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `(\n. &0 - (\n. --((f:num->real) n)) n) = f` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +(* EXPECTATION_NONNEG_EQ_NN: moved here for use by REVERSE_FATOU_EXPECTATION *) +let EXPECTATION_NONNEG_EQ_NN = prove + (`!p:A prob_space (f:A->real). + integrable p f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) + ==> expectation p f = nn_expectation p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[expectation] THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max ((f:A->real) x) (&0)) = + nn_expectation p f` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= f ==> max f (&0) = f`) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max (--((f:A->real) x)) (&0)) = &0` + (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max (--((f:A->real) x)) (&0)) = + nn_expectation p (\x:A. &0)` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= f ==> max (--f) (&0) = &0`) THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(\x:A. &0):A->real`] NN_EXPECTATION_SIMPLE) THEN + REWRITE_TAC[SIMPLE_RV_CONST; REAL_LE_REFL; SIMPLE_EXPECTATION_CONST]);; + +(* REVERSE_FATOU_EXPECTATION: generalized reverse Fatou for signed bounded RVs *) +let REVERSE_FATOU_EXPECTATION = prove + (`!p:A prob_space X A B. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> A <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= B) + ==> real_limsup (\n. expectation p (X n)) + <= expectation p (\x. real_limsup (\n. X n x))`, + REPEAT STRIP_TAC THEN + (* Step 1: A <= B *) + SUBGOAL_THEN `A <= B:real` ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(X:num->A->real) 0 a` THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Step 2: All X_n integrable *) + SUBGOAL_THEN `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `max (abs A) (abs B)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `A <= f /\ f <= B ==> abs f <= max (abs A) (abs B)`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 3: Apply REVERSE_FATOU_LEMMA to Y_n = X_n - A *) + SUBGOAL_THEN + `real_limsup (\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A)) + <= nn_expectation p (\x. real_limsup (\n. X n x - A))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. (X:num->A->real) n x - A`; `B - A:real`] + REVERSE_FATOU_LEMMA) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Step 4: nn_exp(X_n - A) = exp(X_n) - A *) + SUBGOAL_THEN `!n:num. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A) = expectation p (X n) - A` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A) = + expectation p (\x. X n x - A)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `\x:A. A:real`] EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST]]; + ALL_TAC] THEN + (* Step 5: Bounds on exp(X_n) *) + SUBGOAL_THEN `!n:num. A <= expectation (p:A prob_space) + ((X:num->A->real) n) /\ expectation p (X n) <= B` ASSUME_TAC THENL + [GEN_TAC THEN CONJ_TAC THENL + [SUBGOAL_THEN `A = expectation (p:A prob_space) (\x:A. A:real)` + SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN ASM_SIMP_TAC[]]; + SUBGOAL_THEN `B = expectation (p:A prob_space) (\x:A. B:real)` + SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Step 6: LHS limsup shift *) + SUBGOAL_THEN `real_limsup (\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A)) = + real_limsup (\n. expectation p (X n)) - A` ASSUME_TAC THENL + [SUBGOAL_THEN `(\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A)) = + (\n. expectation p (X n) - A)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LIMSUP_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN + ASM_REWRITE_TAC[GSYM FORALL_AND_THM]]; + ALL_TAC] THEN + (* Step 7: random_variable for limsup(X_n) *) + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x))` ASSUME_TAC THENL + [SUBGOAL_THEN `random_variable (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x - A))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. (X:num->A->real) n x - A`; `B - A:real`] + RANDOM_VARIABLE_REAL_LIMSUP) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THENL - [REWRITE_TAC[SUM_DELTA; IN_NUMSEG] THEN - ASM_REWRITE_TAC[LE_0; REAL_LE_REFL]; - MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN - BETA_TAC THEN COND_CASES_TAC THEN - ASM_REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL]]; - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(S:real) + &1` THEN CONJ_TAC THENL - [MATCH_MP_TAC(REAL_ARITH - `abs(x - S) < &1 ==> abs x <= abs S + &1`) THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; - MATCH_MP_TAC(REAL_ARITH `&0 <= y ==> a + &1 <= y + a + &1`) THEN - MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN REPEAT STRIP_TAC THEN - REWRITE_TAC[REAL_ABS_POS]]]; - ALL_TAC] THEN - SUBGOAL_THEN `!k:num. &0 <= b(SUC k) - b(k)` ASSUME_TAC THENL - [GEN_TAC THEN - UNDISCH_TAC `!n. b n <= b(n + 1)` THEN - DISCH_THEN(MP_TAC o SPEC `k:num`) THEN - REWRITE_TAC[ADD1] THEN REAL_ARITH_TAC; + [SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; ALL_TAC] THEN - ABBREV_TAC `D = (&3 / e) * ((Cs + abs(S:real)) * b(SUC N1) + - abs S * b(0:num)) + &1` THEN - UNDISCH_TAC `!M. ?N. !n:num. N <= n ==> M <= b n` THEN - DISCH_THEN(MP_TAC o SPEC `D:real`) THEN - DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN - EXISTS_TAC `SUC(MAX N1 N2)` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - SUBGOAL_THEN `?j. n = SUC j /\ N1 <= j /\ N2 <= SUC j` - (CHOOSE_THEN STRIP_ASSUME_TAC) THENL - [EXISTS_TAC `n - 1` THEN ASM_ARITH_TAC; ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN - SUBGOAL_THEN `sum(0..SUC j) a = sum(0..SUC j) (\k. b(k) * c(k))` - SUBST1_TAC THENL - [MATCH_MP_TAC SUM_EQ_NUMSEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[ABEL_SUMMATION_IDENTITY] THEN - REWRITE_TAC[REAL_SUB_LDISTRIB] THEN + REWRITE_TAC[random_variable] THEN GEN_TAC THEN SUBGOAL_THEN - `inv(b(SUC j)) * (b(SUC j) * sum(0..SUC j) (c:num->real)) = - sum(0..SUC j) c` SUBST1_TAC THENL - [REWRITE_TAC[REAL_MUL_ASSOC] THEN - ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID]; - ALL_TAC] THEN - REWRITE_TAC[REAL_SUB_RZERO] THEN + `{x:A | x IN prob_carrier p /\ + real_limsup (\n. (X:num->A->real) n x) <= a} = + {x | x IN prob_carrier p /\ + real_limsup (\n. X n x - A) <= a - A}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `real_limsup (\n. (X:num->A->real) n w - A) = + real_limsup (\n. X n w) - A` SUBST1_TAC THENL + [MATCH_MP_TAC REAL_LIMSUP_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + REAL_ARITH_TAC]; + UNDISCH_TAC `random_variable (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x - A))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(fun th -> REWRITE_TAC[SPEC `a - A:real` th])]; + ALL_TAC] THEN + (* Step 8: Integrability of limsup(X_n) *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `max (abs A) (abs B)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN MATCH_MP_TAC(REAL_ARITH - `abs(s - S) < e / &3 /\ abs(S - w) <= &2 * e / &3 - ==> abs(s - w) < e`) THEN + `A <= f /\ f <= B ==> abs f <= max (abs A) (abs B)`) THEN CONJ_TAC THENL - [UNDISCH_TAC - `!n:num. N1 <= n ==> abs(sum(0..n) (c:num->real) - S) < e / &3` THEN - DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; - ALL_TAC] THEN - REWRITE_TAC[GSYM REAL_SUB_LDISTRIB] THEN - SUBGOAL_THEN - `!j. sum(0..j) (\k. sum(0..k) (c:num->real) * (b(SUC k) - b k)) = - sum(0..j) (\k. S * (b(SUC k) - b k)) - - sum(0..j) (\k. (S - sum(0..k) c) * (b(SUC k) - b k))` - (fun th -> ONCE_REWRITE_TAC[th]) THENL - [GEN_TAC THEN REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN - MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN - REAL_ARITH_TAC; + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_liminf (\n. (X:num->A->real) n x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_LBOUND THEN + EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LIMINF_LE_LIMSUP THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]]; + MATCH_MP_TAC REAL_LIMSUP_UBOUND THEN + EXISTS_TAC `A:real` THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Step 9: Pointwise limsup shift *) + SUBGOAL_THEN `!w:A. w IN prob_carrier p ==> + real_limsup (\n. (X:num->A->real) n w - A) = + real_limsup (\n. X n w) - A` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LIMSUP_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 10: nn_exp(limsup(X - A)) = exp(limsup(X)) - A *) + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x - A)) = + expectation p (\x. real_limsup (\n. X n x)) - A` ASSUME_TAC THENL + [SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. real_limsup (\n. (X:num->A->real) n x - A)) = + nn_expectation p (\x. real_limsup (\n. X n x) - A)` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN ASM_SIMP_TAC[]; ALL_TAC] THEN - REWRITE_TAC[SUM_LMUL] THEN - SUBGOAL_THEN `sum(0..j) (\k. b(SUC k) - b(k:num)) = b(SUC j) - b(0)` - SUBST1_TAC THENL - [REWRITE_TAC[ADD1; SUM_DIFFS_ALT; LE_0]; ALL_TAC] THEN - ABBREV_TAC `R = sum(0..j) (\k. (S - sum(0..k) (c:num->real)) * - (b(SUC k) - b(k)))` THEN - SUBGOAL_THEN `inv(b(SUC j)) * b(SUC j) = &1` ASSUME_TAC THENL - [ASM_SIMP_TAC[REAL_MUL_LINV]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < inv(b(SUC j))` ASSUME_TAC THENL - [ASM_SIMP_TAC[REAL_LT_INV]; ALL_TAC] THEN - (* Algebraic rearrangement: S - inv(b)*(S*(b-b0) - R) *) - (* = S - S + S*b0*inv(b) + inv(b)*R = S*b0*inv(b) + inv(b)*R *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(S:real) * b(0:num) * inv(b(SUC j)) + - inv(b(SUC j)) * abs(R:real)` THEN + CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. real_limsup (\n. (X:num->A->real) n x)`; + `\x:A. A:real`] EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_SUB_LDISTRIB] THEN - SUBGOAL_THEN `inv(b(SUC j)) * ((S:real) * b(SUC j)) = S` SUBST1_TAC THENL - [ONCE_REWRITE_TAC[REAL_ARITH `a * (s * b) = s * (a * b):real`] THEN - ASM_REWRITE_TAC[REAL_MUL_RID]; - ALL_TAC] THEN - REWRITE_TAC[REAL_ARITH `S - (S - x - y) = x + y:real`] THEN - MATCH_MP_TAC(REAL_ARITH - `abs(a + b) <= abs a + abs b /\ - abs a <= sa /\ abs b <= sb - ==> abs(a + b) <= sa + sb`) THEN - REWRITE_TAC[REAL_ABS_TRIANGLE] THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_ABS_MUL] THEN - ASM_SIMP_TAC[REAL_ARITH `&0 < x ==> abs x = x`; REAL_LT_INV] THEN - REAL_ARITH_TAC; - REWRITE_TAC[REAL_ABS_MUL] THEN - ASM_SIMP_TAC[REAL_ARITH `&0 < x ==> abs x = x`; REAL_LT_INV] THEN - REAL_ARITH_TAC]; - ALL_TAC] THEN - (* Bound |R| *) - SUBGOAL_THEN `abs(R:real) <= - (Cs + abs S) * b(SUC N1) + e / &3 * b(SUC j)` ASSUME_TAC THENL - [EXPAND_TAC "R" THEN + [MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `A <= f ==> &0 <= f - A`) THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..j) (\k. abs((S - sum(0..k) (c:num->real)) * - (b(SUC k) - b(k:num))))` THEN - CONJ_TAC THENL [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN - REWRITE_TAC[REAL_ABS_MUL] THEN - SUBGOAL_THEN `!k:num. abs(b(SUC k) - b k) = b(SUC k) - b k` - (fun th -> REWRITE_TAC[th]) THENL - [GEN_TAC THEN REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - ASM_CASES_TAC `N1 = 0` THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..j) (\k. e / &3 * (b(SUC k) - b(k:num)))` THEN + EXISTS_TAC `real_liminf (\n. (X:num->A->real) n x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_LBOUND THEN + EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LIMINF_LE_LIMSUP THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Final: combine *) + ASM_REAL_ARITH_TAC);; + +(* FATOU_EXPECTATION: Fatou's lemma for signed bounded random variables *) +let FATOU_EXPECTATION = prove + (`!p:A prob_space X A B. + (!n. random_variable p (X n)) /\ + (!n x. x IN prob_carrier p ==> A <= X n x) /\ + (!n x. x IN prob_carrier p ==> X n x <= B) + ==> expectation p (\x. real_liminf (\n. X n x)) + <= real_liminf (\n. expectation p (X n))`, + REPEAT STRIP_TAC THEN + (* Step 1: A <= B *) + SUBGOAL_THEN `A <= B:real` ASSUME_TAC THENL + [MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(X:num->A->real) 0 a` THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Step 2: All X_n integrable *) + SUBGOAL_THEN `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `max (abs A) (abs B)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `A <= f /\ f <= B ==> abs f <= max (abs A) (abs B)`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 3: Apply FATOU_NN_EXPECTATION to Y_n = X_n - A *) + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A)) + <= real_liminf (\n. nn_expectation p (\x. X n x - A))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. (X:num->A->real) n x - A`; `B - A:real`] + FATOU_NN_EXPECTATION) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Step 4: nn_exp(X_n - A) = exp(X_n) - A *) + SUBGOAL_THEN `!n:num. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A) = expectation p (X n) - A` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A) = + expectation p (\x. X n x - A)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `\x:A. A:real`] EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST]]; + ALL_TAC] THEN + (* Step 5: Bounds on exp(X_n) *) + SUBGOAL_THEN `!n:num. A <= expectation (p:A prob_space) + ((X:num->A->real) n) /\ expectation p (X n) <= B` ASSUME_TAC THENL + [GEN_TAC THEN CONJ_TAC THENL + [SUBGOAL_THEN `A = expectation (p:A prob_space) (\x:A. A:real)` + SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN ASM_SIMP_TAC[]]; + SUBGOAL_THEN `B = expectation (p:A prob_space) (\x:A. B:real)` + SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Step 6: RHS liminf shift *) + SUBGOAL_THEN `real_liminf (\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A)) = + real_liminf (\n. expectation p (X n)) - A` ASSUME_TAC THENL + [SUBGOAL_THEN `(\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A)) = + (\n. expectation p (X n) - A)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LIMINF_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN + ASM_REWRITE_TAC[GSYM FORALL_AND_THM]]; + ALL_TAC] THEN + (* Step 7: random_variable for liminf(X_n) *) + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x))` ASSUME_TAC THENL + [SUBGOAL_THEN `random_variable (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\n:num. \x:A. (X:num->A->real) n x - A`; `B - A:real`] + RANDOM_VARIABLE_REAL_LIMINF) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THENL - [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN - MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `abs(x - S) < e ==> abs(S - x) <= e`) THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; - REWRITE_TAC[SUM_LMUL; ADD1; SUM_DIFFS_ALT; LE_0; - REAL_SUB_LDISTRIB] THEN - MATCH_MP_TAC(REAL_ARITH - `&0 <= c * b + e * b0 - ==> e * b1 - e * b0 <= c * b + e * b1`) THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN - ASM_REWRITE_TAC[REAL_ABS_POS]; - REWRITE_TAC[REAL_ABS_POS]]; - ASM_SIMP_TAC[REAL_LT_IMP_LE]]; - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; - ASM_SIMP_TAC[REAL_LT_IMP_LE]]]]; - SUBGOAL_THEN `?N1'. N1 = SUC N1'` (X_CHOOSE_TAC `N1':num`) THENL - [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN - SUBGOAL_THEN `(N1':num) < j` ASSUME_TAC THENL - [UNDISCH_TAC `(N1:num) <= j` THEN - UNDISCH_TAC `N1 = SUC N1'` THEN - DISCH_THEN SUBST1_TAC THEN - REWRITE_TAC[LE_SUC_LT]; - ALL_TAC] THEN - MP_TAC(ISPECL - [`\k. abs(S - sum(0..k) (c:num->real)) * (b(SUC k) - b(k:num))`; - `0`; `N1':num`; `j:num`] SUM_COMBINE_R) THEN - ANTS_TAC THENL - [CONJ_TAC THENL [REWRITE_TAC[LE_0]; ASM_SIMP_TAC[LT_IMP_LE]]; - DISCH_THEN(SUBST1_TAC o SYM)] THEN - MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..N1') - (\k. (Cs + abs(S:real)) * (b(SUC k) - b(k:num)))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN - MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH - `abs(S - x) <= abs S + abs x /\ abs x <= C - ==> abs(S - x) <= C + abs S`) THEN - ASM_REWRITE_TAC[REAL_ABS_TRIANGLE_SUB]; - REWRITE_TAC[SUM_LMUL; ADD1; SUM_DIFFS_ALT; LE_0] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN - ASM_REWRITE_TAC[REAL_ABS_POS]; - REWRITE_TAC[REAL_ABS_POS]]; - MATCH_MP_TAC(REAL_ARITH - `&0 < z /\ x <= y ==> x - z <= y`) THEN - CONJ_TAC THENL - [ASM_MESON_TAC[]; - UNDISCH_TAC `N1 = SUC N1'` THEN DISCH_THEN SUBST1_TAC THEN - REWRITE_TAC[ADD1] THEN ASM_MESON_TAC[]]]]; - SUBGOAL_THEN - `sum(N1' + 1..j) - (\k. abs(S - sum(0..k) (c:num->real)) * (b(SUC k) - b(k:num))) - <= sum(N1' + 1..j) (\k. e / &3 * (b(SUC k) - b(k:num)))` MP_TAC THENL - [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN - MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `abs(x - S) < e ==> abs(S - x) <= e`) THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN - UNDISCH_TAC `N1 = SUC N1'` THEN DISCH_THEN SUBST1_TAC THEN - REWRITE_TAC[ADD1] THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN - `sum(N1' + 1..j) (\k. e / &3 * (b(SUC k) - b(k:num))) - <= e / &3 * (b:num->real)(SUC j)` MP_TAC THENL - [REWRITE_TAC[SUM_LMUL] THEN - SUBGOAL_THEN `sum(N1' + 1..j) (\k. b(SUC k) - b(k:num)) = - b(SUC j) - b(N1' + 1)` - SUBST1_TAC THENL - [REWRITE_TAC[ADD1; SUM_DIFFS_ALT] THEN - ASM_SIMP_TAC[ARITH_RULE `m < n ==> m + 1 <= n`]; - MATCH_MP_TAC REAL_LE_LMUL THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; REAL_LT_IMP_LE] THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> b - x <= b`) THEN - ASM_SIMP_TAC[REAL_LT_IMP_LE]]; - ALL_TAC] THEN - REAL_ARITH_TAC]]; - ALL_TAC] THEN - (* Now bound the total *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(S:real) * b(0:num) * inv(b(SUC j)) + - inv(b(SUC j)) * ((Cs + abs S) * b(SUC N1) + - e / &3 * b(SUC j))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC REAL_LE_LMUL THEN - ASM_SIMP_TAC[REAL_LT_IMP_LE]]; - ALL_TAC] THEN - REWRITE_TAC[REAL_ADD_LDISTRIB] THEN - SUBGOAL_THEN `inv(b(SUC j)) * (e / &3 * b(SUC j)) = e / &3` - SUBST1_TAC THENL - [ONCE_REWRITE_TAC[REAL_ARITH `a * (b * c) = b * (a * c):real`] THEN - ASM_REWRITE_TAC[REAL_MUL_RID]; + [SUBGOAL_THEN `(\x:A. (X:num->A->real) n x) = X n` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> A <= (X:num->A->real) n x` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `!n:num (x:A). x IN prob_carrier p + ==> (X:num->A->real) n x <= B` THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; ALL_TAC] THEN - ONCE_REWRITE_TAC[REAL_ADD_ASSOC] THEN - MATCH_MP_TAC(REAL_ARITH `x < e3 ==> x + e3 <= &2 * e3`) THEN + REWRITE_TAC[random_variable] THEN GEN_TAC THEN SUBGOAL_THEN - `abs(S:real) * b(0:num) * inv(b(SUC j)) + - inv(b(SUC j)) * (Cs + abs S) * b(SUC N1) = - ((Cs + abs S) * b(SUC N1) + abs S * b(0:num)) * inv(b(SUC j))` + `{x:A | x IN prob_carrier p /\ + real_liminf (\n. (X:num->A->real) n x) <= a} = + {x | x IN prob_carrier p /\ + real_liminf (\n. X n x - A) <= a - A}` SUBST1_TAC THENL - [REWRITE_TAC[REAL_ADD_RDISTRIB] THEN - ONCE_REWRITE_TAC[REAL_ARITH `(a * b) * c = a * (b * c):real`] THEN - REAL_ARITH_TAC; - ALL_TAC] THEN - ABBREV_TAC `X = (Cs + abs(S:real)) * b(SUC N1) + abs S * b(0:num)` THEN - SUBGOAL_THEN `&0 <= X` ASSUME_TAC THENL - [EXPAND_TAC "X" THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN - CONJ_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN - ASM_SIMP_TAC[REAL_ABS_POS; REAL_LT_IMP_LE] THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `real_liminf (\n. (X:num->A->real) n w - A) = + real_liminf (\n. X n w) - A` SUBST1_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + REAL_ARITH_TAC]; + UNDISCH_TAC `random_variable (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A))` THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(fun th -> REWRITE_TAC[SPEC `a - A:real` th])]; + ALL_TAC] THEN + (* Step 8: Integrability of liminf(X_n) *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `max (abs A) (abs B)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `A <= f /\ f <= B ==> abs f <= max (abs A) (abs B)`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LIMINF_LBOUND THEN + EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_limsup (\n. (X:num->A->real) n x)` THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN - ASM_REWRITE_TAC[REAL_ABS_POS]; - REWRITE_TAC[REAL_ABS_POS]]; + [MATCH_MP_TAC REAL_LIMINF_LE_LIMSUP THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LIMSUP_UBOUND THEN + EXISTS_TAC `A:real` THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Step 9: Pointwise liminf shift *) + SUBGOAL_THEN `!w:A. w IN prob_carrier p ==> + real_liminf (\n. (X:num->A->real) n w - A) = + real_liminf (\n. X n w) - A` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LIMINF_SUB_CONST THEN + EXISTS_TAC `A:real` THEN EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 10: nn_exp(liminf(X - A)) = exp(liminf(X)) - A *) + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A)) = + expectation p (\x. real_liminf (\n. X n x)) - A` ASSUME_TAC THENL + [SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A)) = + nn_expectation p (\x. real_liminf (\n. X n x) - A)` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN ASM_SIMP_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `D <= b(SUC j)` ASSUME_TAC THENL - [UNDISCH_TAC `!n:num. N2 <= n ==> D <= b n` THEN - DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN - UNDISCH_TAC `N2 <= SUC j` THEN SIMP_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `&0 < D` ASSUME_TAC THENL - [EXPAND_TAC "D" THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN - MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_DIV THEN - ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_OF_NUM_LE; ARITH_RULE `0 <= 3`]; - ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `X * inv(D:real)` THEN + CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. real_liminf (\n. (X:num->A->real) n x)`; + `\x:A. A:real`] EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - REWRITE_TAC[GSYM real_div] THEN ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN - SUBGOAL_THEN `(e / &3) * D = X + e / &3` SUBST1_TAC THENL - [EXPAND_TAC "D" THEN EXPAND_TAC "X" THEN - MATCH_MP_TAC(REAL_FIELD `~(e = &0) ==> - (e / &3) * ((&3 / e) * x + &1) = x + e / &3`) THEN - ASM_MESON_TAC[REAL_LT_IMP_NZ]; - MATCH_MP_TAC(REAL_ARITH `&0 < t ==> x < x + t`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]]);; + [MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `A <= f ==> &0 <= f - A`) THEN + MATCH_MP_TAC REAL_LIMINF_LBOUND THEN + EXISTS_TAC `B:real` THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Final: chain nn_exp(liminf(X-A)) <= liminf(nn_exp(X-A)) with shifts *) + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. real_liminf (\n. (X:num->A->real) n x)) - A + <= real_liminf (\n. expectation p (X n)) - A` + (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_liminf (\n. nn_expectation (p:A prob_space) + (\x. (X:num->A->real) n x - A))` THEN + CONJ_TAC THENL + [ONCE_REWRITE_TAC[GSYM(ASSUME `nn_expectation (p:A prob_space) + (\x. real_liminf (\n. (X:num->A->real) n x - A)) = + expectation p (\x. real_liminf (\n. X n x)) - A`)] THEN + ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[REAL_LE_REFL]]);; + +(* If liminf_events A = limsup_events A = E, then P(A_n) --> P(E) *) +let PROB_CONVERGENCE_EVENTS = prove + (`!p:A prob_space A E. + (!n. A n IN prob_events p) /\ + liminf_events A = E /\ limsup_events A = E + ==> ((\n. prob p (A n)) ---> prob p E) sequentially`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(ISPECL [`\n:num. prob (p:A prob_space) ((A:num->A->bool) n)`; + `&0`; `&1`; `prob (p:A prob_space) (E:A->bool)`] + REAL_LIMINF_LIMSUP_CONVERGES) THEN + BETA_TAC THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN MATCH_MP_TAC PROB_LE_1 THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`p:A prob_space`; `A:num->A->bool`] + FATOU_EVENTS_LIMINF) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + MP_TAC(ISPECL [`p:A prob_space`; `A:num->A->bool`] + FATOU_EVENTS_LIMSUP) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; (* ========================================================================= *) -(* Scheffe's lemma (L1 convergence) *) +(* Convergence mode relationships *) (* ========================================================================= *) -let REAL_MIN_REFL = REAL_ARITH `!x. min x x = x`;; - -let REALLIM_MIN_CONST = prove - (`!f L c. (f ---> L) sequentially - ==> ((\n. min (f n) c) ---> min L c) sequentially`, - REPEAT STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - EXISTS_TAC `N:num` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[real_min] THEN REAL_ARITH_TAC);; - -let SIMPLE_RV_UPPER_BOUND = prove - (`!p:A prob_space f. simple_rv p f ==> - ?M. !x. x IN prob_carrier p ==> f x <= M`, +(* limsup of "bad" events is contained in the complement of the + convergence set *) +let LIMSUP_BAD_SUBSET_COMPL_CONV = prove + (`!p:A prob_space (X:num->A->real) (L:A->real) e. + &0 < e ==> + limsup_events + (\n. {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e}) + SUBSET + prob_carrier p DIFF + {x | x IN prob_carrier p /\ + ((\n. X n x) ---> L x) sequentially}`, REPEAT STRIP_TAC THEN - MP_TAC(SPECL [`p:A prob_space`; `f:A->real`] SIMPLE_RV_BOUNDED) THEN - ASM_REWRITE_TAC[] THEN STRIP_TAC THEN - EXISTS_TAC `M:real` THEN REPEAT STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH `abs x <= M ==> x <= M`) THEN - ASM_SIMP_TAC[]);; + REWRITE_TAC[LIMSUP_EVENTS_ALT; SUBSET; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0`) THEN + STRIP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[BETA_THM] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + UNDISCH_TAC `!m. ?n. n >= m /\ (w:A) IN prob_carrier p /\ + abs((X:num->A->real) n w - (L:A->real) w) >= e` THEN + DISCH_THEN(MP_TAC o SPEC `N:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `abs((X:num->A->real) n w - (L:A->real) w) < e` + MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN + UNDISCH_TAC `n:num >= N` THEN REWRITE_TAC[GE]; + ASM_REAL_ARITH_TAC]]);; -let NN_EXPECTATION_MIN_LIMIT = prove - (`!p:A prob_space f. - (!x. x IN prob_carrier p ==> &0 <= f x) /\ - integrable p f - ==> ((\n. nn_expectation p (\x. min (f x) (&n))) ---> - nn_expectation p f) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN - DISCH_TAC THEN - SUBGOAL_THEN `!m n. m <= n ==> - nn_expectation (p:A prob_space) (\x:A. min ((f:A->real) x) (&m)) <= - nn_expectation p (\x. min (f x) (&n))` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN MATCH_MP_TAC BOUNDED_NN_EXPECTATION_MONO THEN - BETA_TAC THEN REPEAT CONJ_TAC THENL - [GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `a <= b ==> min x a <= min x b`) THEN - ASM_REWRITE_TAC[REAL_OF_NUM_LE]; - EXISTS_TAC `&n` THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; +(* Almost sure convergence implies convergence in probability *) +let ALMOST_SURE_IMP_IN_PROB = prove + (`!p:A prob_space (X:num->A->real) (L:A->real). + (!n:num e. &0 < e ==> + {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e} + IN prob_events p) /\ + {x:A | x IN prob_carrier p /\ + ((\n. X n x) ---> L x) sequentially} IN prob_events p /\ + converges_as p X L + ==> converges_in_prob p X L`, + REPEAT GEN_TAC THEN + REWRITE_TAC[converges_as; converges_in_prob] THEN + STRIP_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN + ABBREV_TAC `B = \n:num. + {x:A | x IN prob_carrier p /\ abs(X n x - L x) >= e}` THEN + SUBGOAL_THEN `!n. (B:num->A->bool) n IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "B" THEN REWRITE_TAC[] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `!n. nn_expectation (p:A prob_space) (\x:A. min ((f:A->real) x) (&n)) <= - nn_expectation p f` ASSUME_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN - BETA_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN - ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; - GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN - MP_TAC(SPECL [`p:A prob_space`; `f:A->real`] INTEGRABLE_NONNEG_NN_BOUNDED) THEN - ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Bf:real`) THEN - SUBGOAL_THEN `nn_expectation (p:A prob_space) (f:A->real) - e < - nn_expectation p f` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MP_TAC(ISPECL [`{simple_expectation (p:A prob_space) g | g | - simple_rv p g /\ (!x:A. x IN prob_carrier p ==> &0 <= g x) /\ - (!x. x IN prob_carrier p ==> g x <= (f:A->real) x)}`; - `nn_expectation (p:A prob_space) (f:A->real) - e`] SUP_APPROACH) THEN - REWRITE_TAC[GSYM nn_expectation] THEN - ANTS_TAC THENL - [CONJ_TAC THENL - [MATCH_MP_TAC NN_EXPECT_SET_NONEMPTY THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - CONJ_TAC THENL - [EXISTS_TAC `Bf:real` THEN REWRITE_TAC[IN_ELIM_THM] THEN - GEN_TAC THEN DISCH_THEN(X_CHOOSE_THEN `h:A->real` STRIP_ASSUME_TAC) THEN - ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; - ASM_REAL_ARITH_TAC]; ALL_TAC] THEN - REWRITE_TAC[IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_THEN `v:real` MP_TAC) THEN - DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN - DISCH_THEN(X_CHOOSE_THEN `g:A->real` STRIP_ASSUME_TAC) THEN - MP_TAC(SPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_UPPER_BOUND) THEN - ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Mg:real`) THEN - MP_TAC(SPEC `Mg:real` REAL_ARCH_SIMPLE) THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - SUBGOAL_THEN `simple_expectation (p:A prob_space) (g:A->real) <= - nn_expectation p (\x:A. min ((f:A->real) x) (&n))` ASSUME_TAC THENL - [MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN ASM_REWRITE_TAC[] THEN - CONJ_TAC THENL - [GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL - [ASM_SIMP_TAC[]; - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `Mg:real` THEN - ASM_SIMP_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `&N` THEN ASM_REWRITE_TAC[REAL_OF_NUM_LE]]; - EXISTS_TAC `&n` THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + (* D_m = UNIONS{B_n | n >= m} is decreasing *) + ABBREV_TAC `DD = \m:num. UNIONS {(B:num->A->bool) n | n >= m}` THEN + SUBGOAL_THEN `!m. (DD:num->A->bool) m IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "DD" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC TAIL_UNION_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN - UNDISCH_TAC `v = simple_expectation (p:A prob_space) (g:A->real)` THEN - ASM_REAL_ARITH_TAC);; - -let EXPECTATION_NONNEG_EQ_NN = prove - (`!p:A prob_space (f:A->real). - integrable p f /\ - (!x. x IN prob_carrier p ==> &0 <= f x) - ==> expectation p f = nn_expectation p f`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[expectation] THEN - SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max ((f:A->real) x) (&0)) = - nn_expectation p f` SUBST1_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= f ==> max f (&0) = f`) THEN ASM_SIMP_TAC[]; + SUBGOAL_THEN `!m. (DD:num->A->bool) (SUC m) SUBSET DD m` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "DD" THEN REWRITE_TAC[] THEN + REWRITE_TAC[TAIL_UNION_DECREASING]; ALL_TAC] THEN - SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max (--((f:A->real) x)) (&0)) = &0` - (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN - SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x. max (--((f:A->real) x)) (&0)) = - nn_expectation p (\x:A. &0)` SUBST1_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= f ==> max (--f) (&0) = &0`) THEN ASM_SIMP_TAC[]; + (* limsup_events B = INTERS{DD_m} *) + SUBGOAL_THEN `limsup_events (B:num->A->bool) = + INTERS {DD m | m IN (:num)}` ASSUME_TAC THENL + [EXPAND_TAC "DD" THEN EXPAND_TAC "B" THEN REWRITE_TAC[limsup_events]; ALL_TAC] THEN - MP_TAC(ISPECL [`p:A prob_space`; `(\x:A. &0):A->real`] NN_EXPECTATION_SIMPLE) THEN - REWRITE_TAC[SIMPLE_RV_CONST; REAL_LE_REFL; SIMPLE_EXPECTATION_CONST]);; - -let SCHEFFE_LEMMA = prove - (`!p:A prob_space X f. - (!n. integrable p (X n)) /\ - integrable p f /\ - (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ - (!x. x IN prob_carrier p ==> &0 <= f x) /\ - (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) /\ - ((\n. nn_expectation p (X n)) ---> nn_expectation p f) sequentially - ==> ((\n. nn_expectation p (\x. abs(X n x - f x))) ---> &0) sequentially`, - REPEAT STRIP_TAC THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - (* Integrability of min(X_n, f) *) - SUBGOAL_THEN - `!n:num. integrable (p:A prob_space) - (\x. min ((X:num->A->real) n x) ((f:A->real) x))` + (* P(limsup B) = 0 *) + SUBGOAL_THEN `prob p (limsup_events (B:num->A->bool)) = &0` ASSUME_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `(f:A->real)` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - CONJ_TAC THEN REWRITE_TAC[ETA_AX] THENL - [UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN - DISCH_THEN(MP_TAC o SPEC `n:num`) THEN - REWRITE_TAC[integrable] THEN STRIP_TAC; - UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN - REWRITE_TAC[integrable] THEN STRIP_TAC]; - REPEAT STRIP_TAC THEN - SUBGOAL_THEN `&0 <= (X:num->A->real) n x /\ &0 <= (f:A->real) x` - MP_TAC THENL - [ASM_MESON_TAC[]; REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]]; - ALL_TAC] THEN - (* Algebraic identity via signed expectation linearity *) - SUBGOAL_THEN - `!n:num. nn_expectation (p:A prob_space) - (\x. abs((X:num->A->real) n x - (f:A->real) x)) = - nn_expectation p (X n) + nn_expectation p f - - &2 * nn_expectation p (\x. min (X n x) (f x))` - ASSUME_TAC THENL - [GEN_TAC THEN - SUBGOAL_THEN - `integrable (p:A prob_space) - (\x. abs((X:num->A->real) n x - (f:A->real) x))` - ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `\x:A. abs((X:num->A->real) n x) + abs((f:A->real) x)` THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN - DISCH_THEN(MP_TAC o SPEC `n:num`) THEN - UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN - REWRITE_TAC[integrable] THEN REPEAT STRIP_TAC THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THEN - MATCH_MP_TAC INTEGRABLE_ABS THEN - ASM_REWRITE_TAC[] THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - REWRITE_TAC[] THEN REAL_ARITH_TAC]; - ALL_TAC] THEN - SUBGOAL_THEN - `!x:A. x IN prob_carrier p - ==> &0 <= min ((X:num->A->real) n x) ((f:A->real) x)` - ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; - ALL_TAC] THEN - ASM_SIMP_TAC[GSYM EXPECTATION_NONNEG_EQ_NN; REAL_ABS_POS] THEN - SUBGOAL_THEN - `expectation (p:A prob_space) - (\x. abs((X:num->A->real) n x - (f:A->real) x)) = - expectation p (\x. (X n x + f x) - &2 * min (X n x) (f x))` - SUBST1_TAC THENL - [MATCH_MP_TAC EXPECTATION_EXT THEN REPEAT STRIP_TAC THEN - SUBGOAL_THEN `&0 <= (X:num->A->real) n x /\ &0 <= (f:A->real) x` - MP_TAC THENL - [ASM_MESON_TAC[]; REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]; - ALL_TAC] THEN - SUBGOAL_THEN - `integrable (p:A prob_space) - (\x. &2 * min ((X:num->A->real) n x) ((f:A->real) x))` - ASSUME_TAC THENL - [SUBGOAL_THEN - `(\x. &2 * min ((X:num->A->real) n x) ((f:A->real) x)) = - (\x. min (X n x) (f x) + min (X n x) (f x))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; - MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN - `integrable (p:A prob_space) - (\x. (X:num->A->real) n x + (f:A->real) x)` - ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + [MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - ASM_SIMP_TAC[EXPECTATION_SUB] THEN - ASM_SIMP_TAC[EXPECTATION_ADD; ETA_AX] THEN - ASM_SIMP_TAC[EXPECTATION_CMUL] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - ASM_REWRITE_TAC[] THEN - (* Extract random_variable facts from integrable *) - SUBGOAL_THEN - `random_variable (p:A prob_space) (f:A->real) /\ - (!n:num. random_variable p ((X:num->A->real) n))` - STRIP_ASSUME_TAC THENL - [CONJ_TAC THENL - [UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN - REWRITE_TAC[integrable] THEN STRIP_TAC; - GEN_TAC THEN - UNDISCH_TAC `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` THEN - DISCH_THEN(MP_TAC o SPEC `n:num`) THEN - REWRITE_TAC[integrable] THEN STRIP_TAC]; - ALL_TAC] THEN - (* Get M from truncation convergence *) - MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`] NN_EXPECTATION_MIN_LIMIT) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN - (* Get N1 from bounded convergence for min(min(X_n, f), &M) *) - MP_TAC(ISPECL - [`p:A prob_space`; - `\n:num. \(x:A). min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)`; - `\(x:A). min ((f:A->real) x) (&M)`; - `&M`] BOUNDED_CONVERGENCE_NN) THEN - REWRITE_TAC[] THEN ANTS_TAC THENL - [REPEAT CONJ_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN - MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN REWRITE_TAC[ETA_AX] THEN - ASM_REWRITE_TAC[]; - MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX] THEN ASM_REWRITE_TAC[]; - REPEAT GEN_TAC THEN DISCH_TAC THEN - REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN ASM_MESON_TAC[]; - REPEAT GEN_TAC THEN DISCH_TAC THEN - REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN ASM_MESON_TAC[]; - REPEAT GEN_TAC THEN DISCH_TAC THEN - REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC; - REPEAT GEN_TAC THEN DISCH_TAC THEN - REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC; - REPEAT STRIP_TAC THEN - MP_TAC(ISPECL - [`\n:num. min ((X:num->A->real) n (x:A)) ((f:A->real) x)`; - `min ((f:A->real) (x:A)) (f x)`; `&M`] REALLIM_MIN_CONST) THEN - REWRITE_TAC[REAL_MIN_REFL] THEN DISCH_THEN MATCH_MP_TAC THEN - MP_TAC(ISPECL - [`\n:num. (X:num->A->real) n (x:A)`; - `(f:A->real) (x:A)`; `(f:A->real) (x:A)`] REALLIM_MIN_CONST) THEN - REWRITE_TAC[REAL_MIN_REFL] THEN DISCH_THEN MATCH_MP_TAC THEN - ASM_MESON_TAC[]]; + (* limsup B SUBSET carrier DIFF {convergence set} *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob p (prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ + ((\n. (X:num->A->real) n x) ---> L x) sequentially})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC LIMSUP_BAD_SUBSET_COMPL_CONV THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[PROB_COMPL] THEN ASM_REAL_ARITH_TAC]; ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN - (* Get N2 from E[X_n] -> E[f] *) - FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN - (* Combine: N = max(N1, N2) *) - EXISTS_TAC `MAX N1 N2` THEN - REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN - (* Monotonicity: nn_exp(min(X_n, f)) <= nn_exp(f) *) + (* P(DD_m) --> P(limsup B) via continuity from above *) SUBGOAL_THEN - `nn_expectation (p:A prob_space) - (\x. min ((X:num->A->real) n x) ((f:A->real) x)) <= - nn_expectation p f` + `((\m. prob p ((DD:num->A->bool) m)) ---> + prob p (limsup_events (B:num->A->bool))) sequentially` ASSUME_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_MONO THEN REWRITE_TAC[] THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; - REPEAT STRIP_TAC THEN - REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC]; + [SUBGOAL_THEN `limsup_events (B:num->A->bool) = + INTERS {(DD:num->A->bool) m | m IN (:num)}` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_CONTINUITY_FROM_ABOVE THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN - (* Monotonicity: nn_exp(min(min(X_n,f),&M)) <= nn_exp(min(X_n,f)) *) - SUBGOAL_THEN - `nn_expectation (p:A prob_space) - (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) <= - nn_expectation p (\x. min (X n x) (f x))` + (* P(DD_m) --> 0 *) + SUBGOAL_THEN `((\m. prob p ((DD:num->A->bool) m)) ---> &0) sequentially` ASSUME_TAC THENL - [MATCH_MP_TAC NN_EXPECTATION_MONO THEN REWRITE_TAC[] THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN - ASM_MESON_TAC[]; - CONJ_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; - REPEAT STRIP_TAC THEN - REWRITE_TAC[REAL_MIN_LE] THEN DISJ1_TAC THEN REAL_ARITH_TAC]]; + [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Rewrite goal in terms of B *) + SUBGOAL_THEN `(\n. prob p {x:A | x IN prob_carrier p /\ + abs ((X:num->A->real) n x - (L:A->real) x) >= e}) = + (\n. prob p ((B:num->A->bool) n))` SUBST1_TAC THENL + [EXPAND_TAC "B" THEN REWRITE_TAC[]; ALL_TAC] THEN - (* Instantiate all epsilon bounds *) - SUBGOAL_THEN `N1 <= (n:num) /\ N2 <= n` STRIP_ASSUME_TAC THENL - [UNDISCH_TAC `MAX N1 N2 <= n` THEN ARITH_TAC; ALL_TAC] THEN - FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN - DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN - DISCH_TAC THEN - UNDISCH_TAC - `!n. M <= n ==> - abs(nn_expectation (p:A prob_space) - (\x. min ((f:A->real) x) (&n)) - - nn_expectation p f) < e / &6` THEN - DISCH_THEN(MP_TAC o SPEC `M:num`) THEN REWRITE_TAC[LE_REFL] THEN - DISCH_TAC THEN - (* Final arithmetic *) - UNDISCH_TAC - `nn_expectation (p:A prob_space) - (\x. min ((X:num->A->real) n x) ((f:A->real) x)) <= - nn_expectation p f` THEN - UNDISCH_TAC - `nn_expectation (p:A prob_space) - (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) <= - nn_expectation p (\x. min (X n x) (f x))` THEN - UNDISCH_TAC - `abs(nn_expectation (p:A prob_space) ((X:num->A->real) n) - - nn_expectation p (f:A->real)) < e / &3` THEN - UNDISCH_TAC - `abs(nn_expectation (p:A prob_space) - (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) - - nn_expectation p (\x. min (f x) (&M))) < e / &6` THEN - UNDISCH_TAC - `abs(nn_expectation (p:A prob_space) - (\x. min ((f:A->real) x) (&M)) - - nn_expectation p f) < e / &6` THEN - REAL_ARITH_TAC);; - -(* ========================================================================= *) -(* Dominated convergence theorem *) -(* ========================================================================= *) - -let INTEGRABLE_MAX = prove - (`!p:A prob_space f g. - integrable p f /\ integrable p g - ==> integrable p (\x. max (f x) (g x))`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `\x:A. abs((f:A->real) x) + abs((g:A->real) x)` THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN ASM_MESON_TAC[integrable]; - MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_SIMP_TAC[INTEGRABLE_ABS]; - REWRITE_TAC[real_max] THEN REAL_ARITH_TAC]);; - -let INTEGRABLE_MIN = prove - (`!p:A prob_space f g. - integrable p f /\ integrable p g - ==> integrable p (\x. min (f x) (g x))`, - REPEAT STRIP_TAC THEN - MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `\x:A. abs((f:A->real) x) + abs((g:A->real) x)` THEN + (* Squeeze: 0 <= P(B_n) <= P(DD_n) --> 0 *) + MATCH_MP_TAC(ISPECL [`\n:num. &0`; + `\n:num. prob p ((B:num->A->bool) n)`; + `\m:num. prob p ((DD:num->A->bool) m)`; `&0`] + REALLIM_TRANSFORM_STRADDLE) THEN BETA_TAC THEN REPEAT CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN ASM_MESON_TAC[integrable]; - MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_SIMP_TAC[INTEGRABLE_ABS]; - REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]);; - -(* Probability of tail events for pointwise convergent bounded sequences *) -let PROB_POINTWISE_TAIL_VANISHES = prove - (`!p:A prob_space (f:num->A->real) (g:A->real) M d. - (!n. random_variable p (f n)) /\ - random_variable p g /\ - (!n x. x IN prob_carrier p ==> abs(f n x) <= M) /\ - (!x. x IN prob_carrier p ==> abs(g x) <= M) /\ - (!x. x IN prob_carrier p ==> ((\n. f n x) ---> g x) sequentially) /\ - &0 < d - ==> ((\n. prob p {x | x IN prob_carrier p /\ abs(f n x - g x) >= d}) - ---> &0) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN - EXISTS_TAC `\n:num. prob (p:A prob_space) - (UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ - abs((f:num->A->real) k x - (g:A->real) x) >= d}) {k:num | n <= k}))` THEN - CONJ_TAC THENL - [(* Eventually bound: abs(prob S_n) <= prob B_n *) - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN BETA_TAC THEN - SUBGOAL_THEN - `{x:A | x IN prob_carrier p /\ - abs((f:num->A->real) n x - (g:A->real) x) >= d} - IN prob_events (p:A prob_space)` ASSUME_TAC THENL - [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN - MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - ALL_TAC] THEN - SUBGOAL_THEN - `UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ - abs((f:num->A->real) k x - (g:A->real) x) >= d}) - {k:num | n <= k}) IN prob_events (p:A prob_space)` ASSUME_TAC THENL - [MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN - X_GEN_TAC `k:num` THEN DISCH_TAC THEN - MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN - MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[COUNTABLE_SUBSET_NUM]]; - ALL_TAC] THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN - CONJ_TAC THENL - [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN - REWRITE_TAC[SUBSET; IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN - X_GEN_TAC `y:A` THEN STRIP_TAC THEN - EXISTS_TAC `{x:A | x IN prob_carrier p /\ - abs((f:num->A->real) n x - (g:A->real) x) >= d}` THEN - CONJ_TAC THENL - [EXISTS_TAC `n:num` THEN REWRITE_TAC[LE_REFL] THEN SET_TAC[]; - ASM_REWRITE_TAC[IN_ELIM_THM]]; - ALL_TAC] THEN - (* Limit: prob(B_n) --> 0 *) - ABBREV_TAC `B = \n:num. UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ - abs((f:num->A->real) k x - (g:A->real) x) >= d}) {k:num | n <= k})` THEN - SUBGOAL_THEN `(\n. prob (p:A prob_space) - (UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ - abs((f:num->A->real) k x - (g:A->real) x) >= d}) - {k:num | n <= k}))) = (\n. prob p (B n))` SUBST1_TAC THENL - [ASM_REWRITE_TAC[FUN_EQ_THM] THEN - POP_ASSUM(fun th -> REWRITE_TAC[GSYM th]) THEN - BETA_TAC THEN REWRITE_TAC[]; - ALL_TAC] THEN - SUBGOAL_THEN `!n. (B:num->A->bool) n IN prob_events (p:A prob_space)` + EXPAND_TAC "DD" THEN REWRITE_TAC[SUBSET; IN_UNIONS; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + EXISTS_TAC `(B:num->A->bool) n` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `n:num` THEN REWRITE_TAC[GE; LE_REFL]; + ASM_REWRITE_TAC[]]);; + +(* L2 convergence implies convergence in probability *) +let L2_IMP_IN_PROB = prove + (`!p:A prob_space (X:num->A->real) (L:A->real). + (!n. simple_rv p (X n)) /\ simple_rv p L /\ + simple_converges_L2 p X L + ==> converges_in_prob p X L`, + REPEAT GEN_TAC THEN + REWRITE_TAC[simple_converges_L2; converges_in_prob] THEN + STRIP_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* P(|X_n - L| >= e) <= E[(X_n - L)^2] / e^2 by Markov *) + SUBGOAL_THEN `!n. prob p {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e} <= + simple_expectation p (\x. (X n x - L x) pow 2) / e pow 2` ASSUME_TAC THENL [GEN_TAC THEN - FIRST_X_ASSUM(fun th -> REWRITE_TAC[GSYM th]) THEN BETA_TAC THEN - MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN - X_GEN_TAC `k:num` THEN DISCH_TAC THEN - MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN - MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[COUNTABLE_SUBSET_NUM]]; - ALL_TAC] THEN - SUBGOAL_THEN `!n. (B:num->A->bool) (SUC n) SUBSET B n` ASSUME_TAC THENL - [GEN_TAC THEN - SUBGOAL_THEN `(B:num->A->bool) n = UNIONS (IMAGE (\k. {x:A | x IN - prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) - {k:num | n <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `(B:num->A->bool) (SUC n) = UNIONS (IMAGE (\k. {x:A | x IN - prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) - {k:num | SUC n <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC SUBSET_UNIONS THEN MATCH_MP_TAC IMAGE_SUBSET THEN - REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ARITH_TAC; - ALL_TAC] THEN - MP_TAC(ISPECL [`p:A prob_space`; `B:num->A->bool`] - PROB_CONTINUITY_FROM_ABOVE) THEN - ASM_REWRITE_TAC[] THEN DISCH_TAC THEN - SUBGOAL_THEN `INTERS {(B:num->A->bool) n | n IN (:num)} = {}` - (fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THENL - [REWRITE_TAC[EXTENSION; NOT_IN_EMPTY] THEN X_GEN_TAC `y:A` THEN - REWRITE_TAC[IN_INTERS] THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN - DISCH_TAC THEN - SUBGOAL_THEN `(y:A) IN prob_carrier (p:A prob_space)` ASSUME_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `(B:num->A->bool) 0`] - PROB_EVENT_SUBSET) THEN - ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUBSET] THEN - DISCH_THEN MATCH_MP_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `(B:num->A->bool) 0`) THEN - ANTS_TAC THENL [EXISTS_TAC `0` THEN REFL_TAC; SIMP_TAC[]]; - ALL_TAC] THEN - SUBGOAL_THEN - `((\n. (f:num->A->real) n (y:A)) ---> (g:A->real) y) sequentially` - MP_TAC THENL - [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `d:real`) THEN ASM_REWRITE_TAC[] THEN - STRIP_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `(B:num->A->bool) N`) THEN - ANTS_TAC THENL [EXISTS_TAC `N:num` THEN REFL_TAC; ALL_TAC] THEN - SUBGOAL_THEN `(B:num->A->bool) N = UNIONS (IMAGE (\k. {x:A | x IN - prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) - {k:num | N <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN - REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN - DISCH_THEN(X_CHOOSE_THEN `t:A->bool` STRIP_ASSUME_TAC) THEN - FIRST_X_ASSUM SUBST_ALL_TAC THEN - FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN - STRIP_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPEC `x:num`) THEN ASM_REWRITE_TAC[] THEN - ASM_REAL_ARITH_TAC; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e} = + {x | x IN prob_carrier p /\ (X n x - L x) pow 2 >= e pow 2}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `a:A` THEN + ASM_CASES_TAC `(a:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge; GSYM REAL_LE_SQUARE_ABS] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 < e ==> abs e = e`]; + MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_SQUARE THEN + MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + CONJ_TAC THENL + [X_GEN_TAC `a:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + ASM_SIMP_TAC[REAL_POW_LT]]]]; ALL_TAC] THEN - RULE_ASSUM_TAC(REWRITE_RULE[PROB_EMPTY]) THEN ASM_REWRITE_TAC[]);; + (* Squeeze: 0 <= P(...) <= E[...]/e^2 --> 0 *) + MATCH_MP_TAC(ISPECL [`\n:num. &0`; + `\n:num. prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e}`; + `\n:num. simple_expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / e pow 2`; + `&0`] REALLIM_TRANSFORM_STRADDLE) THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [(* 0 <= prob(...) eventually *) + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (L:A->real) x))` MP_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN + MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + REWRITE_TAC[simple_rv] THEN MESON_TAC[]]; + (* (\n. &0) ---> &0 *) + REWRITE_TAC[REALLIM_CONST]; + (* prob(...) <= E[...]/e^2 eventually *) + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + (* E[(X_n - L)^2]/e^2 --> 0 *) + SUBGOAL_THEN `(\n. simple_expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / e pow 2) = + (\n. inv(e pow 2) * simple_expectation p + (\x. (X n x - L x) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN + SUBGOAL_THEN `&0 = inv(e pow 2) * &0` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; -(* Bounded convergence theorem for expectations *) -let BOUNDED_CONVERGENCE_EXPECTATION = prove - (`!p:A prob_space (f:num->A->real) (g:A->real) M. - (!n. random_variable p (f n)) /\ - random_variable p g /\ - (!n x. x IN prob_carrier p ==> abs(f n x) <= M) /\ - (!x. x IN prob_carrier p ==> abs(g x) <= M) /\ - (!x. x IN prob_carrier p ==> ((\n. f n x) ---> g x) sequentially) - ==> ((\n. expectation p (f n)) ---> expectation p g) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN - DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; `f:num->A->real`; `g:A->real`; - `M:real`; `e / &2`] PROB_POINTWISE_TAIL_VANISHES) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / (&4 * abs M + &2)`) THEN - SUBGOAL_THEN `&0 < e / (&4 * abs M + &2)` (fun th -> REWRITE_TAC[th]) THENL - [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &4 * x + &2`) THEN - REAL_ARITH_TAC; - ALL_TAC] THEN - REWRITE_TAC[REAL_SUB_RZERO] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `N:num` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - (* Establish integrability *) - SUBGOAL_THEN `integrable (p:A prob_space) ((f:num->A->real) n)` ASSUME_TAC - THENL - [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `M:real` THEN - ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN - SUBGOAL_THEN `integrable (p:A prob_space) (g:A->real)` ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `M:real` THEN - ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Rewrite E[f_n] - E[g] = E[f_n - g] *) - SUBGOAL_THEN `expectation (p:A prob_space) ((f:num->A->real) n) - - expectation p (g:A->real) = expectation p (\x. f n x - g x)` - SUBST1_TAC THENL - [ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN - MP_TAC(ISPECL [`p:A prob_space`; `(f:num->A->real) n`; `g:A->real`] - EXPECTATION_SUB) THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; - ALL_TAC] THEN - (* |E[f_n - g]| <= E[|f_n - g|] *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `expectation (p:A prob_space) - (\x:A. abs((f:num->A->real) n x - (g:A->real) x))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN - MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - ALL_TAC] THEN - (* E[|f_n - g|] <= e/2 + 2|M| * P(S_n) *) - ABBREV_TAC `S_n = {x:A | x IN prob_carrier p /\ - abs((f:num->A->real) n x - (g:A->real) x) >= e / &2}` THEN - SUBGOAL_THEN `S_n IN prob_events (p:A prob_space)` ASSUME_TAC THENL - [EXPAND_TAC "S_n" THEN MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN +(* General L2 convergence implies convergence in probability *) +let CONVERGES_L2_IMP_IN_PROB = prove + (`!p:A prob_space (X:num->A->real) (L:A->real). + (!n. random_variable p (X n)) /\ + random_variable p L /\ + (!n. integrable p (\x. (X n x - L x) pow 2)) /\ + converges_L2 p X L + ==> converges_in_prob p X L`, + REPEAT GEN_TAC THEN + REWRITE_TAC[converges_L2; converges_in_prob] THEN + STRIP_TAC THEN X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Step 1: Measurability of the level set *) + SUBGOAL_THEN `!n. {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e} + IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `e / &2 + &2 * abs M * - prob (p:A prob_space) (S_n:A->bool)` THEN - CONJ_TAC THENL - [(* E[|f_n - g|] <= e/2 + 2|M| * P(S_n) via EXPECTATION_MONO *) + (* Step 2: Bound *) + SUBGOAL_THEN `!n:num. prob p {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e} <= + expectation p (\x. (X n x - L x) pow 2) / (e / &2) pow 2` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `expectation (p:A prob_space) (\x:A. e / &2 + - &2 * abs M * indicator_fn S_n x)` THEN + EXISTS_TAC `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + ((X:num->A->real) n x - (L:A->real) x) pow 2 > + (e / &2) pow 2}` THEN CONJ_TAC THENL - [MATCH_MP_TAC EXPECTATION_MONO THEN CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_ABS THEN - MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - ALL_TAC] THEN + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN - EXISTS_TAC `e / &2 + &2 * abs M` THEN CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_ADD THEN CONJ_TAC THENL - [REWRITE_TAC[RANDOM_VARIABLE_CONST]; - MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN - SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn S_n)` MP_TAC - THENL - [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; - SIMP_TAC[simple_rv]] THEN - STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN - REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; - X_GEN_TAC `z:A` THEN DISCH_TAC THEN - REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL - [REWRITE_TAC[REAL_MUL_RID] THEN - MATCH_MP_TAC(REAL_ARITH `&0 < e /\ &0 <= m - ==> abs(e / &2 + &2 * m) <= e / &2 + &2 * m`) THEN - ASM_REWRITE_TAC[REAL_ABS_POS]; - REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN - MATCH_MP_TAC(REAL_ARITH `&0 < e /\ &0 <= m - ==> abs(e / &2) <= e / &2 + &2 * m`) THEN - ASM_REWRITE_TAC[REAL_ABS_POS]]]; - X_GEN_TAC `z:A` THEN DISCH_TAC THEN BETA_TAC THEN - REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL - [REWRITE_TAC[REAL_MUL_RID] THEN - MATCH_MP_TAC(REAL_ARITH - `abs a <= M /\ abs b <= M /\ &0 < e - ==> abs(a - b) <= e / &2 + &2 * abs M`) THEN - ASM_SIMP_TAC[]; - REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN - MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> x <= e / &2`) THEN - FIRST_X_ASSUM(fun th -> MP_TAC(REWRITE_RULE[] th)) THEN - EXPAND_TAC "S_n" THEN REWRITE_TAC[IN_ELIM_THM] THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]; - (* Compute E[e/2 + 2|M| * indicator] = e/2 + 2|M| * P(S_n) *) - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. e / &2 + - &2 * abs M * indicator_fn S_n x) = - e / &2 + &2 * abs M * prob p S_n` - (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN - SUBGOAL_THEN `integrable (p:A prob_space) (indicator_fn S_n)` - ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[REAL_MUL_ASSOC] THEN - MP_TAC(ISPECL [`p:A prob_space`; `\x:A. e / &2`; - `\x:A. (&2 * abs M) * indicator_fn S_n x`] - EXPECTATION_ADD) THEN - REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN - ANTS_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `&2 * abs M`; - `indicator_fn (S_n:A->bool)`] INTEGRABLE_CMUL) THEN - ASM_REWRITE_TAC[]; - DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; `&2 * abs M`; - `indicator_fn (S_n:A->bool)`] EXPECTATION_CMUL) THEN - ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN - AP_TERM_TAC THEN - MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]]; - ALL_TAC] THEN - (* e/2 + 2|M| * P(S_n) < e *) - MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> e / &2 + x < e`) THEN - FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN - DISCH_TAC THEN - SUBGOAL_THEN `&0 <= prob (p:A prob_space) (S_n:A->bool)` ASSUME_TAC THENL - [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `&0 < &4 * abs M + &2` ASSUME_TAC THENL - [MATCH_MP_TAC(REAL_ARITH `&0 <= m ==> &0 < &4 * m + &2`) THEN - REWRITE_TAC[REAL_ABS_POS]; ALL_TAC] THEN - SUBGOAL_THEN `prob (p:A prob_space) (S_n:A->bool) < e / (&4 * abs M + &2)` - ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `prob (p:A prob_space) (S_n:A->bool) * (&4 * abs M + &2) < e` - ASSUME_TAC THENL - [MP_TAC(ISPECL [`prob (p:A prob_space) (S_n:A->bool)`; - `e / (&4 * abs M + &2)`; `&4 * abs M + &2`] REAL_LT_RMUL) THEN - ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LT_IMP_NZ] THEN - REAL_ARITH_TAC; + [MATCH_MP_TAC RV_LEVEL_GT_IN_EVENTS THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2)` + MP_TAC THENL + [ASM_REWRITE_TAC[]; SIMP_TAC[integrable]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_gt] THEN ONCE_REWRITE_TAC[GSYM REAL_POW2_ABS] THEN + MATCH_MP_TAC REAL_POW_LT2 THEN + REWRITE_TAC[ARITH_RULE `~(2 = 0)`; REAL_ABS_POS] THEN + UNDISCH_TAC `abs((X:num->A->real) n x - (L:A->real) x) >= e` THEN + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]; + MATCH_MP_TAC MARKOV_INEQUALITY THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_POW_LT THEN + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]]; ALL_TAC] THEN - ABBREV_TAC `Q = abs M * prob (p:A prob_space) (S_n:A->bool)` THEN - SUBGOAL_THEN `&4 * Q + &2 * prob (p:A prob_space) (S_n:A->bool) < e` - ASSUME_TAC THENL - [EXPAND_TAC "Q" THEN - SUBGOAL_THEN `&4 * abs M * prob (p:A prob_space) (S_n:A->bool) + - &2 * prob p S_n = - prob p S_n * (&4 * abs M + &2)` SUBST1_TAC THENL - [REAL_ARITH_TAC; ASM_REWRITE_TAC[]]; - ASM_REAL_ARITH_TAC]);; + (* Step 3: Squeeze: 0 <= prob(...) <= E[...] / (e/2)^2 --> 0 *) + MATCH_MP_TAC(ISPECL [`\n:num. &0`; + `\n:num. prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + abs((X:num->A->real) n x - (L:A->real) x) >= e}`; + `\n:num. expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / + (e / &2) pow 2`; + `&0`] REALLIM_TRANSFORM_STRADDLE) THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REALLIM_CONST]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(\n:num. expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - (L:A->real) x) pow 2) / + (e / &2) pow 2) = + (\n. inv((e / &2) pow 2) * expectation p + (\x. (X n x - L x) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_div; REAL_MUL_SYM]; ALL_TAC] THEN + SUBGOAL_THEN `&0 = inv((e / &2) pow 2) * &0` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_RZERO]; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_LMUL THEN ASM_REWRITE_TAC[]]);; -(* Dominated Convergence Theorem for non-negative sequences converging to 0. - If 0 <= f_n <= h pointwise, h integrable, and f_n -> 0, then E[f_n] -> 0. *) -let DOMINATED_CONVERGENCE_NULL = prove - (`!p:A prob_space (f:num->A->real) h. - (!n. random_variable p (f n)) /\ - random_variable p h /\ - integrable p h /\ - (!n x. x IN prob_carrier p ==> &0 <= f n x /\ f n x <= h x) /\ - (!x. x IN prob_carrier p ==> ((\n. f n x) ---> &0) sequentially) - ==> ((\n. expectation p (f n)) ---> &0) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN - DISCH_TAC THEN - (* Step 1: h >= 0 *) - SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= h x` ASSUME_TAC THENL - [REPEAT STRIP_TAC THEN - MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->A->real) 0 x` THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* Step 2: By NN_EXPECTATION_MIN_LIMIT, choose K so E[h]-E[min(h,K)] < e/2 *) - MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`] NN_EXPECTATION_MIN_LIMIT) THEN - ASM_REWRITE_TAC[] THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_THEN `K0:num` STRIP_ASSUME_TAC) THEN - ABBREV_TAC `K = &K0` THEN - SUBGOAL_THEN `&0 <= K` ASSUME_TAC THENL - [EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN - (* Step 3: E[min(h,K)] close to E[h] = nn_exp(h) *) - SUBGOAL_THEN `nn_expectation (p:A prob_space) h - e / &2 < - nn_expectation p (\x. min (h x) K)` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `K0:num`) THEN - REWRITE_TAC[LE_REFL] THEN EXPAND_TAC "K" THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* Step 4: E[h] - E[min(h,K)] < e/2, rewrite in terms of expectation *) - SUBGOAL_THEN `expectation (p:A prob_space) h = - nn_expectation p h` ASSUME_TAC THENL - [MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN - ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* f n is integrable (dominated by h) *) - SUBGOAL_THEN `!n. integrable (p:A prob_space) ((f:num->A->real) n)` - ASSUME_TAC THENL - [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `h:A->real` THEN ASM_REWRITE_TAC[] THEN - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= abs y`) THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* Step 5: Define g_n = min(f_n, K), bounded by K *) - (* g_n -> 0 pointwise, |g_n| <= K *) - (* By BCT: E[g_n] -> 0 *) - MP_TAC(ISPECL [`p:A prob_space`; - `\n (x:A). min ((f:num->A->real) n x) K`; - `\x:A. &0`; - `K:real`] BOUNDED_CONVERGENCE_EXPECTATION) THEN - BETA_TAC THEN - ANTS_TAC THENL - [REPEAT CONJ_TAC THENL - [(* random_variable p (min(f n, K)) *) - GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; - (* random_variable p 0 *) - REWRITE_TAC[RANDOM_VARIABLE_CONST]; - (* |min(f n x, K)| <= K *) - REPEAT STRIP_TAC THEN - MATCH_MP_TAC(REAL_ARITH - `&0 <= a /\ &0 <= K ==> abs(min a K) <= K`) THEN - ASM_SIMP_TAC[] THEN EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; - (* |0| <= K *) - REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_NUM] THEN - EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; - (* min(f n x, K) -> 0 pointwise *) - X_GEN_TAC `x:A` THEN DISCH_TAC THEN - SUBGOAL_THEN `&0 = min (&0) (K:real)` SUBST1_TAC THENL - [REWRITE_TAC[real_min] THEN - COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC REALLIM_MIN THEN - ASM_SIMP_TAC[REALLIM_CONST]]; - ALL_TAC] THEN - REWRITE_TAC[EXPECTATION_CONST; REAL_SUB_RZERO] THEN - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - (* Step 6: Bound E[f_n] by E[min(f_n,K)] + tail bound *) - REWRITE_TAC[REAL_SUB_RZERO] THEN - (* E[f_n] >= 0 since f_n >= 0 *) - SUBGOAL_THEN `&0 <= expectation (p:A prob_space) ((f:num->A->real) n)` - ASSUME_TAC THENL - [SUBGOAL_THEN `&0 = expectation (p:A prob_space) (\x:A. &0)` SUBST1_TAC THENL - [REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN - MATCH_MP_TAC EXPECTATION_MONO THEN - ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* |E[min(f_n, K)]| < e/2 from BCT *) - SUBGOAL_THEN `abs(expectation (p:A prob_space) - (\x:A. min ((f:num->A->real) n x) K)) < e / &2` ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO]; - ALL_TAC] THEN - (* min(f_n,K) is integrable *) - SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. min ((f:num->A->real) n x) K)` - ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `h:A->real` THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; ALL_TAC] THEN - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH - `&0 <= a /\ a <= h /\ &0 <= h /\ &0 <= K ==> abs(min a K) <= abs h`) THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* min(h,K) is integrable *) - SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. min ((h:A->real) x) K)` - ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `h:A->real` THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN - ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; ALL_TAC] THEN - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= h /\ &0 <= K ==> abs(min h K) <= abs h`) THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* E[f_n] - E[min(f_n,K)] = E[f_n - min(f_n,K)] via EXPECTATION_SUB *) - MP_TAC(ISPECL [`p:A prob_space`; `(f:num->A->real) n`; - `(\x:A. min ((f:num->A->real) n x) K)`] EXPECTATION_SUB) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN - DISCH_TAC THEN - (* E[f_n - min(f_n,K)] <= E[h - min(h,K)] by monotonicity *) - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (f:num->A->real) n x - min (f n x) K) <= - expectation p (\x. h x - min (h x) K)` ASSUME_TAC THENL - [MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; - GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH - `a <= h ==> a - min a K <= h - min h K`) THEN - ASM_SIMP_TAC[]]; - ALL_TAC] THEN - (* E[h - min(h,K)] = E[h] - E[min(h,K)] *) - MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`; - `(\x:A. min ((h:A->real) x) K)`] EXPECTATION_SUB) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN - DISCH_TAC THEN - (* E[min(h,K)] = nn_E[min(h,K)] *) - SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. min (h x) K) = - nn_expectation p (\x. min (h x) K)` ASSUME_TAC THENL - [MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN - ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= h /\ &0 <= K ==> &0 <= min h K`) THEN - ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* E[h] - E[min(h,K)] < e/2 *) - SUBGOAL_THEN `expectation (p:A prob_space) h - - expectation p (\x:A. min (h x) K) < e / &2` ASSUME_TAC THENL - [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; - ALL_TAC] THEN - ASM_REAL_ARITH_TAC);; +(* ========================================================================= *) +(* Abel summation by parts and Kronecker's lemma *) +(* ========================================================================= *) -let DOMINATED_CONVERGENCE = prove - (`!p:A prob_space X f g. - (!n. integrable p (X n)) /\ - integrable p g /\ - (!n x. x IN prob_carrier p ==> abs(X n x) <= g x) /\ - (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) - ==> integrable p f /\ - ((\n. expectation p (X n)) ---> expectation p f) sequentially`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Extract random_variable from integrable *) - SUBGOAL_THEN `!n:num. random_variable (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL - [GEN_TAC THEN - UNDISCH_TAC `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` THEN - DISCH_THEN(MP_TAC o SPEC `n:num`) THEN - REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* |f(x)| <= g(x) on carrier *) - SUBGOAL_THEN - `!x:A. x IN prob_carrier p ==> abs((f:A->real) x) <= (g:A->real) x` - ASSUME_TAC THENL - [X_GEN_TAC `x:A` THEN DISCH_TAC THEN - REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL - [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN - EXISTS_TAC `\n:num. (X:num->A->real) n x` THEN - ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; - MATCH_MP_TAC(REAL_ARITH `~(g < f) ==> f <= g`) THEN - DISCH_TAC THEN - MP_TAC(ISPECL [`sequentially`; `\n:num. --((X:num->A->real) n x)`; - `--((f:A->real) x)`; `--(g:A->real) x`] - REALLIM_LBOUND) THEN - REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; NOT_IMP] THEN - REPEAT CONJ_TAC THENL - [MATCH_MP_TAC REALLIM_NEG THEN ASM_SIMP_TAC[]; - REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN - EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN - ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; - ASM_REAL_ARITH_TAC]]; - ALL_TAC] THEN - (* f is a random variable *) - SUBGOAL_THEN `random_variable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL - [MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN - EXISTS_TAC `(X:num->A->real)` THEN ASM_SIMP_TAC[]; - ALL_TAC] THEN - (* f is integrable *) - SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL - [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN - EXISTS_TAC `(g:A->real)` THEN ASM_REWRITE_TAC[] THEN - X_GEN_TAC `x:A` THEN DISCH_TAC THEN +let ABEL_SUMMATION_IDENTITY = prove + (`!b c n. + sum (0..SUC n) (\k. b k * c k) = + b (SUC n) * sum (0..SUC n) c - + sum (0..n) (\k. sum (0..k) c * (b (SUC k) - b k))`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[SUM_CLAUSES_NUMSEG; ARITH_RULE `0 <= 0`; + ARITH_RULE `0 <= SUC 0`] THEN + REWRITE_TAC[SUM_SING_NUMSEG] THEN + REAL_ARITH_TAC; + ONCE_REWRITE_TAC[SUM_CLAUSES_NUMSEG] THEN + REWRITE_TAC[LE_0] THEN + FIRST_X_ASSUM SUBST1_TAC THEN + REAL_ARITH_TAC]);; + +let REAL_ABS_TRIANGLE_SUB = REAL_ARITH `!x y. abs(x - y) <= abs x + abs y`;; + +let KRONECKER_LEMMA = prove + (`!a b. + (!n. &0 < b(n)) /\ + (!n. b(n) <= b(n + 1)) /\ + (!M. ?N. !n. N <= n ==> M <= b(n)) /\ + real_summable (from 0) (\k. a(k) / b(k)) + ==> ((\n. inv(b(n)) * sum(0..n) a) ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + ABBREV_TAC `c = \k:num. (a(k):real) / b(k)` THEN + ABBREV_TAC `S = real_infsum (from 0) (c:num->real)` THEN + SUBGOAL_THEN `((\n. sum(0..n) (c:num->real)) ---> S) sequentially` + ASSUME_TAC THENL + [UNDISCH_TAC `real_summable (from 0) (c:num->real)` THEN + UNDISCH_TAC `real_infsum (from 0) (c:num->real) = S` THEN + REWRITE_TAC[real_summable; real_sums; FROM_0; INTER_UNIV; + real_infsum] THEN + MESON_TAC[SELECT_AX]; + ALL_TAC] THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + SUBGOAL_THEN `!n. ~(b(n:num) = &0)` ASSUME_TAC THENL + [ASM_MESON_TAC[REAL_LT_IMP_NZ]; ALL_TAC] THEN + SUBGOAL_THEN `!k:num. (a(k):real) = b(k) * c(k)` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "c" THEN REWRITE_TAC[] THEN + REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN + ONCE_REWRITE_TAC[REAL_ARITH `(b * a) * c = a * (b * c):real`] THEN + ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_RID]; + ALL_TAC] THEN + SUBGOAL_THEN `?Cs. !k:num. abs(sum(0..k) (c:num->real)) <= Cs` + (X_CHOOSE_TAC `Cs:real`) THENL + [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN + DISCH_THEN(X_CHOOSE_TAC `N0:num`) THEN + EXISTS_TAC `sum(0..N0) (\k:num. abs(sum(0..k) (c:num->real))) + + abs(S:real) + &1` THEN + X_GEN_TAC `k:num` THEN ASM_CASES_TAC `k:num <= N0` THENL + [MATCH_MP_TAC(REAL_ARITH `x <= y ==> x <= y + abs S + &1`) THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `(g:A->real) x` THEN ASM_SIMP_TAC[] THEN - MATCH_MP_TAC(REAL_ARITH `&0 <= g ==> g <= abs g`) THEN + EXISTS_TAC `sum(0..N0) + (\i:num. if i = k then abs(sum(0..k) (c:num->real)) else &0)` THEN + CONJ_TAC THENL + [REWRITE_TAC[SUM_DELTA; IN_NUMSEG] THEN + ASM_REWRITE_TAC[LE_0; REAL_LE_REFL]; + MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + BETA_TAC THEN COND_CASES_TAC THEN + ASM_REWRITE_TAC[REAL_ABS_POS; REAL_LE_REFL]]; MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs((f:A->real) x)` THEN - ASM_SIMP_TAC[REAL_ABS_POS]; - ALL_TAC] THEN - CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* E[|X_n - f|] -> 0 via DOMINATED_CONVERGENCE_NULL *) - SUBGOAL_THEN - `((\n. expectation p (\x. abs((X:num->A->real) n x - (f:A->real) x))) - ---> &0) sequentially` - ASSUME_TAC THENL - [MATCH_MP_TAC DOMINATED_CONVERGENCE_NULL THEN - EXISTS_TAC `\x:A. &2 * (g:A->real) x` THEN - REPEAT CONJ_TAC THENL - [(* RV for |X_n - f| *) - GEN_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `f:A->real`] - INTEGRABLE_SUB) THEN - ASM_REWRITE_TAC[] THEN DISCH_TAC THEN - MP_TAC(ISPECL [`p:A prob_space`; - `\x:A. (X:num->A->real) n x - (f:A->real) x`] - INTEGRABLE_ABS) THEN - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; - (* RV for 2*g *) - UNDISCH_TAC `integrable (p:A prob_space) (g:A->real)` THEN - DISCH_THEN(fun th -> MP_TAC(MATCH_MP INTEGRABLE_CMUL th)) THEN - DISCH_THEN(MP_TAC o SPEC `&2`) THEN - REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; - (* integrable 2*g *) - MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; - (* bounds: 0 <= |X_n - f| <= 2g *) - REWRITE_TAC[] THEN REPEAT STRIP_TAC THENL - [REAL_ARITH_TAC; - MATCH_MP_TAC(REAL_ARITH - `abs(x) <= g /\ abs(f) <= g ==> abs(x - f) <= &2 * g`) THEN - ASM_SIMP_TAC[]]; - (* pointwise: |X_n x - f x| -> 0 *) - REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN - SUBGOAL_THEN - `((\n. (X:num->A->real) n x - (f:A->real) x) ---> &0) sequentially` - (fun th -> MP_TAC(MATCH_MP REALLIM_ABS th) THEN - REWRITE_TAC[REAL_ABS_NUM]) THEN - REWRITE_TAC[GSYM REALLIM_NULL] THEN ASM_SIMP_TAC[]]; - ALL_TAC] THEN - (* E[X_n] -> E[f] from E[|X_n - f|] -> 0 *) - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN - DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN - EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `expectation (p:A prob_space) - (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `abs(expectation (p:A prob_space) - (\x:A. (X:num->A->real) n x - (f:A->real) x))` THEN + EXISTS_TAC `abs(S:real) + &1` THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH + `abs(x - S) < &1 ==> abs x <= abs S + &1`) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `&0 <= y ==> a + &1 <= y + a + &1`) THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_POS]]]; + ALL_TAC] THEN + SUBGOAL_THEN `!k:num. &0 <= b(SUC k) - b(k)` ASSUME_TAC THENL + [GEN_TAC THEN + UNDISCH_TAC `!n. b n <= b(n + 1)` THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[ADD1] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ABBREV_TAC `D = (&3 / e) * ((Cs + abs(S:real)) * b(SUC N1) + + abs S * b(0:num)) + &1` THEN + UNDISCH_TAC `!M. ?N. !n:num. N <= n ==> M <= b n` THEN + DISCH_THEN(MP_TAC o SPEC `D:real`) THEN + DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN + EXISTS_TAC `SUC(MAX N1 N2)` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `?j. n = SUC j /\ N1 <= j /\ N2 <= SUC j` + (CHOOSE_THEN STRIP_ASSUME_TAC) THENL + [EXISTS_TAC `n - 1` THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `sum(0..SUC j) a = sum(0..SUC j) (\k. b(k) * c(k))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[ABEL_SUMMATION_IDENTITY] THEN + REWRITE_TAC[REAL_SUB_LDISTRIB] THEN + SUBGOAL_THEN + `inv(b(SUC j)) * (b(SUC j) * sum(0..SUC j) (c:num->real)) = + sum(0..SUC j) c` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_ASSOC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_LID]; + ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH + `abs(s - S) < e / &3 /\ abs(S - w) <= &2 * e / &3 + ==> abs(s - w) < e`) THEN CONJ_TAC THENL - [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `f:A->real`] - EXPECTATION_SUB) THEN - ASM_REWRITE_TAC[] THEN - DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + [UNDISCH_TAC + `!n:num. N1 <= n ==> abs(sum(0..n) (c:num->real) - S) < e / &3` THEN + DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[GSYM REAL_SUB_LDISTRIB] THEN + SUBGOAL_THEN + `!j. sum(0..j) (\k. sum(0..k) (c:num->real) * (b(SUC k) - b k)) = + sum(0..j) (\k. S * (b(SUC k) - b k)) - + sum(0..j) (\k. (S - sum(0..k) c) * (b(SUC k) - b k))` + (fun th -> ONCE_REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[GSYM SUM_SUB_NUMSEG] THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN REAL_ARITH_TAC; - MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN - MATCH_MP_TAC INTEGRABLE_SUB THEN - ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + REWRITE_TAC[SUM_LMUL] THEN + SUBGOAL_THEN `sum(0..j) (\k. b(SUC k) - b(k:num)) = b(SUC j) - b(0)` + SUBST1_TAC THENL + [REWRITE_TAC[ADD1; SUM_DIFFS_ALT; LE_0]; ALL_TAC] THEN + ABBREV_TAC `R = sum(0..j) (\k. (S - sum(0..k) (c:num->real)) * + (b(SUC k) - b(k)))` THEN + SUBGOAL_THEN `inv(b(SUC j)) * b(SUC j) = &1` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_MUL_LINV]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(b(SUC j))` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LT_INV]; ALL_TAC] THEN + (* Algebraic rearrangement: S - inv(b)*(S*(b-b0) - R) *) + (* = S - S + S*b0*inv(b) + inv(b)*R = S*b0*inv(b) + inv(b)*R *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(S:real) * b(0:num) * inv(b(SUC j)) + + inv(b(SUC j)) * abs(R:real)` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_SUB_LDISTRIB] THEN + SUBGOAL_THEN `inv(b(SUC j)) * ((S:real) * b(SUC j)) = S` SUBST1_TAC THENL + [ONCE_REWRITE_TAC[REAL_ARITH `a * (s * b) = s * (a * b):real`] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ARITH `S - (S - x - y) = x + y:real`] THEN + MATCH_MP_TAC(REAL_ARITH + `abs(a + b) <= abs a + abs b /\ + abs a <= sa /\ abs b <= sb + ==> abs(a + b) <= sa + sb`) THEN + REWRITE_TAC[REAL_ABS_TRIANGLE] THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 < x ==> abs x = x`; REAL_LT_INV] THEN + REAL_ARITH_TAC; + REWRITE_TAC[REAL_ABS_MUL] THEN + ASM_SIMP_TAC[REAL_ARITH `&0 < x ==> abs x = x`; REAL_LT_INV] THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Bound |R| *) + SUBGOAL_THEN `abs(R:real) <= + (Cs + abs S) * b(SUC N1) + e / &3 * b(SUC j)` ASSUME_TAC THENL + [EXPAND_TAC "R" THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..j) (\k. abs((S - sum(0..k) (c:num->real)) * + (b(SUC k) - b(k:num))))` THEN + CONJ_TAC THENL [REWRITE_TAC[SUM_ABS_NUMSEG]; ALL_TAC] THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + SUBGOAL_THEN `!k:num. abs(b(SUC k) - b k) = b(SUC k) - b k` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_ABS_REFL] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_CASES_TAC `N1 = 0` THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..j) (\k. e / &3 * (b(SUC k) - b(k:num)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `abs(x - S) < e ==> abs(S - x) <= e`) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[SUM_LMUL; ADD1; SUM_DIFFS_ALT; LE_0; + REAL_SUB_LDISTRIB] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= c * b + e * b0 + ==> e * b1 - e * b0 <= c * b + e * b1`) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REWRITE_TAC[REAL_ABS_POS]]; + ASM_SIMP_TAC[REAL_LT_IMP_LE]]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; + ASM_SIMP_TAC[REAL_LT_IMP_LE]]]]; + SUBGOAL_THEN `?N1'. N1 = SUC N1'` (X_CHOOSE_TAC `N1':num`) THENL + [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + SUBGOAL_THEN `(N1':num) < j` ASSUME_TAC THENL + [UNDISCH_TAC `(N1:num) <= j` THEN + UNDISCH_TAC `N1 = SUC N1'` THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[LE_SUC_LT]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`\k. abs(S - sum(0..k) (c:num->real)) * (b(SUC k) - b(k:num))`; + `0`; `N1':num`; `j:num`] SUM_COMBINE_R) THEN + ANTS_TAC THENL + [CONJ_TAC THENL [REWRITE_TAC[LE_0]; ASM_SIMP_TAC[LT_IMP_LE]]; + DISCH_THEN(SUBST1_TAC o SYM)] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..N1') + (\k. (Cs + abs(S:real)) * (b(SUC k) - b(k:num)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH + `abs(S - x) <= abs S + abs x /\ abs x <= C + ==> abs(S - x) <= C + abs S`) THEN + ASM_REWRITE_TAC[REAL_ABS_TRIANGLE_SUB]; + REWRITE_TAC[SUM_LMUL; ADD1; SUM_DIFFS_ALT; LE_0] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REWRITE_TAC[REAL_ABS_POS]]; + MATCH_MP_TAC(REAL_ARITH + `&0 < z /\ x <= y ==> x - z <= y`) THEN + CONJ_TAC THENL + [ASM_MESON_TAC[]; + UNDISCH_TAC `N1 = SUC N1'` THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[ADD1] THEN ASM_MESON_TAC[]]]]; + SUBGOAL_THEN + `sum(N1' + 1..j) + (\k. abs(S - sum(0..k) (c:num->real)) * (b(SUC k) - b(k:num))) + <= sum(N1' + 1..j) (\k. e / &3 * (b(SUC k) - b(k:num)))` MP_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `abs(x - S) < e ==> abs(S - x) <= e`) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + UNDISCH_TAC `N1 = SUC N1'` THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[ADD1] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `sum(N1' + 1..j) (\k. e / &3 * (b(SUC k) - b(k:num))) + <= e / &3 * (b:num->real)(SUC j)` MP_TAC THENL + [REWRITE_TAC[SUM_LMUL] THEN + SUBGOAL_THEN `sum(N1' + 1..j) (\k. b(SUC k) - b(k:num)) = + b(SUC j) - b(N1' + 1)` + SUBST1_TAC THENL + [REWRITE_TAC[ADD1; SUM_DIFFS_ALT] THEN + ASM_SIMP_TAC[ARITH_RULE `m < n ==> m + 1 <= n`]; + MATCH_MP_TAC REAL_LE_LMUL THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH; REAL_LT_IMP_LE] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> b - x <= b`) THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]]; + ALL_TAC] THEN + REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Now bound the total *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(S:real) * b(0:num) * inv(b(SUC j)) + + inv(b(SUC j)) * ((Cs + abs S) * b(SUC N1) + + e / &3 * b(SUC j))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_LMUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + SUBGOAL_THEN `inv(b(SUC j)) * (e / &3 * b(SUC j)) = e / &3` + SUBST1_TAC THENL + [ONCE_REWRITE_TAC[REAL_ARITH `a * (b * c) = b * (a * c):real`] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; + ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_ADD_ASSOC] THEN + MATCH_MP_TAC(REAL_ARITH `x < e3 ==> x + e3 <= &2 * e3`) THEN + SUBGOAL_THEN + `abs(S:real) * b(0:num) * inv(b(SUC j)) + + inv(b(SUC j)) * (Cs + abs S) * b(SUC N1) = + ((Cs + abs S) * b(SUC N1) + abs S * b(0:num)) * inv(b(SUC j))` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_ADD_RDISTRIB] THEN + ONCE_REWRITE_TAC[REAL_ARITH `(a * b) * c = a * (b * c):real`] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + ABBREV_TAC `X = (Cs + abs(S:real)) * b(SUC N1) + abs S * b(0:num)` THEN + SUBGOAL_THEN `&0 <= X` ASSUME_TAC THENL + [EXPAND_TAC "X" THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_SIMP_TAC[REAL_ABS_POS; REAL_LT_IMP_LE] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= a + b`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(sum(0..0) (c:num->real))` THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REWRITE_TAC[REAL_ABS_POS]]; + ALL_TAC] THEN + SUBGOAL_THEN `D <= b(SUC j)` ASSUME_TAC THENL + [UNDISCH_TAC `!n:num. N2 <= n ==> D <= b n` THEN + DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN + UNDISCH_TAC `N2 <= SUC j` THEN SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < x + &1`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_DIV THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE; REAL_OF_NUM_LE; ARITH_RULE `0 <= 3`]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `X * inv(D:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[GSYM real_div] THEN ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + SUBGOAL_THEN `(e / &3) * D = X + e / &3` SUBST1_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "X" THEN + MATCH_MP_TAC(REAL_FIELD `~(e = &0) ==> + (e / &3) * ((&3 / e) * x + &1) = x + e / &3`) THEN + ASM_MESON_TAC[REAL_LT_IMP_NZ]; + MATCH_MP_TAC(REAL_ARITH `&0 < t ==> x < x + t`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]]);; + +(* ========================================================================= *) +(* Scheffe's lemma (L1 convergence) *) +(* ========================================================================= *) + +let REAL_MIN_REFL = REAL_ARITH `!x. min x x = x`;; + +let REALLIM_MIN_CONST = prove + (`!f L c. (f ---> L) sequentially + ==> ((\n. min (f n) c) ---> min L c) sequentially`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_min] THEN REAL_ARITH_TAC);; + +let SIMPLE_RV_UPPER_BOUND = prove + (`!p:A prob_space f. simple_rv p f ==> + ?M. !x. x IN prob_carrier p ==> f x <= M`, + REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `f:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + EXISTS_TAC `M:real` THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `abs x <= M ==> x <= M`) THEN + ASM_SIMP_TAC[]);; + +let NN_EXPECTATION_MIN_LIMIT = prove + (`!p:A prob_space f. + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + integrable p f + ==> ((\n. nn_expectation p (\x. min (f x) (&n))) ---> + nn_expectation p f) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + SUBGOAL_THEN `!m n. m <= n ==> + nn_expectation (p:A prob_space) (\x:A. min ((f:A->real) x) (&m)) <= + nn_expectation p (\x. min (f x) (&n))` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC BOUNDED_NN_EXPECTATION_MONO THEN + BETA_TAC THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> min x a <= min x b`) THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LE]; + EXISTS_TAC `&n` THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. nn_expectation (p:A prob_space) (\x:A. min ((f:A->real) x) (&n)) <= + nn_expectation p f` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NN_EXPECTATION_MONO THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= b ==> &0 <= min a b`) THEN + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; `f:A->real`] INTEGRABLE_NONNEG_NN_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Bf:real`) THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) (f:A->real) - e < + nn_expectation p f` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`{simple_expectation (p:A prob_space) g | g | + simple_rv p g /\ (!x:A. x IN prob_carrier p ==> &0 <= g x) /\ + (!x. x IN prob_carrier p ==> g x <= (f:A->real) x)}`; + `nn_expectation (p:A prob_space) (f:A->real) - e`] SUP_APPROACH) THEN + REWRITE_TAC[GSYM nn_expectation] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC NN_EXPECT_SET_NONEMPTY THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [EXISTS_TAC `Bf:real` THEN REWRITE_TAC[IN_ELIM_THM] THEN + GEN_TAC THEN DISCH_THEN(X_CHOOSE_THEN `h:A->real` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `v:real` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC ASSUME_TAC) THEN + DISCH_THEN(X_CHOOSE_THEN `g:A->real` STRIP_ASSUME_TAC) THEN + MP_TAC(SPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_UPPER_BOUND) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Mg:real`) THEN + MP_TAC(SPEC `Mg:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) (g:A->real) <= + nn_expectation p (\x:A. min ((f:A->real) x) (&n))` ASSUME_TAC THENL + [MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `Mg:real` THEN + ASM_SIMP_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&N` THEN ASM_REWRITE_TAC[REAL_OF_NUM_LE]]; + EXISTS_TAC `&n` THEN GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + UNDISCH_TAC `v = simple_expectation (p:A prob_space) (g:A->real)` THEN + ASM_REAL_ARITH_TAC);; + +let SCHEFFE_LEMMA = prove + (`!p:A prob_space X f. + (!n. integrable p (X n)) /\ + integrable p f /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) /\ + ((\n. nn_expectation p (X n)) ---> nn_expectation p f) sequentially + ==> ((\n. nn_expectation p (\x. abs(X n x - f x))) ---> &0) sequentially`, + REPEAT STRIP_TAC THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Integrability of min(X_n, f) *) + SUBGOAL_THEN + `!n:num. integrable (p:A prob_space) + (\x. min ((X:num->A->real) n x) ((f:A->real) x))` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `(f:A->real)` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THENL + [UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC; + UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN + REWRITE_TAC[integrable] THEN STRIP_TAC]; + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 <= (X:num->A->real) n x /\ &0 <= (f:A->real) x` + MP_TAC THENL + [ASM_MESON_TAC[]; REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Algebraic identity via signed expectation linearity *) + SUBGOAL_THEN + `!n:num. nn_expectation (p:A prob_space) + (\x. abs((X:num->A->real) n x - (f:A->real) x)) = + nn_expectation p (X n) + nn_expectation p f - + &2 * nn_expectation p (\x. min (X n x) (f x))` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN + `integrable (p:A prob_space) + (\x. abs((X:num->A->real) n x - (f:A->real) x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. abs((X:num->A->real) n x) + abs((f:A->real) x)` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN + REWRITE_TAC[integrable] THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_ABS THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN prob_carrier p + ==> &0 <= min ((X:num->A->real) n x) ((f:A->real) x)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[GSYM EXPECTATION_NONNEG_EQ_NN; REAL_ABS_POS] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. abs((X:num->A->real) n x - (f:A->real) x)) = + expectation p (\x. (X n x + f x) - &2 * min (X n x) (f x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 <= (X:num->A->real) n x /\ &0 <= (f:A->real) x` + MP_TAC THENL + [ASM_MESON_TAC[]; REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable (p:A prob_space) + (\x. &2 * min ((X:num->A->real) n x) ((f:A->real) x))` + ASSUME_TAC THENL + [SUBGOAL_THEN + `(\x. &2 * min ((X:num->A->real) n x) ((f:A->real) x)) = + (\x. min (X n x) (f x) + min (X n x) (f x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable (p:A prob_space) + (\x. (X:num->A->real) n x + (f:A->real) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SUB] THEN + ASM_SIMP_TAC[EXPECTATION_ADD; ETA_AX] THEN + ASM_SIMP_TAC[EXPECTATION_CMUL] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* Extract random_variable facts from integrable *) + SUBGOAL_THEN + `random_variable (p:A prob_space) (f:A->real) /\ + (!n:num. random_variable p ((X:num->A->real) n))` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [UNDISCH_TAC `integrable (p:A prob_space) (f:A->real)` THEN + REWRITE_TAC[integrable] THEN STRIP_TAC; + GEN_TAC THEN + UNDISCH_TAC `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC]; + ALL_TAC] THEN + (* Get M from truncation convergence *) + MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`] NN_EXPECTATION_MIN_LIMIT) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + (* Get N1 from bounded convergence for min(min(X_n, f), &M) *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\n:num. \(x:A). min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)`; + `\(x:A). min ((f:A->real) x) (&M)`; + `&M`] BOUNDED_CONVERGENCE_NN) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX] THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN ASM_MESON_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN ASM_MESON_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC; + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL + [`\n:num. min ((X:num->A->real) n (x:A)) ((f:A->real) x)`; + `min ((f:A->real) (x:A)) (f x)`; `&M`] REALLIM_MIN_CONST) THEN + REWRITE_TAC[REAL_MIN_REFL] THEN DISCH_THEN MATCH_MP_TAC THEN + MP_TAC(ISPECL + [`\n:num. (X:num->A->real) n (x:A)`; + `(f:A->real) (x:A)`; `(f:A->real) (x:A)`] REALLIM_MIN_CONST) THEN + REWRITE_TAC[REAL_MIN_REFL] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &6`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + (* Get N2 from E[X_n] -> E[f] *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN + (* Combine: N = max(N1, N2) *) + EXISTS_TAC `MAX N1 N2` THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_SUB_RZERO] THEN + (* Monotonicity: nn_exp(min(X_n, f)) <= nn_exp(f) *) + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) ((f:A->real) x)) <= + nn_expectation p f` + ASSUME_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_MONO THEN REWRITE_TAC[] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; + REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Monotonicity: nn_exp(min(min(X_n,f),&M)) <= nn_exp(min(X_n,f)) *) + SUBGOAL_THEN + `nn_expectation (p:A prob_space) + (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) <= + nn_expectation p (\x. min (X n x) (f x))` + ASSUME_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_MONO THEN REWRITE_TAC[] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN; REAL_OF_NUM_LE; LE_0] THEN + ASM_MESON_TAC[]; + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN ASM_MESON_TAC[]; + REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_MIN_LE] THEN DISJ1_TAC THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* Instantiate all epsilon bounds *) + SUBGOAL_THEN `N1 <= (n:num) /\ N2 <= n` STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `MAX N1 N2 <= n` THEN ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + UNDISCH_TAC + `!n. M <= n ==> + abs(nn_expectation (p:A prob_space) + (\x. min ((f:A->real) x) (&n)) - + nn_expectation p f) < e / &6` THEN + DISCH_THEN(MP_TAC o SPEC `M:num`) THEN REWRITE_TAC[LE_REFL] THEN + DISCH_TAC THEN + (* Final arithmetic *) + UNDISCH_TAC + `nn_expectation (p:A prob_space) + (\x. min ((X:num->A->real) n x) ((f:A->real) x)) <= + nn_expectation p f` THEN + UNDISCH_TAC + `nn_expectation (p:A prob_space) + (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) <= + nn_expectation p (\x. min (X n x) (f x))` THEN + UNDISCH_TAC + `abs(nn_expectation (p:A prob_space) ((X:num->A->real) n) - + nn_expectation p (f:A->real)) < e / &3` THEN + UNDISCH_TAC + `abs(nn_expectation (p:A prob_space) + (\x. min (min ((X:num->A->real) n x) ((f:A->real) x)) (&M)) - + nn_expectation p (\x. min (f x) (&M))) < e / &6` THEN + UNDISCH_TAC + `abs(nn_expectation (p:A prob_space) + (\x. min ((f:A->real) x) (&M)) - + nn_expectation p f) < e / &6` THEN + REAL_ARITH_TAC);; + +(* ========================================================================= *) +(* Dominated convergence theorem *) +(* ========================================================================= *) + +let INTEGRABLE_MAX = prove + (`!p:A prob_space f g. + integrable p f /\ integrable p g + ==> integrable p (\x. max (f x) (g x))`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. abs((f:A->real) x) + abs((g:A->real) x)` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN ASM_MESON_TAC[integrable]; + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_SIMP_TAC[INTEGRABLE_ABS]; + REWRITE_TAC[real_max] THEN REAL_ARITH_TAC]);; + +let INTEGRABLE_MIN = prove + (`!p:A prob_space f g. + integrable p f /\ integrable p g + ==> integrable p (\x. min (f x) (g x))`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. abs((f:A->real) x) + abs((g:A->real) x)` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN ASM_MESON_TAC[integrable]; + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_SIMP_TAC[INTEGRABLE_ABS]; + REWRITE_TAC[real_min] THEN REAL_ARITH_TAC]);; + +(* Probability of tail events for pointwise convergent bounded sequences *) +let PROB_POINTWISE_TAIL_VANISHES = prove + (`!p:A prob_space (f:num->A->real) (g:A->real) M d. + (!n. random_variable p (f n)) /\ + random_variable p g /\ + (!n x. x IN prob_carrier p ==> abs(f n x) <= M) /\ + (!x. x IN prob_carrier p ==> abs(g x) <= M) /\ + (!x. x IN prob_carrier p ==> ((\n. f n x) ---> g x) sequentially) /\ + &0 < d + ==> ((\n. prob p {x | x IN prob_carrier p /\ abs(f n x - g x) >= d}) + ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REALLIM_NULL_COMPARISON THEN + EXISTS_TAC `\n:num. prob (p:A prob_space) + (UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ + abs((f:num->A->real) k x - (g:A->real) x) >= d}) {k:num | n <= k}))` THEN + CONJ_TAC THENL + [(* Eventually bound: abs(prob S_n) <= prob B_n *) + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN BETA_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + abs((f:num->A->real) n x - (g:A->real) x) >= d} + IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN + `UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ + abs((f:num->A->real) k x - (g:A->real) x) >= d}) + {k:num | n <= k}) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[COUNTABLE_SUBSET_NUM]]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET; IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `y:A` THEN STRIP_TAC THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + abs((f:num->A->real) n x - (g:A->real) x) >= d}` THEN + CONJ_TAC THENL + [EXISTS_TAC `n:num` THEN REWRITE_TAC[LE_REFL] THEN SET_TAC[]; + ASM_REWRITE_TAC[IN_ELIM_THM]]; + ALL_TAC] THEN + (* Limit: prob(B_n) --> 0 *) + ABBREV_TAC `B = \n:num. UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ + abs((f:num->A->real) k x - (g:A->real) x) >= d}) {k:num | n <= k})` THEN + SUBGOAL_THEN `(\n. prob (p:A prob_space) + (UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ + abs((f:num->A->real) k x - (g:A->real) x) >= d}) + {k:num | n <= k}))) = (\n. prob p (B n))` SUBST1_TAC THENL + [ASM_REWRITE_TAC[FUN_EQ_THM] THEN + POP_ASSUM(fun th -> REWRITE_TAC[GSYM th]) THEN + BETA_TAC THEN REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. (B:num->A->bool) n IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [GEN_TAC THEN + FIRST_X_ASSUM(fun th -> REWRITE_TAC[GSYM th]) THEN BETA_TAC THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `k:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[COUNTABLE_SUBSET_NUM]]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. (B:num->A->bool) (SUC n) SUBSET B n` ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `(B:num->A->bool) n = UNIONS (IMAGE (\k. {x:A | x IN + prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) + {k:num | n <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(B:num->A->bool) (SUC n) = UNIONS (IMAGE (\k. {x:A | x IN + prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) + {k:num | SUC n <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC SUBSET_UNIONS THEN MATCH_MP_TAC IMAGE_SUBSET THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `B:num->A->bool`] + PROB_CONTINUITY_FROM_ABOVE) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `INTERS {(B:num->A->bool) n | n IN (:num)} = {}` + (fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THENL + [REWRITE_TAC[EXTENSION; NOT_IN_EMPTY] THEN X_GEN_TAC `y:A` THEN + REWRITE_TAC[IN_INTERS] THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + DISCH_TAC THEN + SUBGOAL_THEN `(y:A) IN prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(B:num->A->bool) 0`] + PROB_EVENT_SUBSET) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[SUBSET] THEN + DISCH_THEN MATCH_MP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(B:num->A->bool) 0`) THEN + ANTS_TAC THENL [EXISTS_TAC `0` THEN REFL_TAC; SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `((\n. (f:num->A->real) n (y:A)) ---> (g:A->real) y) sequentially` + MP_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `d:real`) THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(B:num->A->bool) N`) THEN + ANTS_TAC THENL [EXISTS_TAC `N:num` THEN REFL_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(B:num->A->bool) N = UNIONS (IMAGE (\k. {x:A | x IN + prob_carrier p /\ abs((f:num->A->real) k x - (g:A->real) x) >= d}) + {k:num | N <= k})` SUBST1_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM SUBST_ALL_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_ELIM_THM]) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + RULE_ASSUM_TAC(REWRITE_RULE[PROB_EMPTY]) THEN ASM_REWRITE_TAC[]);; + +(* Bounded convergence for expectation: removes hypotheses about the limit. + Generalizes BOUNDED_CONVERGENCE_EXPECTATION (no need for random_variable g + or abs(g x) <= M). Also establishes integrability of the limit. *) +let BOUNDED_CONVERGENCE_EXPECTATION_GEN = prove + (`!p:A prob_space (f:num->A->real) (g:A->real) M. + (!n. random_variable p (f n)) /\ + (!n x. x IN prob_carrier p ==> abs(f n x) <= M) /\ + (!x. x IN prob_carrier p ==> ((\n. f n x) ---> g x) sequentially) + ==> integrable p g /\ + ((\n. expectation p (f n)) ---> expectation p g) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Derive 0 <= M *) + SUBGOAL_THEN `&0 <= M` ASSUME_TAC THENL [ + MP_TAC(ISPEC `p:A prob_space` PROB_CARRIER_NONEMPTY) THEN + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY] THEN + DISCH_THEN(X_CHOOSE_TAC `a:A`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((f:num->A->real) 0 a)` THEN + REWRITE_TAC[REAL_ABS_POS] THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Derive random_variable p g *) + SUBGOAL_THEN `random_variable p (g:A->real)` ASSUME_TAC THENL [ + MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `f:num->A->real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Derive abs(g x) <= M *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> abs((g:A->real) x) <= M` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL [ + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n. (f:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n. (f:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Derive integrable p g *) + SUBGOAL_THEN `integrable (p:A prob_space) (g:A->real)` ASSUME_TAC THENL [ + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `M:real` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Main convergence proof via PROB_POINTWISE_TAIL_VANISHES *) + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `f:num->A->real`; `g:A->real`; + `M:real`; `e / &2`] PROB_POINTWISE_TAIL_VANISHES) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / (&4 * abs M + &2)`) THEN + SUBGOAL_THEN `&0 < e / (&4 * abs M + &2)` (fun th -> REWRITE_TAC[th]) THENL + [MATCH_MP_TAC REAL_LT_DIV THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> &0 < &4 * x + &2`) THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `N:num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) ((f:num->A->real) n)` ASSUME_TAC + THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `M:real` THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) ((f:num->A->real) n) - + expectation p (g:A->real) = expectation p (\x. f n x - g x)` + SUBST1_TAC THENL + [ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(f:num->A->real) n`; `g:A->real`] + EXPECTATION_SUB) THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((f:num->A->real) n x - (g:A->real) x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + ABBREV_TAC `S_n = {x:A | x IN prob_carrier p /\ + abs((f:num->A->real) n x - (g:A->real) x) >= e / &2}` THEN + SUBGOAL_THEN `S_n IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [EXPAND_TAC "S_n" THEN MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `e / &2 + &2 * abs M * + prob (p:A prob_space) (S_n:A->bool)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x:A. e / &2 + + &2 * abs M * indicator_fn S_n x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `e / &2 + &2 * abs M` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[RANDOM_VARIABLE_CONST]; + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn S_n)` MP_TAC + THENL + [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + SIMP_TAC[simple_rv]] THEN + STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `z:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 < e /\ &0 <= m + ==> abs(e / &2 + &2 * m) <= e / &2 + &2 * m`) THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN + MATCH_MP_TAC(REAL_ARITH `&0 < e /\ &0 <= m + ==> abs(e / &2) <= e / &2 + &2 * m`) THEN + ASM_REWRITE_TAC[REAL_ABS_POS]]]; + X_GEN_TAC `z:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + MATCH_MP_TAC(REAL_ARITH + `abs a <= M /\ abs b <= M /\ &0 < e + ==> abs(a - b) <= e / &2 + &2 * abs M`) THEN + ASM_SIMP_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_RID] THEN + MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> x <= e / &2`) THEN + FIRST_X_ASSUM(fun th -> MP_TAC(REWRITE_RULE[] th)) THEN + EXPAND_TAC "S_n" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]; + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. e / &2 + + &2 * abs M * indicator_fn S_n x) = + e / &2 + &2 * abs M * prob p S_n` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + SUBGOAL_THEN `integrable (p:A prob_space) (indicator_fn S_n)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_ASSOC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\x:A. e / &2`; + `\x:A. (&2 * abs M) * indicator_fn S_n x`] + EXPECTATION_ADD) THEN + REWRITE_TAC[INTEGRABLE_CONST; EXPECTATION_CONST] THEN + ANTS_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `&2 * abs M`; + `indicator_fn (S_n:A->bool)`] INTEGRABLE_CMUL) THEN + ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC THEN AP_TERM_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `&2 * abs M`; + `indicator_fn (S_n:A->bool)`] EXPECTATION_CMUL) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `x < e / &2 ==> e / &2 + x < e`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[] THEN + DISCH_TAC THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) (S_n:A->bool)` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &4 * abs M + &2` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= m ==> &0 < &4 * m + &2`) THEN + REWRITE_TAC[REAL_ABS_POS]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) (S_n:A->bool) < e / (&4 * abs M + &2)` + ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) (S_n:A->bool) * (&4 * abs M + &2) < e` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`prob (p:A prob_space) (S_n:A->bool)`; + `e / (&4 * abs M + &2)`; `&4 * abs M + &2`] REAL_LT_RMUL) THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[REAL_DIV_RMUL; REAL_LT_IMP_NZ] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + ABBREV_TAC `Q = abs M * prob (p:A prob_space) (S_n:A->bool)` THEN + SUBGOAL_THEN `&4 * Q + &2 * prob (p:A prob_space) (S_n:A->bool) < e` + ASSUME_TAC THENL + [EXPAND_TAC "Q" THEN + SUBGOAL_THEN `&4 * abs M * prob (p:A prob_space) (S_n:A->bool) + + &2 * prob p S_n = + prob p S_n * (&4 * abs M + &2)` SUBST1_TAC THENL + [REAL_ARITH_TAC; ASM_REWRITE_TAC[]]; + ASM_REAL_ARITH_TAC]);; + +(* Original bounded convergence -- now a corollary of _GEN *) +let BOUNDED_CONVERGENCE_EXPECTATION = prove + (`!p:A prob_space (f:num->A->real) (g:A->real) M. + (!n. random_variable p (f n)) /\ + random_variable p g /\ + (!n x. x IN prob_carrier p ==> abs(f n x) <= M) /\ + (!x. x IN prob_carrier p ==> abs(g x) <= M) /\ + (!x. x IN prob_carrier p ==> ((\n. f n x) ---> g x) sequentially) + ==> ((\n. expectation p (f n)) ---> expectation p g) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `f:num->A->real`; `g:A->real`; `M:real`] + BOUNDED_CONVERGENCE_EXPECTATION_GEN) THEN + ASM_REWRITE_TAC[] THEN SIMP_TAC[]);; + +(* Dominated Convergence Theorem for non-negative sequences converging to 0. + If 0 <= f_n <= h pointwise, h integrable, and f_n -> 0, then E[f_n] -> 0. *) +let DOMINATED_CONVERGENCE_NULL = prove + (`!p:A prob_space (f:num->A->real) h. + (!n. random_variable p (f n)) /\ + random_variable p h /\ + integrable p h /\ + (!n x. x IN prob_carrier p ==> &0 <= f n x /\ f n x <= h x) /\ + (!x. x IN prob_carrier p ==> ((\n. f n x) ---> &0) sequentially) + ==> ((\n. expectation p (f n)) ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + (* Step 1: h >= 0 *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= h x` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(f:num->A->real) 0 x` THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 2: By NN_EXPECTATION_MIN_LIMIT, choose K so E[h]-E[min(h,K)] < e/2 *) + MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`] NN_EXPECTATION_MIN_LIMIT) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `K0:num` STRIP_ASSUME_TAC) THEN + ABBREV_TAC `K = &K0` THEN + SUBGOAL_THEN `&0 <= K` ASSUME_TAC THENL + [EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + (* Step 3: E[min(h,K)] close to E[h] = nn_exp(h) *) + SUBGOAL_THEN `nn_expectation (p:A prob_space) h - e / &2 < + nn_expectation p (\x. min (h x) K)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `K0:num`) THEN + REWRITE_TAC[LE_REFL] THEN EXPAND_TAC "K" THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 4: E[h] - E[min(h,K)] < e/2, rewrite in terms of expectation *) + SUBGOAL_THEN `expectation (p:A prob_space) h = + nn_expectation p h` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* f n is integrable (dominated by h) *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((f:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `h:A->real` THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= abs y`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Step 5: Define g_n = min(f_n, K), bounded by K *) + (* g_n -> 0 pointwise, |g_n| <= K *) + (* By BCT: E[g_n] -> 0 *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). min ((f:num->A->real) n x) K`; + `\x:A. &0`; + `K:real`] BOUNDED_CONVERGENCE_EXPECTATION) THEN + BETA_TAC THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* random_variable p (min(f n, K)) *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; + (* random_variable p 0 *) + REWRITE_TAC[RANDOM_VARIABLE_CONST]; + (* |min(f n x, K)| <= K *) + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ &0 <= K ==> abs(min a K) <= K`) THEN + ASM_SIMP_TAC[] THEN EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; + (* |0| <= K *) + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_ABS_NUM] THEN + EXPAND_TAC "K" THEN REWRITE_TAC[REAL_POS]; + (* min(f n x, K) -> 0 pointwise *) + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 = min (&0) (K:real)` SUBST1_TAC THENL + [REWRITE_TAC[real_min] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_MIN THEN + ASM_SIMP_TAC[REALLIM_CONST]]; + ALL_TAC] THEN + REWRITE_TAC[EXPECTATION_CONST; REAL_SUB_RZERO] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (* Step 6: Bound E[f_n] by E[min(f_n,K)] + tail bound *) + REWRITE_TAC[REAL_SUB_RZERO] THEN + (* E[f_n] >= 0 since f_n >= 0 *) + SUBGOAL_THEN `&0 <= expectation (p:A prob_space) ((f:num->A->real) n)` + ASSUME_TAC THENL + [SUBGOAL_THEN `&0 = expectation (p:A prob_space) (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* |E[min(f_n, K)]| < e/2 from BCT *) + SUBGOAL_THEN `abs(expectation (p:A prob_space) + (\x:A. min ((f:num->A->real) n x) K)) < e / &2` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO]; + ALL_TAC] THEN + (* min(f_n,K) is integrable *) + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. min ((f:num->A->real) n x) K)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `h:A->real` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= a /\ a <= h /\ &0 <= h /\ &0 <= K ==> abs(min a K) <= abs h`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* min(h,K) is integrable *) + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. min ((h:A->real) x) K)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN EXISTS_TAC `h:A->real` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + ASM_REWRITE_TAC[RANDOM_VARIABLE_CONST; ETA_AX]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= h /\ &0 <= K ==> abs(min h K) <= abs h`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* E[f_n] - E[min(f_n,K)] = E[f_n - min(f_n,K)] via EXPECTATION_SUB *) + MP_TAC(ISPECL [`p:A prob_space`; `(f:num->A->real) n`; + `(\x:A. min ((f:num->A->real) n x) K)`] EXPECTATION_SUB) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN + DISCH_TAC THEN + (* E[f_n - min(f_n,K)] <= E[h - min(h,K)] by monotonicity *) + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (f:num->A->real) n x - min (f n x) K) <= + expectation p (\x. h x - min (h x) K)` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `a <= h ==> a - min a K <= h - min h K`) THEN + ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* E[h - min(h,K)] = E[h] - E[min(h,K)] *) + MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`; + `(\x:A. min ((h:A->real) x) K)`] EXPECTATION_SUB) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN BETA_TAC THEN + DISCH_TAC THEN + (* E[min(h,K)] = nn_E[min(h,K)] *) + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. min (h x) K) = + nn_expectation p (\x. min (h x) K)` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= h /\ &0 <= K ==> &0 <= min h K`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* E[h] - E[min(h,K)] < e/2 *) + SUBGOAL_THEN `expectation (p:A prob_space) h - + expectation p (\x:A. min (h x) K) < e / &2` ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +let DOMINATED_CONVERGENCE = prove + (`!p:A prob_space X f g. + (!n. integrable p (X n)) /\ + integrable p g /\ + (!n x. x IN prob_carrier p ==> abs(X n x) <= g x) /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) + ==> integrable p f /\ + ((\n. expectation p (X n)) ---> expectation p f) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Extract random_variable from integrable *) + SUBGOAL_THEN `!n:num. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN + UNDISCH_TAC `!n:num. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* |f(x)| <= g(x) on carrier *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> abs((f:A->real) x) <= (g:A->real) x` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n:num. (X:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `~(g < f) ==> f <= g`) THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`sequentially`; `\n:num. --((X:num->A->real) n x)`; + `--((f:A->real) x)`; `--(g:A->real) x`] + REALLIM_LBOUND) THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; NOT_IMP] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_NEG THEN ASM_SIMP_TAC[]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* f is a random variable *) + SUBGOAL_THEN `random_variable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `(X:num->A->real)` THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* f is integrable *) + SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `(g:A->real)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(g:A->real) x` THEN ASM_SIMP_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= g ==> g <= abs g`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((f:A->real) x)` THEN + ASM_SIMP_TAC[REAL_ABS_POS]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* E[|X_n - f|] -> 0 via DOMINATED_CONVERGENCE_NULL *) + SUBGOAL_THEN + `((\n. expectation p (\x. abs((X:num->A->real) n x - (f:A->real) x))) + ---> &0) sequentially` + ASSUME_TAC THENL + [MATCH_MP_TAC DOMINATED_CONVERGENCE_NULL THEN + EXISTS_TAC `\x:A. &2 * (g:A->real) x` THEN + REPEAT CONJ_TAC THENL + [(* RV for |X_n - f| *) + GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `f:A->real`] + INTEGRABLE_SUB) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (X:num->A->real) n x - (f:A->real) x`] + INTEGRABLE_ABS) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + (* RV for 2*g *) + UNDISCH_TAC `integrable (p:A prob_space) (g:A->real)` THEN + DISCH_THEN(fun th -> MP_TAC(MATCH_MP INTEGRABLE_CMUL th)) THEN + DISCH_THEN(MP_TAC o SPEC `&2`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + (* integrable 2*g *) + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + (* bounds: 0 <= |X_n - f| <= 2g *) + REWRITE_TAC[] THEN REPEAT STRIP_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH + `abs(x) <= g /\ abs(f) <= g ==> abs(x - f) <= &2 * g`) THEN + ASM_SIMP_TAC[]]; + (* pointwise: |X_n x - f x| -> 0 *) + REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN + `((\n. (X:num->A->real) n x - (f:A->real) x) ---> &0) sequentially` + (fun th -> MP_TAC(MATCH_MP REALLIM_ABS th) THEN + REWRITE_TAC[REAL_ABS_NUM]) THEN + REWRITE_TAC[GSYM REALLIM_NULL] THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* E[X_n] -> E[f] from E[|X_n - f|] -> 0 *) + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x - (f:A->real) x))` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `f:A->real`] + EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + REAL_ARITH_TAC; + MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[ETA_AX]]; + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN + REAL_ARITH_TAC]);; + +(* Dominated convergence for nn_expectation: nonneg functions dominated by + an integrable function. Generalizes BOUNDED_CONVERGENCE_NN (constant B). *) +let DOMINATED_CONVERGENCE_NN = prove + (`!p:A prob_space (X:num->A->real) Y g. + (!n. random_variable p (X n)) /\ + integrable p g /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + (!n x. x IN prob_carrier p ==> X n x <= g x) /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> Y x) sequentially) + ==> ((\n. nn_expectation p (X n)) ---> nn_expectation p Y) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n. integrable p ((X:num->A->real) n)` ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `g:A->real` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= b /\ &0 <= b ==> abs a <= abs b`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n (x:A). x IN prob_carrier p ==> + abs((X:num->A->real) n x) <= (g:A->real) x` ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ a <= b ==> abs a <= b`) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `Y:A->real`; `g:A->real`] + DOMINATED_CONVERGENCE) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> &0 <= (Y:A->real) x` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n. (X:num->A->real) n x` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation p ((X:num->A->real) n) = + nn_expectation p (X n)` ASSUME_TAC THENL [ + GEN_TAC THEN MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation p (Y:A->real) = nn_expectation p Y` + ASSUME_TAC THENL [ + MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(\n. expectation p ((X:num->A->real) n)) = + (\n. nn_expectation p (X n))` SUBST_ALL_TAC THENL [ + REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[]]);; + +(* ========================================================================= *) +(* Strong law of large numbers without bounded support *) +(* ========================================================================= *) + +(* Chebyshev bound for shifted partial sums of uncorrelated RVs. + P(|sum(0..j)(X(a+i) - mu)| >= t) <= (j+1)*sigma_sq / t^2. *) +let CHEBYSHEV_SHIFTED_SUM = prove + (`!p:A prob_space X mu sigma_sq a j t. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu) /\ + (!n. variance p (X n) = sigma_sq) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + abs (sum (0..j) (\i. X (a + i) x - mu)) >= t} + <= &(SUC j) * sigma_sq * inv (t pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `f = \x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x - mu)` THEN + ABBREV_TAC `g = \x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x)` THEN + (* f = g + constant *) + SUBGOAL_THEN `f = (\x:A. (g:A->real) x + (-- &(SUC j) * mu))` + (LABEL_TAC "fg") THENL + [EXPAND_TAC "f" THEN EXPAND_TAC "g" THEN + REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + ONCE_REWRITE_TAC[SUM_SUB_NUMSEG] THEN + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* integrability of g *) + SUBGOAL_THEN `integrable (p:A prob_space) (g:A->real)` (LABEL_TAC "ig") THENL + [EXPAND_TAC "g" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] + INTEGRABLE_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* integrability of f *) + SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` (LABEL_TAC "if") THENL + [REMOVE_THEN "fg" SUBST1_TAC THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + ALL_TAC] THEN + (* E[f] = 0 *) + SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = &0` + (LABEL_TAC "ef") THENL + [REMOVE_THEN "fg" SUBST1_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + EXPAND_TAC "g" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] + EXPECTATION_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN + REAL_ARITH_TAC]; ALL_TAC] THEN + (* Var(f) = (j+1)*sigma_sq *) + SUBGOAL_THEN `variance (p:A prob_space) (f:A->real) = &(SUC j) * sigma_sq` + (LABEL_TAC "vf") THENL + [REMOVE_THEN "fg" SUBST1_TAC THEN + SUBGOAL_THEN + `variance p (\x:A. (g:A->real) x + -- &(SUC j) * mu) = variance p g` + SUBST1_TAC THENL + [MATCH_MP_TAC VARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "g" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] + VARIANCE_SUM_UNCORRELATED)) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1]]; ALL_TAC] THEN + (* integrability of (f - E[f])^2 for Chebyshev *) + SUBGOAL_THEN `integrable (p:A prob_space) (\x. ((f:A->real) x - + expectation p f) pow 2)` (LABEL_TAC "if2") THENL + [USE_THEN "ef" (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN + EXPAND_TAC "f" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x - mu`; `j:num`] + INTEGRABLE_SUM_SQUARE)) THEN + ANTS_TAC THENL + [CONJ_TAC THEN REPEAT STRIP_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; + (* integrable p (\x. (X(a+i) x - mu) pow 2) from X^2, X, and const *) + SUBGOAL_THEN `(\x:A. ((X:num->A->real) (a + i) x - mu) pow 2) = + (\x. X (a + i) x pow 2 - &2 * mu * X (a + i) x + mu pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[ETA_AX]; + REWRITE_TAC[REAL_MUL_ASSOC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[ETA_AX]]; + REWRITE_TAC[INTEGRABLE_CONST]]]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* Rewrite event using f and apply Chebyshev *) + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + abs(sum(0..j) (\i. (X:num->A->real) (a + i) x - mu)) >= t} = + {x | x IN prob_carrier p /\ abs(f x - expectation p f) >= t}` + SUBST1_TAC THENL + [USE_THEN "ef" (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + UNDISCH_TAC `(\x:A. sum (0..j) (\i. (X:num->A->real) (a + i) x - mu)) = + (f:A->real)` THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]); ALL_TAC] THEN + (* Apply Chebyshev and substitute Var(f) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance (p:A prob_space) (f:A->real) / t pow 2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC CHEBYSHEV_INEQUALITY THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[real_div; REAL_MUL_ASSOC; REAL_LE_REFL]]);; + +(* Gap control for SLLN: for each tolerance 1/(m+1), almost surely the + centered partial sums in each gap (k^2, (k+1)^2] are bounded by + (k^2+1)/(m+1). Proved via Chebyshev + union bound + Borel-Cantelli. *) +let SLLN_GAP_CONTROL = prove + (`!p:A prob_space (X:num->A->real) mu sigma_sq. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu) /\ + (!n. variance p (X n) = sigma_sq) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) + ==> !m:num. almost_surely p + {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. X i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `m:num` THEN + REWRITE_TAC[almost_surely] THEN + ABBREV_TAC `B = \k. {x:A | x IN prob_carrier p /\ + ?nn:num. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ + abs(sum(k * k + 1..nn) (\i. (X:num->A->real) i x - mu)) >= + &(SUC(k * k)) * inv(&(SUC m))}` THEN + EXISTS_TAC `limsup_events (B:num->A->bool)` THEN + (* Key subgoal: B k is a prob_event for each k *) + SUBGOAL_THEN `!k. (B:num->A->bool) k IN prob_events p` (LABEL_TAC "Bev") THENL + [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (?nn. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ + abs (sum (k * k + 1..nn) (\i. X i x - mu)) >= + &(SUC (k * k)) * inv (&(SUC m)))} = + UNIONS (IMAGE (\nn. {x:A | x IN prob_carrier p /\ + abs (sum (k * k + 1..nn) (\i. X i x - mu)) >= + &(SUC (k * k)) * inv (&(SUC m))}) + {nn | k * k < nn /\ nn <= (k + 1) * (k + 1)})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM] THEN + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `nn:num` THEN STRIP_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + (* sum(k*k+1..nn)(X_i - mu) = sum(0..nn)(X_i - mu) - sum(0..k*k)(X_i - mu) *) + SUBGOAL_THEN `(\x:A. sum(k * k + 1..nn) (\i. (X:num->A->real) i x - mu)) = + (\x. sum(0..nn) (\i. X i x - mu) - sum(0..k * k) (\i. X i x - mu))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `!a b c:real. a + b = c ==> b = c - a`) THEN + MATCH_MP_TAC SUM_COMBINE_R THEN ASM_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[integrable]]; + MATCH_MP_TAC FINITE_IMAGE THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `0..(k + 1) * (k + 1):num` THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ARITH_TAC]; + ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[] THEN + (* Need: real_summable (from 0) (\i. prob p (B i)) *) + (* Strategy: P(B k) <= C/(k^2+1) via Chebyshev + union bound, then compare *) + (* with summable 1/(k^2+1). *) + ABBREV_TAC `A = \k j. {x:A | x IN prob_carrier p /\ + abs(sum(0..j) (\i. (X:num->A->real) (k * k + 1 + i) x - mu)) >= + &(SUC(k * k)) * inv(&(SUC m))}` THEN + (* Each A k j is a prob_event *) + SUBGOAL_THEN `!k j. (A:num->num->A->bool) k j IN prob_events p` + (LABEL_TAC "Aev") THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "A" THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (k * k + 1 + i) x - mu`; + `j:num`] RANDOM_VARIABLE_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB_CONST THEN + MP_TAC(SPEC `k * k + 1 + i:num` + (ASSUME `!n. integrable (p:A prob_space) ((X:num->A->real) n)`)) THEN + REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* B k SUBSET UNIONS(IMAGE (A k) (0..2*k)) *) + SUBGOAL_THEN `!k. (B:num->A->bool) k SUBSET + UNIONS(IMAGE ((A:num->num->A->bool) k) (0..2 * k))` + (LABEL_TAC "Bsub") THENL + [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[SUBSET; UNIONS_IMAGE; IN_ELIM_THM; IN_NUMSEG; LE_0] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `nn - (k * k + 1):num` THEN + SUBGOAL_THEN `nn - (k * k + 1) <= 2 * k` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!i:num. k * k + 1 + i = (k * k + 1) + i` + (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `sum (0..nn - (k * k + 1)) + (\i:num. (X:num->A->real) ((k * k + 1) + i) x - mu) = + sum (k * k + 1..nn) (\i. X i x - mu)` + (fun th -> ASM_REWRITE_TAC[th]) THEN + MP_TAC(BETA_RULE(ISPECL [`\i:num. (X:num->A->real) i x - mu`; + `k * k + 1`; `nn:num`] SUM_OFFSET_0)) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN + AP_THM_TAC THEN AP_TERM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + ARITH_TAC; ALL_TAC] THEN + (* Comparison test: bound P(B k) by C/(k^2+1) *) + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\k. &5 * sigma_sq * &(SUC m) pow 2 * + inv(&(SUC(k * k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + REWRITE_TAC[SUMMABLE_INV_SUC_SQUARES]; ALL_TAC] THEN + EXISTS_TAC `0` THEN REWRITE_TAC[GE; LE_0; IN_FROM] THEN + X_GEN_TAC `k:num` THEN + SUBGOAL_THEN `&0 <= prob p ((B:num->A->bool) k)` + (fun th -> REWRITE_TAC[MATCH_MP + (REAL_ARITH `&0 <= x ==> abs x = x`) th]) THENL + [ASM_SIMP_TAC[PROB_POSITIVE]; ALL_TAC] THEN + (* Chain: P(B k) <= P(union) <= sum(P(A k j)) <= bound *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS(IMAGE + ((A:num->num->A->bool) k) (0..2 * k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2 * k) + (\j. prob (p:A prob_space) ((A:num->num->A->bool) k j))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_FINITE_SUBADDITIVE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Apply CHEBYSHEV_SHIFTED_SUM to each P(A k j) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2 * k) (\j. &(SUC j) * sigma_sq * + inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `j':num` THEN STRIP_TAC THEN + EXPAND_TAC "A" THEN + ONCE_REWRITE_TAC[ARITH_RULE `k * k + 1 + i:num = (k * k + 1) + i`] THEN + MATCH_MP_TAC CHEBYSHEV_SHIFTED_SUM THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_MUL THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0] THEN + MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + (* Simplify inv((N * inv(M))^2) = M^2 * inv(N^2) *) + SUBGOAL_THEN `inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2) = + &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_FIELD `~(a = &0) /\ ~(b = &0) ==> + inv((a * inv b) pow 2) = b pow 2 * inv(a pow 2)`) THEN + REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]; ALL_TAC] THEN + REWRITE_TAC[SUM_RMUL] THEN + (* sum(0..2k)(SUC j) * c <= 5*N * c, then 5*N*c = 5*sigma_sq*M^2/N *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&5 * &(SUC(k * k))) * sigma_sq * + &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [(* sum(0..2k)(SUC j) <= 5*SUC(k*k) on reals *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2*k) (\j. &(SUC(2*k)))` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN + GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN + REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN + ASM_CASES_TAC `k <= 3` THENL + [FIRST_X_ASSUM(REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC o + MATCH_MP(ARITH_RULE `k <= 3 ==> k = 0 \/ k = 1 \/ k = 2 \/ k = 3`)) THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + MATCH_MP_TAC(ARITH_RULE + `4 * k <= k * k ==> (2 * k + 1) * (2 * k + 1) <= 5 * (k * k + 1)`) THEN + ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[LE_MULT_LCANCEL] THEN + DISJ2_TAC THEN ASM_ARITH_TAC]]; + (* 0 <= sigma_sq * M^2 * inv(N^2) *) + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [SUBGOAL_THEN `sigma_sq = variance p ((X:num->A->real) 0)` SUBST1_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `0` o + check(fun th -> fst(dest_const(fst(strip_comb( + lhand(snd(dest_forall(concl th))))))) = "variance")) THEN + REWRITE_TAC[EQ_SYM_EQ]; ALL_TAC] THEN + MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `expectation p ((X:num->A->real) 0) = mu` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. ((X:num->A->real) 0 x - mu) pow 2) = + (\x. X 0 x pow 2 - &2 * mu * X 0 x + mu pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MP_TAC(SPEC `0` (ASSUME `!n. integrable p (\x:A. (X:num->A->real) n x pow 2)`)) THEN + REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN + MP_TAC(SPEC `0` (ASSUME `!n. integrable (p:A prob_space) ((X:num->A->real) n)`)) THEN + SIMP_TAC[ETA_AX]]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_LE_POW_2]]]; + (* 5*N * c = 5 * sigma_sq * M^2 * inv(N) by algebra *) + MATCH_MP_TAC(REAL_ARITH `a = b ==> a <= b`) THEN + MATCH_MP_TAC(REAL_FIELD `~(n = &0) ==> + (&5 * n) * s * m * inv(n pow 2) = &5 * s * m * inv n`) THEN + REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]]]; + (* Subset: complement of target within carrier is contained in limsup B *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; limsup_events; INTERS_GSPEC; IN_UNIV] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN + REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN + STRIP_TAC THEN X_GEN_TAC `NN:num` THEN + REWRITE_TAC[UNIONS_GSPEC; GE; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `NN:num`) THEN + ASM_REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN + DISCH_THEN(X_CHOOSE_THEN `kk:num` MP_TAC) THEN + REWRITE_TAC[DE_MORGAN_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN + STRIP_TAC THEN + EXISTS_TAC `kk:num` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[real_ge] THEN + ASM_REAL_ARITH_TAC]);; + +(* Strong Law of Large Numbers without bounded support *) +let STRONG_LAW_FINITE_VARIANCE = prove + (`!p:A prob_space (X:num->A->real) mu sigma_sq. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu) /\ + (!n. variance p (X n) = sigma_sq) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: subsequence convergence from SLLN_SUBSEQ *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially}` + ASSUME_TAC THENL + [MATCH_MP_TAC SLLN_SUBSEQ THEN + EXISTS_TAC `sigma_sq:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 2: gap control *) + SUBGOAL_THEN + `!m:num. almost_surely (p:A prob_space) + {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))}` + ASSUME_TAC THENL + [MATCH_MP_TAC SLLN_GAP_CONTROL THEN + EXISTS_TAC `sigma_sq:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: countable intersection of gap control events *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))}` + ASSUME_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `INTERS {(\m. {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))}) m | m IN (:num)}` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* Step 4: intersect subsequence and gap control *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + ({x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially} INTER + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. X i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))})` + ASSUME_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 5: on the intersection, show full convergence *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially} INTER + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. X i x - mu)) < + &(SUC(k * k)) * inv(&(SUC m))}` THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN + (* Pointwise proof: use REALLIM_SEQUENTIALLY *) + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Choose m such that inv(SUC m) < e/2 *) + SUBGOAL_THEN `?m:num. inv(&(SUC m)) < e / &2` STRIP_ASSUME_TAC THENL + [MP_TAC(SPEC `e / &2` REAL_ARCH_INV) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `nn - 1` THEN + ASM_CASES_TAC `nn = 0` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `SUC(nn - 1) = nn` SUBST1_TAC THENL + [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Get gap control N for this m *) + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `K_gap:num`) THEN + (* Get subsequence bound for e/2 *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `K_subseq:num`) THEN + (* Choose N = (K_gap + K_subseq)^2 *) + EXISTS_TAC `(K_gap + K_subseq) * (K_gap + K_subseq):num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (* Find k with k*k <= n < (k+1)*(k+1) *) + MP_TAC(SPEC `n:num` NUM_SQRT_EXISTS) THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + (* Show K_gap + K_subseq <= k *) + SUBGOAL_THEN `K_gap + K_subseq <= k:num` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + SUBGOAL_THEN `(k + 1) * (k + 1) <= (K_gap + K_subseq) * (K_gap + K_subseq):num` MP_TAC THENL + [MATCH_MP_TAC LE_MULT2 THEN ASM_ARITH_TAC; ASM_ARITH_TAC]; + ALL_TAC] THEN + (* Case split: n = k*k or k*k < n *) + ASM_CASES_TAC `n = k * k:num` THENL + [(* Case n = k*k: directly from subsequence convergence *) + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `e / &2` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_subseq:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Case k*k < n *) + SUBGOAL_THEN `k * k < n:num` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + (* Split the sum: sum(0..n) = sum(0..k*k) + sum(k*k+1..n) *) + SUBGOAL_THEN + `sum(0..n) (\i. (X:num->A->real) i x) = + sum(0..k * k) (\i. X i x) + sum(k * k + 1..n) (\i. X i x)` + ASSUME_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_ARITH_TAC; ALL_TAC] THEN + (* Centering identity: inv(SUC n) * S_n - mu = inv(SUC n) * sum(centered) *) + SUBGOAL_THEN + `inv(&(SUC n)) * sum(0..n) (\i. (X:num->A->real) i x) - mu = + inv(&(SUC n)) * sum(0..n) (\i. X i x - mu)` + SUBST1_TAC THENL + [REWRITE_TAC[SUM_SUB_NUMSEG; SUM_CONST_NUMSEG; SUB_0] THEN + SUBGOAL_THEN `&(SUC n) = &(n + 1)` (fun th -> REWRITE_TAC[GSYM th]) THENL + [REWRITE_TAC[REAL_OF_NUM_EQ; ADD1]; ALL_TAC] THEN + SUBGOAL_THEN `~(&(SUC n) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `~(&(SUC n) = &0)` THEN CONV_TAC REAL_FIELD; + ALL_TAC] THEN + (* Split the centered sum *) + SUBGOAL_THEN + `sum(0..n) (\i. (X:num->A->real) i x - mu) = + sum(0..k * k) (\i. X i x - mu) + sum(k * k + 1..n) (\i. X i x - mu)` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_ARITH_TAC; ALL_TAC] THEN + (* Get the gap bound *) + SUBGOAL_THEN + `abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < &(SUC(k * k)) * inv(&(SUC m))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_gap:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + (* Get the centered subsequence bound *) + SUBGOAL_THEN + `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu)) < e / &2` + ASSUME_TAC THENL + [SUBGOAL_THEN `inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu) = + inv(&(SUC(k * k))) * sum(0..k * k) (\i. X i x) - mu` SUBST1_TAC THENL + [REWRITE_TAC[SUM_SUB_NUMSEG; SUM_CONST_NUMSEG; SUB_0] THEN + SUBGOAL_THEN `&(SUC(k * k)) = &(k * k + 1)` (fun th -> REWRITE_TAC[GSYM th]) THENL + [REWRITE_TAC[REAL_OF_NUM_EQ; ADD1]; ALL_TAC] THEN + SUBGOAL_THEN `~(&(SUC(k * k)) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `~(&(SUC(k * k)) = &0)` THEN CONV_TAC REAL_FIELD; + FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_subseq:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]]; + ALL_TAC] THEN + (* Triangle inequality *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(inv(&(SUC n)) * sum(0..k * k) (\i. (X:num->A->real) i x - mu)) + + abs(inv(&(SUC n)) * sum(k * k + 1..n) (\i. X i x - mu))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_ADD_LDISTRIB] THEN + REWRITE_TAC[REAL_ABS_ABS] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_POS]; REWRITE_TAC[REAL_ABS_TRIANGLE]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `e / &2 + e / &2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_ADD2; + ASM_REAL_ARITH_TAC] THEN + CONJ_TAC THENL + [(* First term: |inv(SUC n) * sum(0..k*k)(centered)| < e/2 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu))` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + (* Second term: |inv(SUC n) * gap| < e/2 *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `inv(&(SUC(k * k))) * abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(&(SUC m))` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(&(SUC(k * k))) * (&(SUC(k * k)) * inv(&(SUC m)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `inv(&(SUC(k * k))) * &(SUC(k * k)) = &1` SUBST1_TAC THENL + [MATCH_MP_TAC REAL_MUL_LINV THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; + REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]]]]);; + +(* ===================================================================== *) +(* SLLN generalization: variable variance *) +(* ===================================================================== *) + + +(* Chebyshev bound for shifted sums with bounded (not constant) variance *) +let CHEBYSHEV_SHIFTED_SUM_BOUNDED = prove + (`!p:A prob_space X a j t C. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!n. variance p (X n) <= C) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + abs (sum (0..j) (\i. X (a + i) x)) >= t} + <= &(SUC j) * C * inv (t pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `f = \x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x)` THEN + SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` (LABEL_TAC "if") THENL + [EXPAND_TAC "f" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] + INTEGRABLE_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = &0` + (LABEL_TAC "ef") THENL + [EXPAND_TAC "f" THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] + EXPECTATION_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN + REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `variance (p:A prob_space) (f:A->real) <= &(SUC j) * C` + (LABEL_TAC "vf") THENL + [EXPAND_TAC "f" THEN + SUBGOAL_THEN + `variance p (\x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x)) = + sum(0..j) (\i. variance p (\x. X (a + i) x))` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (a + i) x`; + `j:num`] VARIANCE_SUM_UNCORRELATED) THEN + BETA_TAC THEN ANTS_TAC THENL + [REPEAT STRIP_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_ARITH_TAC]; + REWRITE_TAC[ETA_AX]]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..j) (\i:num. C:real)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1; REAL_LE_REFL]]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. ((f:A->real) x) pow 2)` + (LABEL_TAC "if2") THENL + [EXPAND_TAC "f" THEN MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable (p:A prob_space) (\x:A. ((f:A->real) x - &0) pow 2)` + ASSUME_TAC THENL + [SUBGOAL_THEN `(\x:A. ((f:A->real) x - &0) pow 2) = (\x. f x pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_SUB_RZERO]; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`; `t:real`] + CHEBYSHEV_INEQUALITY) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN EXPAND_TAC "f" THEN + DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance (p:A prob_space) + (\x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x)) / t pow 2` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [SUBGOAL_THEN `variance (p:A prob_space) + (\x:A. sum (0..j) (\i. (X:num->A->real) (a + i) x)) = variance p f` + SUBST1_TAC THENL + [EXPAND_TAC "f" THEN REWRITE_TAC[]; ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LE_INV THEN MATCH_MP_TAC REAL_POW_LE THEN + ASM_REAL_ARITH_TAC]);; + +(* Subsequence SLLN with bounded variance *) +let SLLN_SUBSEQ_BOUNDED = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!n. variance p (X n) <= C) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) + ==> almost_surely p + {x | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. X i x)) + ---> &0) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC BCL1_CONVERGENCE_RV THEN TRY BETA_TAC THEN + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `k * k:num`] + INTEGRABLE_SUM) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; DISCH_TAC THEN ASM_MESON_TAC[integrable]]; + ALL_TAC] THEN + X_GEN_TAC `eps:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\k:num. &2 * C / eps pow 2 * inv(&(SUC(k * k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + REWRITE_TAC[SUMMABLE_INV_SUC_SQUARES]; ALL_TAC] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `k:num` THEN + REWRITE_TAC[GE; LE_0; IN_FROM] THEN BETA_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. sum(0..k * k) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL [MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. (sum(0..k * k) (\i. (X:num->A->real) i x)) pow 2)` + ASSUME_TAC THENL [MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN ASM_MESON_TAC[integrable]; ALL_TAC] THEN + ABBREV_TAC `nn = SUC(k * k)` THEN + SUBGOAL_THEN `~(&nn = &0)` ASSUME_TAC THENL + [EXPAND_TAC "nn" THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + (* Var(S_{k^2}/nn) <= C * nn / nn^2 = C / nn *) + SUBGOAL_THEN `variance (p:A prob_space) + (\x:A. inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x)) + <= C * inv(&nn)` (LABEL_TAC "VAR") THENL + [ASM_SIMP_TAC[VARIANCE_CMUL] THEN + REWRITE_TAC[REAL_POW_2] THEN + GEN_REWRITE_TAC (RAND_CONV) [REAL_MUL_SYM] THEN + GEN_REWRITE_TAC (LAND_CONV) [GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + ASM_SIMP_TAC[VARIANCE_SUM_UNCORRELATED] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(&nn) * &nn * C:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..k * k) (\i:num. C:real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + SUBGOAL_THEN `&(k * k + 1) = &nn` SUBST1_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC; + REWRITE_TAC[REAL_LE_REFL]]]; ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `inv(&nn) * &nn = &1` + (fun th -> REWRITE_TAC[th; REAL_MUL_LID; REAL_LE_REFL]) THEN + MATCH_MP_TAC REAL_MUL_LINV THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x)) = &0` + (LABEL_TAC "EXP") THENL + [ASM_SIMP_TAC[EXPECTATION_CMUL] THEN + ASM_SIMP_TAC[EXPECTATION_SUM] THEN + ASM_SIMP_TAC[SUM_CONST_NUMSEG; SUB_0] THEN + SUBGOAL_THEN `&(k * k + 1) = &nn` SUBST1_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x) - &0) pow 2)` + ASSUME_TAC THENL + [REWRITE_TAC[REAL_SUB_RZERO] THEN + SUBGOAL_THEN `(\x:A. (inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x)) pow 2) = + (\x. inv(&nn) pow 2 * (sum(0..k * k) (\i. X i x)) pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; REAL_POW_MUL]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Apply Chebyshev *) + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ abs(inv(&nn) * sum(0..k * k) + (\i. (X:num->A->real) i x)) >= eps} = + {x | x IN prob_carrier p /\ abs(inv(&nn) * sum(0..k * k) + (\i. X i x) - expectation p + (\x. inv(&nn) * sum(0..k * k) (\i. X i x))) >= eps}` + SUBST1_TAC THENL + [USE_THEN "EXP" (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]); ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x)`; + `eps:real`] CHEBYSHEV_INEQUALITY) THEN + BETA_TAC THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance (p:A prob_space) + (\x:A. inv(&nn) * sum(0..k * k) (\i. (X:num->A->real) i x)) / eps pow 2` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `C * inv(&nn) / eps pow 2` THEN CONJ_TAC THENL + [REWRITE_TAC[real_div] THEN + GEN_REWRITE_TAC (RAND_CONV) [REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_INV THEN MATCH_MP_TAC REAL_POW_LE THEN + ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `&2 * C * inv(eps pow 2) * inv(&nn) = + &2 * (C * inv(&nn) * inv(eps pow 2))` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> x <= &2 * x`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `variance p ((X:num->A->real) 0)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `expectation p ((X:num->A->real) 0) = &0` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THEN + MATCH_MP_TAC REAL_LE_INV THEN + TRY(MATCH_MP_TAC REAL_POW_LE) THEN REWRITE_TAC[REAL_POS] THEN + ASM_REAL_ARITH_TAC]);; + +(* Gap control for SLLN with bounded variance *) +let SLLN_GAP_CONTROL_BOUNDED = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!n. variance p (X n) <= C) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) + ==> !m:num. almost_surely p + {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. X i x)) < + &(SUC(k * k)) * inv(&(SUC m))}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `m:num` THEN + REWRITE_TAC[almost_surely] THEN + ABBREV_TAC `B = \k. {x:A | x IN prob_carrier p /\ + ?nn:num. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ + abs(sum(k * k + 1..nn) (\i. (X:num->A->real) i x)) >= + &(SUC(k * k)) * inv(&(SUC m))}` THEN + EXISTS_TAC `limsup_events (B:num->A->bool)` THEN + SUBGOAL_THEN `!k. (B:num->A->bool) k IN prob_events p` (LABEL_TAC "Bev") THENL + [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (?nn. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ + abs (sum (k * k + 1..nn) (\i. X i x)) >= + &(SUC (k * k)) * inv (&(SUC m)))} = + UNIONS (IMAGE (\nn. {x:A | x IN prob_carrier p /\ + abs (sum (k * k + 1..nn) (\i. X i x)) >= + &(SUC (k * k)) * inv (&(SUC m))}) + {nn | k * k < nn /\ nn <= (k + 1) * (k + 1)})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM] THEN + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `nn:num` THEN STRIP_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + SUBGOAL_THEN `(\x:A. sum(k * k + 1..nn) (\i. (X:num->A->real) i x)) = + (\x. sum(0..nn) (\i. X i x) - sum(0..k * k) (\i. X i x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `!a b c:real. a + b = c ==> b = c - a`) THEN + MATCH_MP_TAC SUM_COMBINE_R THEN ASM_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN + ASM_MESON_TAC[integrable]]; + MATCH_MP_TAC FINITE_IMAGE THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `0..(k + 1) * (k + 1):num` THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ARITH_TAC]; + ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[] THEN + ABBREV_TAC `A = \k j. {x:A | x IN prob_carrier p /\ + abs(sum(0..j) (\i. (X:num->A->real) (k * k + 1 + i) x)) >= + &(SUC(k * k)) * inv(&(SUC m))}` THEN + SUBGOAL_THEN `!k j. (A:num->num->A->bool) k j IN prob_events p` + (LABEL_TAC "Aev") THENL + [REPEAT GEN_TAC THEN EXPAND_TAC "A" THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `\(i:num) (x:A). (X:num->A->real) (k * k + 1 + i) x`; + `j:num`] RANDOM_VARIABLE_SUM)) THEN + ANTS_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(SPEC `k * k + 1 + i:num` + (ASSUME `!n. integrable (p:A prob_space) ((X:num->A->real) n)`)) THEN + REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]; + REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!k. (B:num->A->bool) k SUBSET + UNIONS(IMAGE ((A:num->num->A->bool) k) (0..2 * k))` + (LABEL_TAC "Bsub") THENL + [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[SUBSET; UNIONS_IMAGE; IN_ELIM_THM; IN_NUMSEG; LE_0] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `nn - (k * k + 1):num` THEN + SUBGOAL_THEN `nn - (k * k + 1) <= 2 * k` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!i:num. k * k + 1 + i = (k * k + 1) + i` + (fun th -> REWRITE_TAC[th]) THENL + [ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `sum (0..nn - (k * k + 1)) + (\i:num. (X:num->A->real) ((k * k + 1) + i) x) = + sum (k * k + 1..nn) (\i. X i x)` + (fun th -> ASM_REWRITE_TAC[th]) THEN + MP_TAC(BETA_RULE(ISPECL [`\i:num. (X:num->A->real) i x`; + `k * k + 1`; `nn:num`] SUM_OFFSET_0)) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\k. &5 * C * &(SUC m) pow 2 * + inv(&(SUC(k * k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + REWRITE_TAC[SUMMABLE_INV_SUC_SQUARES]; ALL_TAC] THEN + EXISTS_TAC `0` THEN REWRITE_TAC[GE; LE_0; IN_FROM] THEN + X_GEN_TAC `k:num` THEN + SUBGOAL_THEN `&0 <= prob p ((B:num->A->bool) k)` + (fun th -> REWRITE_TAC[MATCH_MP + (REAL_ARITH `&0 <= x ==> abs x = x`) th]) THENL + [ASM_SIMP_TAC[PROB_POSITIVE]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS(IMAGE + ((A:num->num->A->bool) k) (0..2 * k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2 * k) + (\j. prob (p:A prob_space) ((A:num->num->A->bool) k j))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_FINITE_SUBADDITIVE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2 * k) (\j. &(SUC j) * C * + inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `j':num` THEN STRIP_TAC THEN + EXPAND_TAC "A" THEN + ONCE_REWRITE_TAC[ARITH_RULE `k * k + 1 + i:num = (k * k + 1) + i`] THEN + MATCH_MP_TAC CHEBYSHEV_SHIFTED_SUM_BOUNDED THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_MUL THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0] THEN + MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN `inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2) = + &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` SUBST1_TAC THENL + [MATCH_MP_TAC(REAL_FIELD `~(a = &0) /\ ~(b = &0) ==> + inv((a * inv b) pow 2) = b pow 2 * inv(a pow 2)`) THEN + REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]; ALL_TAC] THEN + REWRITE_TAC[SUM_RMUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&5 * &(SUC(k * k))) * C * + &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2*k) (\j. &(SUC(2*k)))` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN + GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN + REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN + ASM_CASES_TAC `k <= 3` THENL + [FIRST_X_ASSUM(REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC o + MATCH_MP(ARITH_RULE `k <= 3 ==> k = 0 \/ k = 1 \/ k = 2 \/ k = 3`)) THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + MATCH_MP_TAC(ARITH_RULE + `4 * k <= k * k ==> (2 * k + 1) * (2 * k + 1) <= 5 * (k * k + 1)`) THEN + ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[LE_MULT_LCANCEL] THEN + DISJ2_TAC THEN ASM_ARITH_TAC]]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance p ((X:num->A->real) 0)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN `expectation p ((X:num->A->real) 0) = &0` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_LE_POW_2]]]]; + MATCH_MP_TAC(REAL_ARITH `a = b ==> a <= b`) THEN + MATCH_MP_TAC(REAL_FIELD `~(n = &0) ==> + (&5 * n) * s * m * inv(n pow 2) = &5 * s * m * inv n`) THEN + REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; limsup_events; INTERS_GSPEC; IN_UNIV] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN + REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN + STRIP_TAC THEN X_GEN_TAC `NN:num` THEN + REWRITE_TAC[UNIONS_GSPEC; GE; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `NN:num`) THEN + ASM_REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN + DISCH_THEN(X_CHOOSE_THEN `kk:num` MP_TAC) THEN + REWRITE_TAC[DE_MORGAN_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN + STRIP_TAC THEN + EXISTS_TAC `kk:num` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[real_ge] THEN + ASM_REAL_ARITH_TAC]);; + +(* Covariance is shift-invariant *) +let COVARIANCE_SHIFT = prove + (`!p:A prob_space f g c d. + integrable p f /\ integrable p g + ==> covariance p (\x. f x - c) (\x. g x - d) = covariance p f g`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[covariance] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (f:A->real) x - c) = + expectation p f - c` SUBST1_TAC THENL + [W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. (g:A->real) x - d) = + expectation p g - d` SUBST1_TAC THENL + [W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN + AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + REAL_ARITH_TAC);; + +(* SLLN with bounded variance and variable mean *) +let SLLN_BOUNDED_VARIANCE = prove + (`!p:A prob_space (X:num->A->real) mu C. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu n) /\ + (!n. variance p (X n) <= C) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * + sum(0..n) (\i. X i x - mu i)) ---> &0) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Center: define Y_n = X_n - mu_n *) + ABBREV_TAC `Y = \n (x:A). (X:num->A->real) n x - (mu:num->real) n` THEN + (* Y_n has mean 0 *) + SUBGOAL_THEN `!n. expectation (p:A prob_space) ((Y:num->A->real) n) = &0` + (LABEL_TAC "EY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + ASM_REWRITE_TAC[ETA_AX] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Y_n integrable *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((Y:num->A->real) n)` + (LABEL_TAC "IY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; + ALL_TAC] THEN + (* Y_n^2 integrable *) + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x:A. (Y:num->A->real) n x pow 2)` (LABEL_TAC "IY2") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + SUBGOAL_THEN `(\x:A. ((X:num->A->real) n x - mu n) pow 2) = + (\x. X n x pow 2 + (--(&2 * mu n) * X n x + (mu n) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_SIMP_TAC[ETA_AX]; + REWRITE_TAC[INTEGRABLE_CONST]]]]; + ALL_TAC] THEN + (* Var(Y_n) = Var(X_n) *) + SUBGOAL_THEN `!n. variance (p:A prob_space) ((Y:num->A->real) n) = + variance p ((X:num->A->real) n)` (LABEL_TAC "VY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + REWRITE_TAC[real_sub] THEN MATCH_MP_TAC VARIANCE_SHIFT THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Var(Y_n) <= C *) + SUBGOAL_THEN `!n. variance (p:A prob_space) ((Y:num->A->real) n) <= C` + (LABEL_TAC "VYC") THENL + [GEN_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Cov(Y_i, Y_j) = 0 *) + SUBGOAL_THEN `!i j. ~(i = j) ==> + covariance (p:A prob_space) ((Y:num->A->real) i) (Y j) = &0` + (LABEL_TAC "CY") THENL + [REPEAT STRIP_TAC THEN EXPAND_TAC "Y" THEN + SUBGOAL_THEN + `covariance p (\x:A. (X:num->A->real) i x - mu i) + (\x. X j x - mu j) = + covariance p (X i) (X j)` SUBST1_TAC THENL + [MATCH_MP_TAC COVARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* The sum of Y_i equals sum of (X_i - mu_i) *) + SUBGOAL_THEN + `!n x:A. sum(0..n) (\i. (Y:num->A->real) i x) = + sum(0..n) (\i. (X:num->A->real) i x - mu i)` + (LABEL_TAC "SY") THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC SUM_EQ THEN + REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + EXPAND_TAC "Y" THEN REWRITE_TAC[]; + ALL_TAC] THEN + (* Apply SLLN_SUBSEQ_BOUNDED and SLLN_GAP_CONTROL_BOUNDED to Y *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (Y:num->A->real) i x)) + ---> &0) sequentially}` + (LABEL_TAC "SUBSEQ") THENL + [MATCH_MP_TAC SLLN_SUBSEQ_BOUNDED THEN + EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!m:num. almost_surely (p:A prob_space) + {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (Y:num->A->real) i x)) < + &(SUC(k * k)) * inv(&(SUC m))}` + (LABEL_TAC "GAP") THENL + [MATCH_MP_TAC SLLN_GAP_CONTROL_BOUNDED THEN + EXISTS_TAC `C:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Rewrite goal from X - mu to Y *) + USE_THEN "SY" (fun th -> REWRITE_TAC[GSYM th]) THEN + (* Now follow STRONG_LAW_FINITE_VARIANCE pattern *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (Y:num->A->real) i x)) < + &(SUC(k * k)) * inv(&(SUC m))}` + (LABEL_TAC "GAP_ALL") THENL + [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `INTERS {(\m. {x:A | ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. (Y:num->A->real) i x)) < + &(SUC(k * k)) * inv(&(SUC m))}) m | m IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN REWRITE_TAC[] THEN + USE_THEN "GAP" (fun th -> REWRITE_TAC[th]); + REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `almost_surely (p:A prob_space) + ({x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (Y:num->A->real) i x)) ---> &0) sequentially} INTER + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. Y i x)) < + &(SUC(k * k)) * inv(&(SUC m))})` + (LABEL_TAC "BOTH") THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN + CONJ_TAC THENL + [USE_THEN "SUBSEQ" (fun th -> REWRITE_TAC[th]); + USE_THEN "GAP_ALL" (fun th -> REWRITE_TAC[th])]; + ALL_TAC] THEN + (* Remove SY to prevent ASM_REWRITE_TAC/ASM_SIMP_TAC from rewriting + Y sums back to X-mu sums in the pointwise argument *) + REMOVE_THEN "SY" (fun _ -> ALL_TAC) THEN + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (Y:num->A->real) i x)) ---> &0) sequentially} INTER + {x:A | !m. ?N:num. !k. N <= k ==> + !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> + abs(sum(k * k + 1..n) (\i. Y i x)) < + &(SUC(k * k)) * inv(&(SUC m))}` THEN + CONJ_TAC THENL + [USE_THEN "BOTH" (fun th -> REWRITE_TAC[th]); ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `?m:num. inv(&(SUC m)) < e / &2` STRIP_ASSUME_TAC THENL + [MP_TAC(SPEC `e / &2` REAL_ARCH_INV) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `nn - 1` THEN + ASM_CASES_TAC `nn = 0` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `SUC(nn - 1) = nn` SUBST1_TAC THENL + [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `K_gap:num`) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_TAC `K_subseq:num`) THEN + EXISTS_TAC `(K_gap + K_subseq) * (K_gap + K_subseq):num` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MP_TAC(SPEC `n:num` NUM_SQRT_EXISTS) THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `K_gap + K_subseq <= k:num` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + SUBGOAL_THEN `(k + 1) * (k + 1) <= (K_gap + K_subseq) * (K_gap + K_subseq):num` MP_TAC THENL + [MATCH_MP_TAC LE_MULT2 THEN ASM_ARITH_TAC; ASM_ARITH_TAC]; + ALL_TAC] THEN + ASM_CASES_TAC `n = k * k:num` THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `e / &2` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_subseq:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[REAL_SUB_RZERO]]; + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `k * k < n:num` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `sum(0..n) (\i. (Y:num->A->real) i x) = + sum(0..k * k) (\i. Y i x) + sum(k * k + 1..n) (\i. Y i x)` + ASSUME_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs(sum(k * k + 1..n) (\i. (Y:num->A->real) i x)) < &(SUC(k * k)) * inv(&(SUC m))` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_gap:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (Y:num->A->real) i x)) < e / &2` + ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o + check (fun th -> free_in `K_subseq:num` (concl th))) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; REWRITE_TAC[REAL_SUB_RZERO]]; + ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(inv(&(SUC n)) * sum(0..k * k) (\i. (Y:num->A->real) i x)) + + abs(inv(&(SUC n)) * sum(k * k + 1..n) (\i. Y i x))` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `inv(&(SUC n)) * sum(0..n) (\i. (Y:num->A->real) i x) = + inv(&(SUC n)) * sum(0..k * k) (\i. Y i x) + + inv(&(SUC n)) * sum(k * k + 1..n) (\i. Y i x)` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN AP_TERM_TAC THEN + UNDISCH_TAC `sum (0..n) (\i. (Y:num->A->real) i x) = + sum (0..k * k) (\i. Y i x) + + sum (k * k + 1..n) (\i. Y i x)` THEN + SIMP_TAC[]; + REWRITE_TAC[REAL_ABS_TRIANGLE]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `e / &2 + e / &2` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (Y:num->A->real) i x))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `inv(&(SUC(k * k))) * abs(sum(k * k + 1..n) (\i. (Y:num->A->real) i x))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(&(SUC m))` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(&(SUC(k * k))) * (&(SUC(k * k)) * inv(&(SUC m)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `inv(&(SUC(k * k))) * &(SUC(k * k)) = &1` SUBST1_TAC THENL + [MATCH_MP_TAC REAL_MUL_LINV THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; + REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]]]]; + REAL_ARITH_TAC]);; + +(* ================================================================== *) +(* Step 3: Dyadic summation interchange lemmas *) +(* ================================================================== *) + +(* Dyadic blocks [2^j, 2^{j+1}-1] partition [1, 2^{N+1}-1] *) +let DYADIC_PARTITION_SUM = prove + (`!h N. sum(0..N) (\j. sum(2 EXP j..2 EXP (SUC j) - 1) h) = + sum(1..2 EXP (SUC N) - 1) h`, + GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG] THEN CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[EXP]; ALL_TAC] THEN + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `0 < 2 EXP (SUC N)` ASSUME_TAC THENL + [REWRITE_TAC[LT_NZ; EXP_EQ_0] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `0 < 2 EXP SUC (SUC N)` ASSUME_TAC THENL + [REWRITE_TAC[LT_NZ; EXP_EQ_0] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `2 EXP SUC (SUC N) = 2 * 2 EXP (SUC N)` ASSUME_TAC THENL + [REWRITE_TAC[EXP] THEN ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC SUM_COMBINE_L THEN ASM_ARITH_TAC);; + +(* For k in [2^j, 2^{j+1}-1]: inv(4^j) <= 4 * inv((k+1)^2) *) +let DYADIC_BLOCK_INV_BOUND = prove + (`!j k. 2 EXP j <= k /\ k < 2 EXP (SUC j) + ==> inv(&(2 EXP j) pow 2) <= &4 * inv(&(SUC k) pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(&(2 EXP (SUC j)) pow 2) * &4` THEN CONJ_TAC THENL + [SUBGOAL_THEN `&(2 EXP (SUC j)) = &2 * &(2 EXP j)` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_MUL; EXP] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_POW_MUL] THEN + CONV_TAC REAL_RAT_REDUCE_CONV THEN + REWRITE_TAC[REAL_INV_MUL] THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_ARITH `a * &4 <= &4 * b <=> a <= b`] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + ASM_ARITH_TAC; + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_POS]; + REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC]]]);; + +(* Nonneg series with bounded partial sums is summable *) +let REAL_SUMMABLE_BOUND_PARTIAL = prove + (`!f B. (!n. &0 <= f n) /\ (!N. sum(0..N) f <= B) + ==> real_summable (from 0) f`, + REPEAT STRIP_TAC THEN REWRITE_TAC[real_summable; real_sums] THEN + REWRITE_TAC[FROM_INTER_NUMSEG] THEN + MATCH_MP_TAC CONVERGENT_REAL_BOUNDED_MONOTONE THEN CONJ_TAC THENL + [REWRITE_TAC[real_bounded; IN_IMAGE; IN_UNIV] THEN + EXISTS_TAC `abs B` THEN X_GEN_TAC `y:real` THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` SUBST1_TAC) THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= s /\ s <= B ==> abs s <= abs B`) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + DISJ1_TAC THEN GEN_TAC THEN REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> a <= a + x`) THEN + ASM_REWRITE_TAC[]]);; + +(* Block version: summability of dyadic block sums *) +let SUMMABLE_VARIANCE_DYADIC_BLOCK = prove + (`!V. (!n. &0 <= V n) /\ + real_summable (from 0) (\n. V n / &(SUC n) pow 2) + ==> real_summable (from 0) + (\j. sum(2 EXP j..2 EXP (SUC j) - 1) V / + &(2 EXP j) pow 2)`, + GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `h = \k:num. (V:num->real) k / &(SUC k) pow 2` THEN + SUBGOAL_THEN `!k:num. &0 <= (h:num->real) k` ASSUME_TAC THENL + [EXPAND_TAC "h" THEN GEN_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_LE THEN + REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + SUBGOAL_THEN + `!j. sum(2 EXP j..2 EXP (SUC j) - 1) V / &(2 EXP j) pow 2 <= + &4 * sum(2 EXP j..2 EXP (SUC j) - 1) h` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[real_div] THEN + SUBGOAL_THEN + `sum(2 EXP j..2 EXP (SUC j) - 1) V * inv(&(2 EXP j) pow 2) = + sum(2 EXP j..2 EXP (SUC j) - 1) (\k. V k * inv(&(2 EXP j) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[SUM_RMUL]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `sum(2 EXP j..2 EXP (SUC j) - 1) (\k. &4 * h k)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN + EXPAND_TAC "h" THEN REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `V (i:num) * (&4 * inv(&(SUC i) pow 2))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC DYADIC_BLOCK_INV_BOUND THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `i <= 2 EXP SUC j - 1` THEN + SUBGOAL_THEN `1 <= 2 EXP (SUC j)` MP_TAC THENL + [REWRITE_TAC[ONE; LE_SUC_LT; LT_NZ; EXP_EQ_0] THEN ARITH_TAC; + ARITH_TAC]]; + REWRITE_TAC[REAL_MUL_AC] THEN REWRITE_TAC[REAL_LE_REFL]]; + REWRITE_TAC[SUM_LMUL; REAL_LE_REFL]]; ALL_TAC] THEN + SUBGOAL_THEN + `real_summable (from 0) (\j. sum(2 EXP j..2 EXP (SUC j) - 1) (h:num->real))` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC `real_infsum (from 0) (h:num->real)` THEN + CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + GEN_TAC THEN BETA_TAC THEN REWRITE_TAC[DYADIC_PARTITION_SUM] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..2 EXP (SUC N) - 1) h` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN ASM_REWRITE_TAC[FINITE_NUMSEG] THEN + REWRITE_TAC[SUBSET; IN_NUMSEG] THEN ARITH_TAC; + MP_TAC(ISPECL [`h:num->real`; `from 0`; `2 EXP (SUC N) - 1`] + REAL_PARTIAL_SUMS_LE_INFSUM) THEN + ASM_REWRITE_TAC[FROM_INTER_NUMSEG; IN_FROM; LE_0]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\j. &4 * sum(2 EXP j..2 EXP (SUC j) - 1) (h:num->real)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN ASM_REWRITE_TAC[]; + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; + ASM_REWRITE_TAC[]]]);; + +(* Full prefix version: summability of sum(0..2^j-1) V / (2^j)^2 *) +let SUMMABLE_VARIANCE_DYADIC = prove + (`!V. (!n. &0 <= V n) /\ + real_summable (from 0) (\n. V n / &(SUC n) pow 2) + ==> real_summable (from 0) + (\j. sum(0..2 EXP j - 1) V / &(2 EXP j) pow 2)`, + GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `a = \j. sum(0..2 EXP j - 1) (V:num->real) / &(2 EXP j) pow 2` THEN + ABBREV_TAC `c = \j. sum(2 EXP j..2 EXP (SUC j) - 1) (V:num->real) / &(2 EXP j) pow 2` THEN + SUBGOAL_THEN `real_summable (from 0) (c:num->real)` ASSUME_TAC THENL + [EXPAND_TAC "c" THEN MATCH_MP_TAC SUMMABLE_VARIANCE_DYADIC_BLOCK THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!j. &0 <= (a:num->real) j` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "a" THEN MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; ALL_TAC] THEN + SUBGOAL_THEN `!j. &0 <= (c:num->real) j` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "c" THEN MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; ALL_TAC] THEN + (* Recurrence: a(SUC j) = inv(4) * a(j) + inv(4) * c(j) *) + SUBGOAL_THEN `!j. (a:num->real) (SUC j) = inv(&4) * a j + inv(&4) * c j` + (LABEL_TAC "REC") THENL + [GEN_TAC THEN EXPAND_TAC "a" THEN EXPAND_TAC "c" THEN + SUBGOAL_THEN `sum(0..2 EXP (SUC j) - 1) V = + sum(0..2 EXP j - 1) (V:num->real) + sum(2 EXP j..2 EXP (SUC j) - 1) V` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`V:num->real`; `0`; `2 EXP j`; `2 EXP (SUC j) - 1`] SUM_COMBINE_L) THEN + ANTS_TAC THENL + [REWRITE_TAC[EXP; LT_NZ; EXP_EQ_0] THEN ARITH_TAC; + SUBGOAL_THEN `2 EXP j - 1 + 1 = 2 EXP j` SUBST1_TAC THENL + [SUBGOAL_THEN `1 <= 2 EXP j` MP_TAC THENL + [REWRITE_TAC[ONE; LE_SUC_LT; LT_NZ; EXP_EQ_0] THEN ARITH_TAC; ARITH_TAC]; + SIMP_TAC[]]]; ALL_TAC] THEN + SUBGOAL_THEN `&(2 EXP (SUC j)) pow 2 = &4 * &(2 EXP j) pow 2` SUBST1_TAC THENL + [REWRITE_TAC[EXP; GSYM REAL_OF_NUM_MUL; REAL_POW_MUL] THEN + CONV_TAC REAL_RAT_REDUCE_CONV; ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_INV_MUL; REAL_ADD_RDISTRIB] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= real_infsum (from 0) (c:num->real)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum((from 0) INTER (0..0)) (c:num->real)` THEN CONJ_TAC THENL + [REWRITE_TAC[FROM_INTER_NUMSEG; SUM_SING_NUMSEG] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_PARTIAL_SUMS_LE_INFSUM THEN ASM_REWRITE_TAC[IN_FROM; LE_0]]; + ALL_TAC] THEN + (* Bounded partial sums imply summability *) + MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC `&4 / &3 * (a:num->real) 0 + &1 / &3 * real_infsum (from 0) c` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= s /\ s <= a0 + inv(&4) * s + inv(&4) * C + ==> s <= &4 / &3 * a0 + &1 / &3 * C`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_CASES_TAC `N = 0` THENL + [ASM_REWRITE_TAC[SUM_SING_NUMSEG] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ &0 <= y ==> a <= a + x + y`) THEN + CONJ_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `?M. N = SUC M` (X_CHOOSE_THEN `M:num` SUBST_ALL_TAC) THENL + [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + SUBGOAL_THEN `sum(0..SUC M) (a:num->real) = + a 0 + inv(&4) * sum(0..M) a + inv(&4) * sum(0..M) c` MP_TAC THENL + [MP_TAC(ISPECL [`a:num->real`; `0`; `SUC M`] SUM_CLAUSES_LEFT) THEN + REWRITE_TAC[LE_0] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[ADD1] THEN AP_TERM_TAC THEN + MP_TAC(ISPECL [`1`; `a:num->real`; `0`; `M:num`] SUM_OFFSET) THEN + REWRITE_TAC[ADD_CLAUSES] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[GSYM ADD1] THEN + USE_THEN "REC" (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[SUM_ADD_NUMSEG; SUM_LMUL]; ALL_TAC] THEN + SUBGOAL_THEN `sum(0..M) (a:num->real) <= sum(0..SUC M) a` MP_TAC THENL + [REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> a <= a + x`) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..M) (c:num->real) <= real_infsum (from 0) c` MP_TAC THENL + [MP_TAC(ISPECL [`c:num->real`; `from 0`; `M:num`] REAL_PARTIAL_SUMS_LE_INFSUM) THEN + ASM_REWRITE_TAC[FROM_INTER_NUMSEG; IN_FROM; LE_0]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= inv(&4)` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC; ALL_TAC] THEN + REAL_ARITH_TAC);; + +(* Step 4: SLLN dyadic subsequence convergence *) +(* S_{2^j} / 2^j -> 0 a.s. under summable variance condition *) +let SLLN_SUBSEQ_DYADIC = prove + (`!p:A prob_space X. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> almost_surely p + {x | ((\j. inv(&(2 EXP j)) * sum(0..2 EXP j - 1) (\i. X i x)) + ---> &0) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC BCL1_CONVERGENCE_RV THEN BETA_TAC THEN + CONJ_TAC THENL + [(* Each Y_j = inv(2^j) * sum Xi is a random variable *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `2 EXP j - 1`] + INTEGRABLE_SUM) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[integrable] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* Summability of deviation probabilities *) + X_GEN_TAC `eps:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\j:num. inv(eps pow 2) * + (sum(0..2 EXP j - 1) (\i. variance p ((X:num->A->real) i)) / + &(2 EXP j) pow 2)` THEN + CONJ_TAC THENL + [(* Comparison is summable *) + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC SUMMABLE_VARIANCE_DYADIC THEN BETA_TAC THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN BETA_TAC THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO]; ALL_TAC] THEN + (* Pointwise bound via Chebyshev *) + EXISTS_TAC `0` THEN X_GEN_TAC `j:num` THEN + REWRITE_TAC[GE; LE_0; IN_FROM] THEN BETA_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. sum(0..2 EXP j - 1) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN BETA_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (sum(0..2 EXP j - 1) (\i. (X:num->A->real) i x)) pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN BETA_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ABBREV_TAC `nn = 2 EXP j` THEN + SUBGOAL_THEN `~(&nn = &0)` ASSUME_TAC THENL + [EXPAND_TAC "nn" THEN REWRITE_TAC[REAL_OF_NUM_EQ; EXP_EQ_0] THEN + ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) (\i. (X:num->A->real) i x)) = &0` + (LABEL_TAC "EXP") THENL + [ASM_SIMP_TAC[EXPECTATION_CMUL] THEN + ASM_SIMP_TAC[EXPECTATION_SUM] THEN + ASM_REWRITE_TAC[SUM_0; REAL_MUL_RZERO]; ALL_TAC] THEN + SUBGOAL_THEN + `variance (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) (\i. (X:num->A->real) i x)) = + inv(&nn) pow 2 * sum(0..nn - 1) (\i. variance p (X i))` + (LABEL_TAC "VAR") THENL + [ASM_SIMP_TAC[VARIANCE_CMUL] THEN AP_TERM_TAC THEN + ASM_SIMP_TAC[VARIANCE_SUM_UNCORRELATED]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x) - &0) pow 2)` + ASSUME_TAC THENL + [REWRITE_TAC[REAL_SUB_RZERO; REAL_POW_MUL] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [(* prob >= 0 *) + MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `nn - 1`] + INTEGRABLE_SUM) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[integrable] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* Apply Chebyshev via transitivity *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) / eps pow 2` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + abs(inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) >= eps} = + {x | x IN prob_carrier p /\ + abs((\x. inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) x - + expectation p (\x. inv(&nn) * sum(0..nn - 1) + (\i. X i x))) >= eps}` + SUBST1_TAC THENL + [CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO]; + ALL_TAC] THEN + MATCH_MP_TAC CHEBYSHEV_INEQUALITY THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[VARIANCE_CMUL] THEN + SUBGOAL_THEN `variance (p:A prob_space) + (\x:A. sum(0..nn - 1) (\i. (X:num->A->real) i x)) = + sum(0..nn - 1) (\i. variance p (X i))` SUBST1_TAC THENL + [ASM_SIMP_TAC[VARIANCE_SUM_UNCORRELATED]; ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_INV_POW; GSYM REAL_MUL_ASSOC] THEN + REWRITE_TAC[REAL_MUL_AC] THEN + REAL_ARITH_TAC);; + +(* ================================================================== *) +(* Kolmogorov's maximal inequality -- helper lemmas and main theorem *) +(* ================================================================== *) + +(* First-crossing events: A_k = {x | all j=t} *) +(* These partition {max_{k<=n} |S_k| >= t} into disjoint measurable sets *) + +let FIRST_CROSSING_EVENTS_MEASURABLE = prove + (`!p X (k:num) (n:num) (t:real). + (!i. i <= n ==> integrable (p:A prob_space) ((X:num->A->real) i)) /\ + k <= n /\ &0 < t + ==> {x:A | x IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. X i x)) < t) /\ + abs(sum(0..k) (\i. X i x)) >= t} IN prob_events p`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!k'. k' <= k ==> + {x:A | x IN prob_carrier p /\ + (!j. j < k' ==> abs(sum(0..j) (\i. (X:num->A->real) i x)) < t)} IN + prob_events p` (LABEL_TAC "Hforall") THENL + [INDUCT_TAC THENL + [REWRITE_TAC[LT] THEN DISCH_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p} = prob_carrier p` + SUBST1_TAC THENL + [SET_TAC[]; REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; + DISCH_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (!j. j < SUC k' ==> abs(sum(0..j) (\i. (X:num->A->real) i x)) < t)} = + {x | x IN prob_carrier p /\ + (!j. j < k' ==> abs(sum(0..j) (\i. X i x)) < t)} INTER + {x | x IN prob_carrier p /\ abs(sum(0..k') (\i. X i x)) < t}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN X_GEN_TAC `j:num` THEN + REWRITE_TAC[LT] THEN STRIP_TAC THENL + [ASM_MESON_TAC[]; ASM_MESON_TAC[LT]]]; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_STRICT_LT THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN + MP_TAC(ASSUME + `!i. i <= n ==> integrable (p:A prob_space) + ((X:num->A->real) i)`) THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]]]]; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. (X:num->A->real) i x)) < t) /\ + abs(sum(0..k) (\i. X i x)) >= t} = + {x | x IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. X i x)) < t)} INTER + {x | x IN prob_carrier p /\ abs(sum(0..k) (\i. X i x)) >= t}` + SUBST1_TAC THENL + [SET_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [USE_THEN "Hforall" (MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[LE_REFL]; + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + REPEAT STRIP_TAC THEN + MP_TAC(ASSUME + `!i. i <= n ==> integrable (p:A prob_space) + ((X:num->A->real) i)`) THEN + DISCH_THEN(MP_TAC o SPEC `i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]]);; + +let FIRST_CROSSING_EVENTS_DISJOINT = prove + (`!p X (n:num) (t:real). + !j k. j < k /\ k <= n + ==> DISJOINT + {x:A | x IN prob_carrier p /\ + (!i. i < j ==> abs(sum(0..i) (\m. X m x)) < t) /\ + abs(sum(0..j) (\m. X m x)) >= t} + {x | x IN prob_carrier p /\ + (!i. i < k ==> abs(sum(0..i) (\m. X m x)) < t) /\ + abs(sum(0..k) (\m. X m x)) >= t}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ASM_REWRITE_TAC[REAL_NOT_LT] THEN ASM_ARITH_TAC);; + +let FIRST_CROSSING_EVENTS_UNION = prove + (`!p X (n:num) (t:real). + UNIONS (IMAGE (\k. {x:A | x IN prob_carrier p /\ + (!i. i < k ==> abs(sum(0..i) (\m. X m x)) < t) /\ + abs(sum(0..k) (\m. X m x)) >= t}) (0..n)) = + {x | x IN prob_carrier p /\ ?k. k <= n /\ abs(sum(0..k) (\m. X m x)) >= t}`, + REPEAT GEN_TAC THEN + REWRITE_TAC[EXTENSION; IN_UNIONS; IN_ELIM_THM; + EXISTS_IN_IMAGE; IN_NUMSEG; LE_0] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [STRIP_TAC THEN CONJ_TAC THENL [ASM_REWRITE_TAC[]; ASM_MESON_TAC[]]; + ALL_TAC] THEN + STRIP_TAC THEN + MP_TAC(ISPEC `\k. k <= n /\ abs(sum(0..k) (\m. (X:num->A->real) m x)) >= t` + num_WOP) THEN + REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o fst o EQ_IMP_RULE) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + STRIP_TAC THEN EXISTS_TAC `n':num` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `j:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ASM_REWRITE_TAC[DE_MORGAN_THM] THEN + REWRITE_TAC[real_ge; REAL_NOT_LE] THEN ASM_ARITH_TAC);; + +(* Integrable implies random variable *) +let INTEGRABLE_IMP_RANDOM_VARIABLE = prove + (`!p:A prob_space (f:A->real). integrable p f ==> random_variable p f`, + SIMP_TAC[integrable]);; + +(* Helper: integrable f and a measurable ==> integrable (\x. f x * 1_a x) *) +let INTEGRABLE_MUL_INDICATOR_FN = prove + (`!p f (a:A->bool). integrable p f /\ a IN prob_events p + ==> integrable p (\x. f x * indicator_fn a x)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `f:A->real` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [SUBGOAL_THEN `random_variable (p:A prob_space) f /\ + random_variable p (indicator_fn (a:A->bool))` + (fun th -> MP_TAC(MATCH_MP RANDOM_VARIABLE_MUL th)) THENL + [ASM_SIMP_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE; INTEGRABLE_INDICATOR]; + REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_ABS_NUM; REAL_ABS_POS] THEN + REAL_ARITH_TAC]);; + +(* Helper: integrable f ==> integrable (\x. c * f x) *) +let INTEGRABLE_CMUL_ALT = prove + (`!p c (f:A->real). integrable p f ==> integrable p (\x. c * f x)`, + REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `c:real`; `f:A->real`] INTEGRABLE_CMUL) THEN + ASM_REWRITE_TAC[]);; + +(* Kolmogorov's maximal inequality. + The cross-term hypothesis is the key technical condition needed for + the first-crossing argument. It follows from mutual independence + but not from pairwise uncorrelation alone. + Proof uses the correction term C(x) = sum_k S_k D_k 1_{A_k} where + A_k are first-crossing events, S_k = sum(0..k)(X_i), D_k = sum(k+1..n)(X_i). + Key identity: S_n^2 - 2*C(x) = S_j^2 + D_j^2 >= t^2 on A_j. *) +let KOLMOGOROV_MAXIMAL_INEQ = prove + (`!p X (n:num) (t:real). + (!i. i <= n ==> integrable (p:A prob_space) ((X:num->A->real) i)) /\ + (!i. i <= n ==> integrable p (\x. X i x pow 2)) /\ + (!i. i <= n ==> expectation p (X i) = &0) /\ + (!i j. i <= n /\ j <= n /\ ~(i = j) + ==> covariance p (X i) (X j) = &0) /\ + (!k. k < n ==> + expectation p (\x. sum(0..k) (\i. X i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn + {y:A | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. X i y)) < t) /\ + abs(sum(0..k) (\i. X i y)) >= t} x) = &0) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + ?k. k <= n /\ abs(sum(0..k) (\i. X i x)) >= t} + <= sum(0..n) (\i. variance p (X i)) / t pow 2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Abbreviate the event set and first-crossing events *) + ABBREV_TAC `EV = {x:A | x IN prob_carrier p /\ + (?k. k <= n /\ abs(sum(0..k) (\i. (X:num->A->real) i x)) >= t)}` THEN + ABBREV_TAC `A = \k. {x:A | x IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. (X:num->A->real) i x)) < t) /\ + abs(sum(0..k) (\i. X i x)) >= t}` THEN + (* A_k are measurable events *) + SUBGOAL_THEN `!k. k <= n ==> (A:num->A->bool) k IN prob_events p` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN EXPAND_TAC "A" THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `k:num`; `n:num`; + `t:real`] FIRST_CROSSING_EVENTS_MEASURABLE) THEN + ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* EV = union of A_k *) + SUBGOAL_THEN `EV:A->bool = UNIONS(IMAGE A (0..n))` ASSUME_TAC THENL + [EXPAND_TAC "EV" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[GSYM FIRST_CROSSING_EVENTS_UNION]; + ALL_TAC] THEN + (* EV is a measurable event *) + SUBGOAL_THEN `(EV:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_NUMSEG] THEN ASM_SIMP_TAC[]; + SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG]]; + ALL_TAC] THEN + (* Integrability chain *) + SUBGOAL_THEN `!k. k <= n ==> + integrable p (\x. sum(0..k) (\i. (X:num->A->real) i x) pow 2)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN + ASM_MESON_TAC[LE_TRANS]; ALL_TAC] THEN + SUBGOAL_THEN `!k. k <= n ==> + random_variable p (\x. sum(0..k) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN + ASM_MESON_TAC[LE_TRANS; INTEGRABLE_IMP_RANDOM_VARIABLE]; ALL_TAC] THEN + SUBGOAL_THEN `!k. k <= n ==> integrable p + (\x. sum(0..k) (\i. (X:num->A->real) i x) * sum(0..n) (\i. X i x))` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. sum(0..k) (\i. (X:num->A->real) i x)`; + `\x:A. sum(0..n) (\i. (X:num->A->real) i x)`] + INTEGRABLE_MUL_SQUARE) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_SIMP_TAC[LE_REFL]; + ALL_TAC] THEN + (* Sum decomposition *) + SUBGOAL_THEN `!k (x:A). k <= n ==> + sum(0..k) (\i. (X:num->A->real) i x) + sum(SUC k..n) (\i. X i x) = + sum(0..n) (\i. X i x)` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `0`; `k:num`; `n:num`] + SUM_COMBINE_R) THEN + REWRITE_TAC[ADD1] THEN ANTS_TAC THENL [ASM_ARITH_TAC; REAL_ARITH_TAC]; + ALL_TAC] THEN + (* S_k * D_k integrable *) + SUBGOAL_THEN `!k. k <= n ==> integrable p + (\x. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x))` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x)) = + (\x. sum(0..k) (\i. X i x) * sum(0..n) (\i. X i x) - + sum(0..k) (\i. X i x) pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + SUBGOAL_THEN `sum(0..k) (\i. (X:num->A->real) i x) + + sum(SUC k..n) (\i. X i x) = sum(0..n) (\i. X i x)` MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `x:A`]) THEN + ASM_REWRITE_TAC[]; + DISCH_THEN(SUBST1_TAC o SYM) THEN + REWRITE_TAC[REAL_POW_2; REAL_ADD_LDISTRIB] THEN REAL_ARITH_TAC]; + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* S_k * D_k * 1_{A_k} integrable *) + SUBGOAL_THEN `!k. k <= n ==> integrable p + (\x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x)` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(\x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn ((A:num->A->bool) k) x) = + (\x. (sum(0..k) (\i. X i x) * sum(SUC k..n) (\i. X i x)) * + indicator_fn (A k) x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < t pow 2` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_POW_LT]; ALL_TAC] THEN + (* Reduce P(EV) <= V/t^2 to t^2 * P(EV) <= V *) + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + (* Rewrite sum of variances as E[S_n^2] *) + SUBGOAL_THEN `sum(0..n) (\i. variance p ((X:num->A->real) i)) = + expectation p (\x. sum(0..n) (\i. X i x) pow 2)` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`] + VARIANCE_SUM_UNCORRELATED) THEN + ANTS_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. sum(0..n) (\i. (X:num->A->real) i x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[VARIANCE_ALT; LE_REFL] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. sum(0..n) (\i. (X:num->A->real) i x)) = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `n:num`] + EXPECTATION_SUM) THEN + ANTS_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Rewrite UNIONS back *) + FIRST_X_ASSUM(fun th -> REWRITE_TAC[SYM th]) THEN + (* Goal: P(E) * t^2 <= E[S_n^2] *) + (* Use correction term: REAL_LE_TRANS with E[S_n^2 - 2*C] *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. sum(0..n) (\i. (X:num->A->real) i x) + pow 2 - &2 * sum(0..n) (\k. sum(0..k) (\i. X i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn ((A:num->A->bool) k) x))` THEN + CONJ_TAC THENL + [ALL_TAC; + (* Second conjunct: E[S_n^2 - 2C] <= E[S_n^2] *) + (* Suffices to show E[2C] >= 0; we show E[2C] = 0 *) + SUBGOAL_THEN `integrable p (\x:A. &2 * sum(0..n) (\k. + sum(0..k) (\i. (X:num->A->real) i x) * sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL_ALT THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x`; `n:num`] + INTEGRABLE_SUM) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* E[S_n^2 - 2C] = E[S_n^2] - E[2C] by EXPECTATION_SUB *) + SUBGOAL_THEN `expectation p (\x:A. sum(0..n) (\i. (X:num->A->real) i x) + pow 2 - &2 * sum(0..n) (\k. sum(0..k) (\i. X i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn ((A:num->A->bool) k) x)) = + expectation p (\x. sum(0..n) (\i. X i x) pow 2) - + expectation p (\x. &2 * sum(0..n) (\k. sum(0..k) (\i. X i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn (A k) x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUB THEN ASM_SIMP_TAC[LE_REFL]; ALL_TAC] THEN + (* Show E[2C] = 0, then a - 0 <= a *) + SUBGOAL_THEN `expectation p (\x:A. &2 * sum(0..n) (\k. + sum(0..k) (\i. (X:num->A->real) i x) * sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x)) = &0` + SUBST1_TAC THENL + [ALL_TAC; REAL_ARITH_TAC] THEN + (* E[2*C] = 2*E[C] *) + MP_TAC(SPECL [`p:A prob_space`; `&2`; + `\x:A. sum(0..n) (\k. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x)`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x`; `n:num`] + INTEGRABLE_SUM) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + DISCH_THEN(fun th -> SUBST1_TAC(BETA_RULE th)) THEN + (* 2 * E[C] = 0: suffices E[C] = 0 *) + SUBGOAL_THEN `expectation p (\x:A. sum(0..n) (\k. + sum(0..k) (\i. (X:num->A->real) i x) * sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x)) = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + (* E[C] = sum(0..n)(E[S_k*D_k*1_{A_k}]) by EXPECTATION_SUM *) + MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x`; `n:num`] + EXPECTATION_SUM) THEN + BETA_TAC THEN ANTS_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + (* Show sum(0..n)(E[S_k*D_k*1_{A_k}]) = 0 *) + MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN X_GEN_TAC `k:num` THEN + STRIP_TAC THEN BETA_TAC THEN + ASM_CASES_TAC `k:num < n` THENL + [(* k < n: use hypothesis 5 directly *) + SUBGOAL_THEN `(A:num->A->bool) k = {y:A | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(0..j) (\i. (X:num->A->real) i y)) < t) /\ + abs(sum(0..k) (\i. X i y)) >= t}` SUBST1_TAC THENL + [EXPAND_TAC "A" THEN REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[]; + (* k = n: D_n = sum(SUC n..n) = empty sum = 0, so whole term = 0 *) + SUBGOAL_THEN `k:num = n` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. sum(0..n) (\i. (X:num->A->real) i x) * + sum(SUC n..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) n) x) = (\x. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `y:A` THEN + SUBGOAL_THEN `sum(SUC n..n) (\i. (X:num->A->real) i y) = &0` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_TRIV_NUMSEG THEN ARITH_TAC; + REAL_ARITH_TAC]; + REWRITE_TAC[EXPECTATION_CONST]]]] THEN + (* First conjunct: P(E)*t^2 <= E[S_n^2 - 2C] *) + (* Rewrite P(E)*t^2 = E[t^2 * 1_E] *) + SUBGOAL_THEN `prob p (EV:A->bool) * t pow 2 = + expectation p (\x:A. (real_pow t 2) * indicator_fn EV x)` + SUBST1_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `real_pow t 2`; + `indicator_fn (EV:A->bool)`] EXPECTATION_CMUL) THEN + ASM_SIMP_TAC[INTEGRABLE_INDICATOR] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Apply EXPECTATION_MONO for pointwise bound *) + MATCH_MP_TAC EXPECTATION_MONO THEN CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `real_pow t 2`; + `indicator_fn (EV:A->bool)`] INTEGRABLE_CMUL) THEN + ASM_SIMP_TAC[INTEGRABLE_INDICATOR]; + ALL_TAC] THEN + CONJ_TAC THENL + [(* Integrability of S_n^2 - 2*C *) + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [ASM_SIMP_TAC[LE_REFL]; + MATCH_MP_TAC INTEGRABLE_CMUL_ALT THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k:num. \x:A. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) x`; `n:num`] + INTEGRABLE_SUM) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Pointwise bound: t^2 * 1_E(x) <= S_n(x)^2 - 2*C(x) *) + REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + ASM_CASES_TAC `(x:A) IN EV` THENL + [(* Case x IN EV *) + SUBGOAL_THEN `indicator_fn (EV:A->bool) x = &1` SUBST1_TAC THENL + [REWRITE_TAC[indicator_fn] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RID] THEN + (* Find first-crossing index j *) + SUBGOAL_THEN `?j:num. j <= n /\ (x:A) IN A j` STRIP_ASSUME_TAC THENL + [(* From x IN EV, extract ?k. k<=n /\ |S_k|>=t, then use num_WOP *) + SUBGOAL_THEN `?k:num. k <= n /\ + abs(sum(0..k) (\i. (X:num->A->real) i x)) >= t` MP_TAC THENL + [UNDISCH_TAC `(x:A) IN EV` THEN EXPAND_TAC "EV" THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + GEN_REWRITE_TAC (LAND_CONV) [num_WOP] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `j:num` THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "A" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN X_GEN_TAC `j':num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j':num`) THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `j':num <= n` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Extract |S_j| >= t and minimality from x IN A j *) + SUBGOAL_THEN `abs(sum(0..j) (\i. (X:num->A->real) i x)) >= t /\ + (!m:num. m < j ==> abs(sum(0..m) (\i. X i x)) < t)` + STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `(x:A) IN A (j:num)` THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + (* For k <> j, indicator_fn (A k) x = 0 *) + SUBGOAL_THEN `!k:num. k <= n /\ ~(k = j) ==> + indicator_fn ((A:num->A->bool) k) (x:A) = &0` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + ASM_CASES_TAC `k:num < j` THENL + [UNDISCH_TAC `!m:num. m < j ==> + abs(sum(0..m) (\i. (X:num->A->real) i x)) < t` THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC; + SUBGOAL_THEN `j:num < k` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `!j':num. j' < k ==> + abs(sum(0..j') (\i. (X:num->A->real) i x)) < t` THEN + DISCH_THEN(MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Simplify the sum to just the j-th term *) + SUBGOAL_THEN `sum(0..n) (\k. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * indicator_fn ((A:num->A->bool) k) (x:A)) = + sum(0..j) (\i. X i x) * sum(SUC j..n) (\i. X i x)` SUBST1_TAC THENL + [TRANS_TAC EQ_TRANS `sum(0..n) (\k:num. + if k = j then sum(0..j) (\i. (X:num->A->real) i x) * + sum(SUC j..n) (\i. X i x) else &0)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN + STRIP_TAC THEN BETA_TAC THEN + ASM_CASES_TAC `k:num = j` THENL + [ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(x:A) IN A (j:num)` THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `indicator_fn ((A:num->A->bool) k) (x:A) = &0` + SUBST1_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; REAL_ARITH_TAC]]; + REWRITE_TAC[SUM_DELTA; IN_NUMSEG] THEN + COND_CASES_TAC THENL [REFL_TAC; ALL_TAC] THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + (* Algebraic: t^2 <= S_n^2 - 2*S_j*D_j *) + ABBREV_TAC `s = sum(0..j) (\i. (X:num->A->real) i x)` THEN + ABBREV_TAC `d = sum(SUC j..n) (\i. (X:num->A->real) i x)` THEN + SUBGOAL_THEN `sum(0..n) (\i. (X:num->A->real) i x) = s + d` + SUBST1_TAC THENL + [EXPAND_TAC "s" THEN EXPAND_TAC "d" THEN + MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `0`; `j:num`; `n:num`] + SUM_COMBINE_R) THEN + REWRITE_TAC[ADD1] THEN ANTS_TAC THENL + [ASM_ARITH_TAC; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `(s + d) pow 2 - &2 * s * d = s pow 2 + d pow 2` + SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_2; REAL_ADD_LDISTRIB; REAL_ADD_RDISTRIB] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `real_pow s 2` THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_LE_SQUARE_ABS] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_LE_ADDR; REAL_LE_POW_2]]; + (* Case x NOT IN EV *) + SUBGOAL_THEN `indicator_fn (EV:A->bool) x = &0` SUBST1_TAC THENL + [REWRITE_TAC[indicator_fn] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RZERO] THEN + (* All A_k indicators are 0 *) + SUBGOAL_THEN `!k:num. k <= n ==> ~((x:A) IN A k)` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN DISCH_TAC THEN + UNDISCH_TAC `~((x:A) IN EV)` THEN REWRITE_TAC[] THEN + EXPAND_TAC "EV" THEN REWRITE_TAC[IN_ELIM_THM] THEN + UNDISCH_TAC `(x:A) IN A (k:num)` THEN + EXPAND_TAC "A" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..n) (\k. sum(0..k) (\i. (X:num->A->real) i x) * + sum(SUC k..n) (\i. X i x) * + indicator_fn ((A:num->A->bool) k) (x:A)) = &0` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN X_GEN_TAC `k:num` THEN + STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `indicator_fn ((A:num->A->bool) k) (x:A) = &0` + SUBST1_TAC THENL + [REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL [ASM_MESON_TAC[]; REFL_TAC]; + REAL_ARITH_TAC]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_SUB_RZERO; REAL_LE_POW_2]]]);; + + +(* Shifted version of Kolmogorov's inequality for blocks [a, a+n]. + Uses KOLMOGOROV_MAXIMAL_INEQ applied to Y_i = X_{a+i}. *) +let KOLMOGOROV_MAXIMAL_INEQ_SHIFTED = prove + (`!p X (a:num) (n:num) (t:real). + (!i. a <= i /\ i <= a + n ==> integrable (p:A prob_space) + ((X:num->A->real) i)) /\ + (!i. a <= i /\ i <= a + n ==> integrable p (\x. X i x pow 2)) /\ + (!i. a <= i /\ i <= a + n ==> expectation p (X i) = &0) /\ + (!i j. a <= i /\ i <= a + n /\ a <= j /\ j <= a + n /\ ~(i = j) + ==> covariance p (X i) (X j) = &0) /\ + (!k. k < n ==> + expectation p (\x. sum(a..a + k) (\i. X i x) * + sum(a + k + 1..a + n) (\i. X i x) * + indicator_fn + {y:A | y IN prob_carrier p /\ + (!j. j < k ==> abs(sum(a..a + j) (\i. X i y)) < t) /\ + abs(sum(a..a + k) (\i. X i y)) >= t} x) = &0) /\ + &0 < t + ==> prob p {x | x IN prob_carrier p /\ + ?k. k <= n /\ abs(sum(a..a + k) (\i. X i x)) >= t} + <= sum(a..a + n) (\i. variance p (X i)) / t pow 2`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Establish key sum reindexing: sum(a..a+k) = sum(0..k) shifted *) + SUBGOAL_THEN `!k (x:A). sum(a..a + k) (\i. (X:num->A->real) i x) = + sum(0..k) (\i. X(a + i) x)` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`a:num`; `\i. (X:num->A->real) i (x:A)`; `0`; `k:num`] + SUM_OFFSET) THEN + REWRITE_TAC[ADD_CLAUSES] THEN + CONV_TAC(LAND_CONV(ONCE_REWRITE_CONV[ADD_SYM])) THEN + SIMP_TAC[]; + ALL_TAC] THEN + (* Apply KOLMOGOROV_MAXIMAL_INEQ with Y_i = X_{a+i} *) + MP_TAC(ISPECL [`p:A prob_space`; `\i (x:A). (X:num->A->real) (a + i) x`; + `n:num`; `t:real`] KOLMOGOROV_MAXIMAL_INEQ) THEN + BETA_TAC THEN CONV_TAC(DEPTH_CONV ETA_CONV) THEN + (* Rewrite sum(0..k)(\i. X(a+i) x) back to sum(a..a+k)(\i. X i x) *) + REWRITE_TAC[GSYM(ASSUME `!k (x:A). sum(a..a + k) + (\i. (X:num->A->real) i x) = sum(0..k) (\i. X(a + i) x)`)] THEN + (* General sum shift for remaining sums (SUC k..n and variance) *) + SUBGOAL_THEN `!f:num->real m (nn:num). + sum(m..nn) (\i. f(a + i)) = sum(a + m..a + nn) f` + (fun th -> REWRITE_TAC[th]) THENL + [REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`a:num`; `f:num->real`; `m:num`; `nn:num`] SUM_OFFSET) THEN + CONV_TAC(LAND_CONV(ONCE_REWRITE_CONV[ADD_SYM])) THEN + SIMP_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[ADD_CLAUSES; ADD1] THEN REWRITE_TAC[GSYM ADD_ASSOC] THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* integrable *) + GEN_TAC THEN DISCH_TAC THEN + UNDISCH_TAC `!i:num. a <= i /\ i <= a + n ==> + integrable (p:A prob_space) ((X:num->A->real) i)` THEN + DISCH_THEN(MP_TAC o SPEC `a + i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + (* integrable pow 2 *) + GEN_TAC THEN DISCH_TAC THEN + UNDISCH_TAC `!i:num. a <= i /\ i <= a + n ==> + integrable (p:A prob_space) (\x. (X:num->A->real) i x pow 2)` THEN + DISCH_THEN(MP_TAC o SPEC `a + i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + (* expectation = 0 *) + GEN_TAC THEN DISCH_TAC THEN + UNDISCH_TAC `!i:num. a <= i /\ i <= a + n ==> + expectation (p:A prob_space) ((X:num->A->real) i) = &0` THEN + DISCH_THEN(MP_TAC o SPEC `a + i:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + (* covariance = 0 *) + REPEAT GEN_TAC THEN STRIP_TAC THEN + UNDISCH_TAC `!i:num j:num. a <= i /\ i <= a + n /\ a <= j /\ + j <= a + n /\ ~(i = j) ==> + covariance (p:A prob_space) ((X:num->A->real) i) (X j) = &0` THEN + DISCH_THEN(MP_TAC o SPECL [`a + i:num`; `a + j:num`]) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; SIMP_TAC[]]; + (* cross-term *) + GEN_TAC THEN DISCH_TAC THEN ASM_SIMP_TAC[]; + (* &0 < t *) + ASM_REWRITE_TAC[]]; + SIMP_TAC[]]);; + +(* Dyadic gap control using Kolmogorov's maximal inequality. + For each dyadic block [2^j, 2^{j+1}), the max partial sum gap is bounded. *) +let SLLN_GAP_DYADIC = prove + (`!p:A prob_space (X:num->A->real). + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + (!a b k t. a <= k /\ k < b /\ &0 < t ==> + expectation p (\x. sum(a..k) (\i. X i x) * + sum(SUC k..b) (\i. X i x) * + indicator_fn + {y:A | y IN prob_carrier p /\ + (!j. a <= j /\ j < k ==> + abs(sum(a..j) (\i. X i y)) < t) /\ + abs(sum(a..k) (\i. X i y)) >= t} x) = &0) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> !m:num. almost_surely p + {x:A | ?N:num. !j. N <= j ==> + !nn. 2 EXP j <= nn /\ nn < 2 EXP (SUC j) ==> + abs(sum(2 EXP j..nn) (\i. X i x)) < + &(2 EXP j) * inv(&(SUC m))}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `m:num` THEN + REWRITE_TAC[almost_surely] THEN + ABBREV_TAC `B = \j. {x:A | x IN prob_carrier p /\ + ?nn:num. 2 EXP j <= nn /\ nn < 2 EXP (SUC j) /\ + abs(sum(2 EXP j..nn) (\i. (X:num->A->real) i x)) >= + &(2 EXP j) * inv(&(SUC m))}` THEN + (* B j is a prob_event *) + SUBGOAL_THEN `!j. (B:num->A->bool) j IN prob_events p` + (LABEL_TAC "Bev") THENL + [X_GEN_TAC `j:num` THEN EXPAND_TAC "B" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (?nn. 2 EXP j <= nn /\ nn < 2 EXP (SUC j) /\ + abs(sum(2 EXP j..nn) (\i. (X:num->A->real) i x)) >= + &(2 EXP j) * inv(&(SUC m)))} = + UNIONS(IMAGE (\nn. {x:A | x IN prob_carrier p /\ + abs(sum(2 EXP j..nn) (\i. X i x)) >= + &(2 EXP j) * inv(&(SUC m))}) + {nn | 2 EXP j <= nn /\ nn < 2 EXP (SUC j)})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM] THEN + GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `nn:num` THEN STRIP_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + SUBGOAL_THEN `1 <= 2 EXP j` ASSUME_TAC THENL + [REWRITE_TAC[ARITH_RULE `1 <= n <=> 0 < n`; EXP_LT_0] THEN + ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. sum(2 EXP j..nn) (\i. (X:num->A->real) i x)) = + (\x. sum(0..nn) (\i. X i x) - sum(0..2 EXP j - 1) (\i. X i x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + SUBGOAL_THEN `2 EXP j - 1 + 1 = 2 EXP j` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; + `0`; `2 EXP j - 1`; `nn:num`] SUM_COMBINE_R) THEN + ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN REAL_ARITH_TAC; + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN REPEAT STRIP_TAC THEN + MP_TAC(SPEC `i:num` + (ASSUME `!n. integrable (p:A prob_space) + ((X:num->A->real) n)`)) THEN + REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]]; + MATCH_MP_TAC FINITE_IMAGE THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `0..2 EXP (SUC j):num` THEN + REWRITE_TAC[FINITE_NUMSEG] THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ARITH_TAC]; + ALL_TAC] THEN + EXISTS_TAC `limsup_events (B:num->A->bool)` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[] THEN + (* Bound prob(B j) using Kolmogorov's maximal inequality *) + SUBGOAL_THEN `!j. prob (p:A prob_space) ((B:num->A->bool) j) <= + sum(2 EXP j..2 EXP (SUC j) - 1) + (\i. variance p ((X:num->A->real) i)) / + (&(2 EXP j) * inv(&(SUC m))) pow 2` + (LABEL_TAC "Bbd") THENL + [X_GEN_TAC `j:num` THEN + SUBGOAL_THEN `1 <= 2 EXP j` ASSUME_TAC THENL + [REWRITE_TAC[ARITH_RULE `1 <= n <=> 0 < n`; EXP_LT_0] THEN ARITH_TAC; + ALL_TAC] THEN + (* Show B j equals the Kolmogorov set *) + SUBGOAL_THEN `(B:num->A->bool) j = + {x:A | x IN prob_carrier p /\ + ?k. k <= 2 EXP j - 1 /\ + abs(sum(2 EXP j..2 EXP j + k) + (\i. (X:num->A->real) i x)) >= + &(2 EXP j) * inv(&(SUC m))}` + SUBST1_TAC THENL + [EXPAND_TAC "B" THEN REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THEN STRIP_TAC THEN + ASM_REWRITE_TAC[] THENL + [EXISTS_TAC `nn - 2 EXP j` THEN CONJ_TAC THENL + [UNDISCH_TAC `nn < 2 EXP SUC j` THEN + UNDISCH_TAC `2 EXP j <= nn:num` THEN + REWRITE_TAC[EXP; MULT_2] THEN ARITH_TAC; + SUBGOAL_THEN `2 EXP j + (nn - 2 EXP j) = nn:num` + (fun th -> ASM_REWRITE_TAC[th]) THEN + UNDISCH_TAC `2 EXP j <= nn:num` THEN ARITH_TAC]; + EXISTS_TAC `2 EXP j + k` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `k <= 2 EXP j - 1` THEN + UNDISCH_TAC `1 <= 2 EXP j` THEN + REWRITE_TAC[EXP; MULT_2] THEN ARITH_TAC]; + ALL_TAC] THEN + (* Apply KOLMOGOROV_MAXIMAL_INEQ_SHIFTED *) + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; + `2 EXP j`; `2 EXP j - 1`; `&(2 EXP j) * inv(&(SUC m))`] + KOLMOGOROV_MAXIMAL_INEQ_SHIFTED) THEN + SUBGOAL_THEN `2 EXP j + (2 EXP j - 1) = 2 EXP (SUC j) - 1` + (fun th -> REWRITE_TAC[th]) THENL + [UNDISCH_TAC `1 <= 2 EXP j` THEN + REWRITE_TAC[EXP; MULT_2] THEN ARITH_TAC; ALL_TAC] THEN + DISCH_THEN MATCH_MP_TAC THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN STRIP_TAC THEN + UNDISCH_TAC `!i j. ~(i = j) ==> covariance (p:A prob_space) + ((X:num->A->real) i) (X j) = &0` THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* Cross-term: rewrite indicator from relative to absolute indices *) + X_GEN_TAC `k':num` THEN DISCH_TAC THEN + SUBGOAL_THEN + `{y:A | y IN prob_carrier p /\ + (!j'. j' < k' ==> + abs(sum(2 EXP j..2 EXP j + j') + (\i. (X:num->A->real) i y)) < + &(2 EXP j) * inv(&(SUC m))) /\ + abs(sum(2 EXP j..2 EXP j + k') (\i. X i y)) >= + &(2 EXP j) * inv(&(SUC m))} = + {y:A | y IN prob_carrier p /\ + (!j'. 2 EXP j <= j' /\ j' < 2 EXP j + k' ==> + abs(sum(2 EXP j..j') (\i. X i y)) < + &(2 EXP j) * inv(&(SUC m))) /\ + abs(sum(2 EXP j..2 EXP j + k') (\i. X i y)) >= + &(2 EXP j) * inv(&(SUC m))}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `y:A` THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [X_GEN_TAC `j'':num` THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j'' - 2 EXP j`) THEN + ANTS_TAC THENL + [UNDISCH_TAC `2 EXP j <= j''` THEN + UNDISCH_TAC `j'' < 2 EXP j + k'` THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `2 EXP j + (j'' - 2 EXP j) = j'':num` + (fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `2 EXP j <= j''` THEN ARITH_TAC; + X_GEN_TAC `j'':num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `2 EXP j + j''`) THEN + ANTS_TAC THENL + [UNDISCH_TAC `j'' < k':num` THEN ARITH_TAC; + REWRITE_TAC[]]]; + ALL_TAC] THEN + REWRITE_TAC[ARITH_RULE `a + k' + 1 = SUC(a + k')`] THEN + UNDISCH_TAC `!a b k t. a <= k /\ k < b /\ &0 < t ==> + expectation (p:A prob_space) + (\x. sum(a..k) (\i. (X:num->A->real) i x) * + sum(SUC k..b) (\i. X i x) * + indicator_fn {y | y IN prob_carrier p /\ + (!j. a <= j /\ j < k ==> + abs(sum(a..j) (\i. X i y)) < t) /\ + abs(sum(a..k) (\i. X i y)) >= t} x) = &0` THEN + DISCH_THEN(MP_TAC o SPECL + [`2 EXP j`; `2 EXP (SUC j) - 1`; + `2 EXP j + k'`; `&(2 EXP j) * inv(&(SUC m))`]) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [ARITH_TAC; + UNDISCH_TAC `k' < 2 EXP j - 1` THEN + UNDISCH_TAC `1 <= 2 EXP j` THEN + REWRITE_TAC[EXP; MULT_2] THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT; EXP_LT_0] THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_INV THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]]]; + REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT; EXP_LT_0] THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_INV THEN + REWRITE_TAC[REAL_OF_NUM_LT; LT_0]]]; + ALL_TAC] THEN + (* Summability via comparison with SUMMABLE_VARIANCE_DYADIC_BLOCK *) + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\j. sum(2 EXP j..2 EXP (SUC j) - 1) + (\i. variance (p:A prob_space) ((X:num->A->real) i)) / + (&(2 EXP j) * inv(&(SUC m))) pow 2` THEN + CONJ_TAC THENL + [(* Summability of comparison function *) + SUBGOAL_THEN `!j. sum(2 EXP j..2 EXP (SUC j) - 1) + (\i. variance (p:A prob_space) ((X:num->A->real) i)) / + (&(2 EXP j) * inv(&(SUC m))) pow 2 = + &(SUC m) pow 2 * + (sum(2 EXP j..2 EXP (SUC j) - 1) + (\i. variance p (X i)) / &(2 EXP j) pow 2)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN + REWRITE_TAC[REAL_POW_MUL; real_div; REAL_INV_MUL; + REAL_INV_POW; REAL_INV_INV] THEN + SUBGOAL_THEN `~(&(SUC m) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]; ALL_TAC] THEN + SUBGOAL_THEN `~(&(2 EXP j) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ; EXP_EQ_0] THEN ARITH_TAC; + ALL_TAC] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPEC `\n. variance (p:A prob_space) ((X:num->A->real) n)` + SUMMABLE_VARIANCE_DYADIC_BLOCK) THEN + BETA_TAC THEN + SUBGOAL_THEN `(\j. sum(2 EXP j..2 EXP SUC j - 1) + (\n. variance (p:A prob_space) ((X:num->A->real) n)) / + &(2 EXP j) pow 2) = + (\j. sum(2 EXP j..2 EXP SUC j - 1) + (\i. variance p (X i)) / &(2 EXP j) pow 2)` + SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN + SUBGOAL_THEN + `expectation (p:A prob_space) ((X:num->A->real) n) = &0` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`from 0`; + `\j. sum(2 EXP j..2 EXP (SUC j) - 1) + (\i. variance (p:A prob_space) ((X:num->A->real) i)) / + &(2 EXP j) pow 2`; + `&(SUC m) pow 2`] REAL_SUMMABLE_LMUL) THEN + ASM_REWRITE_TAC[]; + (* Pointwise bound *) + EXISTS_TAC `0` THEN REWRITE_TAC[GE; LE_0] THEN + X_GEN_TAC `j':num` THEN REWRITE_TAC[IN_FROM] THEN + DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= x /\ x <= y ==> abs x <= y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]]]; + ALL_TAC] THEN + (* Complement of good set SUBSET limsup B *) + REWRITE_TAC[limsup_events; SUBSET; IN_ELIM_THM; IN_UNIONS; + EXISTS_IN_GSPEC; IN_INTERS; FORALL_IN_GSPEC; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; + NOT_IMP; REAL_NOT_LT] THEN STRIP_TAC THEN + X_GEN_TAC `mm:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `mm:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN STRIP_TAC THEN + EXISTS_TAC `j:num` THEN ASM_REWRITE_TAC[GE] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge]);; + +(* ================================================================== *) +(* Step 6: Assembly -- SLLN with summable variance condition *) +(* ================================================================== *) + +let SLLN_SUMMABLE_VARIANCE = prove + (`!p:A prob_space (X:num->A->real) mu. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = mu n) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + (!a b k t. a <= k /\ k < b /\ &0 < t ==> + expectation p (\x. sum(a..k) (\i. X i x - mu i) * + sum(SUC k..b) (\i. X i x - mu i) * + indicator_fn + {y:A | y IN prob_carrier p /\ + (!j. a <= j /\ j < k ==> + abs(sum(a..j) (\i. X i y - mu i)) < t) /\ + abs(sum(a..k) (\i. X i y - mu i)) >= t} x) = &0) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x - mu i)) + ---> &0) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `Y = \n (x:A). (X:num->A->real) n x - (mu:num->real) n` THEN + SUBGOAL_THEN `!n. expectation p ((Y:num->A->real) n) = &0` + (LABEL_TAC "EY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + ASM_REWRITE_TAC[ETA_AX] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p ((Y:num->A->real) n)` + (LABEL_TAC "IY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable p (\x:A. (Y:num->A->real) n x pow 2)` + (LABEL_TAC "IY2") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + SUBGOAL_THEN `(\x:A. ((X:num->A->real) n x - (mu:num->real) n) pow 2) = + (\x. X n x pow 2 + (--(&2 * mu n) * X n x + (mu n) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_SIMP_TAC[ETA_AX]; + REWRITE_TAC[INTEGRABLE_CONST]]]]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. variance p ((Y:num->A->real) n) = variance p (X n)` + (LABEL_TAC "VY") THENL + [GEN_TAC THEN EXPAND_TAC "Y" THEN + REWRITE_TAC[real_sub] THEN MATCH_MP_TAC VARIANCE_SHIFT THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!i j. ~(i = j) ==> covariance p ((Y:num->A->real) i) (Y j) = &0` + (LABEL_TAC "CY") THENL + [REPEAT STRIP_TAC THEN EXPAND_TAC "Y" THEN + SUBGOAL_THEN + `covariance p (\x:A. (X:num->A->real) i x - (mu:num->real) i) + (\x. X j x - mu j) = + covariance p (X i) (X j)` SUBST1_TAC THENL + [MATCH_MP_TAC COVARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n (x:A). sum(0..n) (\i. (Y:num->A->real) i x) = + sum(0..n) (\i. X i x - (mu:num->real) i)` + (LABEL_TAC "SY") THENL + [REPEAT GEN_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN + EXPAND_TAC "Y" THEN SIMP_TAC[BETA_THM]; ALL_TAC] THEN + REMOVE_THEN "SY" (fun th -> REWRITE_TAC[GSYM th]) THEN + SUBGOAL_THEN + `almost_surely p + {x:A | ((\j. inv(&(2 EXP j)) * + sum(0..2 EXP j - 1) (\i. (Y:num->A->real) i x)) + ---> &0) sequentially}` (LABEL_TAC "SUBSEQ") THENL + [MATCH_MP_TAC SLLN_SUBSEQ_DYADIC THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_SUMMABLE_EQ THEN + EXISTS_TAC `\n. variance p ((X:num->A->real) n) / &(SUC n) pow 2` THEN + ASM_SIMP_TAC[IN_FROM]; ALL_TAC] THEN + SUBGOAL_THEN + `!m. almost_surely p + {x:A | ?N. !j. N <= j ==> + !nn. 2 EXP j <= nn /\ nn < 2 EXP SUC j ==> + abs(sum(2 EXP j..nn) (\i. (Y:num->A->real) i x)) < + &(2 EXP j) * inv(&(SUC m))}` (LABEL_TAC "GAP") THENL + [MATCH_MP_TAC SLLN_GAP_DYADIC THEN + ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + EXPAND_TAC "Y" THEN REWRITE_TAC[BETA_THM] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `almost_surely p + {x:A | !m. ?N. !j. N <= j ==> + !nn. 2 EXP j <= nn /\ nn < 2 EXP SUC j ==> + abs(sum(2 EXP j..nn) (\i. (Y:num->A->real) i x)) < + &(2 EXP j) * inv(&(SUC m))}` (LABEL_TAC "GAP_ALL") THENL + [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `INTERS {(\m. {x:A | ?N. !j. N <= j ==> + !nn. 2 EXP j <= nn /\ nn < 2 EXP SUC j ==> + abs(sum(2 EXP j..nn) (\i. (Y:num->A->real) i x)) < + &(2 EXP j) * inv(&(SUC m))}) m | m IN (:num)}` THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN MESON_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ((\j. inv(&(2 EXP j)) * + sum(0..2 EXP j - 1) (\i. (Y:num->A->real) i x)) + ---> &0) sequentially} INTER + {x | !m. ?N. !j. N <= j ==> + !nn. 2 EXP j <= nn /\ nn < 2 EXP SUC j ==> + abs(sum(2 EXP j..nn) (\i. Y i x)) < + &(2 EXP j) * inv(&(SUC m))}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e / &2` REAL_ARCH_INV) THEN + REWRITE_TAC[REAL_HALF; ASSUME `&0 < e`] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `K_gap:num`) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN + SIMP_TAC[REAL_HALF; ASSUME `&0 < e`] THEN + DISCH_THEN(X_CHOOSE_TAC `K_subseq:num`) THEN + EXISTS_TAC `2 EXP (K_gap + K_subseq)` THEN + X_GEN_TAC `n:num` THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN DISCH_TAC THEN + SUBGOAL_THEN `?j:num. n < 2 EXP SUC j` MP_TAC THENL + [EXISTS_TAC `n:num` THEN + MATCH_MP_TAC LTE_TRANS THEN EXISTS_TAC `2 EXP n` THEN + REWRITE_TAC[LT_POW2_REFL; LE_EXP] THEN ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(fun th -> + let wop_inst = CONV_RULE(DEPTH_CONV BETA_CONV) + (ISPEC `\j:num. n < 2 EXP SUC j` num_WOP) in + MP_TAC(ONCE_REWRITE_RULE[wop_inst] th)) THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` MP_TAC) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (LABEL_TAC "MIN")) THEN + SUBGOAL_THEN `(K_gap:num) + K_subseq <= j` ASSUME_TAC THENL + [SUBGOAL_THEN `2 EXP (K_gap + K_subseq) < 2 EXP (SUC j)` MP_TAC THENL + [ASM_ARITH_TAC; REWRITE_TAC[LT_EXP] THEN ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `2 EXP j <= (n:num)` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + ASM_CASES_TAC `j = 0` THENL + [UNDISCH_TAC `2 EXP (K_gap + K_subseq) <= n` THEN + UNDISCH_TAC `n < 2 EXP j` THEN + ASM_REWRITE_TAC[EXP] THEN + SUBGOAL_THEN `1 <= 2 EXP (K_gap + K_subseq)` MP_TAC THENL + [REWRITE_TAC[ARITH_RULE `1 <= n <=> 0 < n`; EXP_LT_0] THEN + ARITH_TAC; ARITH_TAC]; + SUBGOAL_THEN `2 EXP j = 2 EXP SUC (j - 1)` MP_TAC THENL + [AP_TERM_TAC THEN ASM_ARITH_TAC; + DISCH_THEN(fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THEN + USE_THEN "MIN" (MP_TAC o SPEC `j - 1`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]]]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `e / &2 + e / &2` THEN CONJ_TAC THENL + [ALL_TAC; REAL_ARITH_TAC] THEN + SUBGOAL_THEN + `sum (0..n) (\i. (Y:num->A->real) i (x:A)) = + sum (0..2 EXP j - 1) (\i. Y i x) + + sum (2 EXP j..n) (\i. Y i x)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_L) THEN + UNDISCH_TAC `2 EXP j <= n` THEN + REWRITE_TAC[EXP_LT_0] THEN ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC + `abs(inv(&(SUC n)) * sum (0..2 EXP j - 1) + (\i. (Y:num->A->real) i (x:A))) + + abs(inv(&(SUC n)) * sum (2 EXP j..n) (\i. Y i x))` THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL + [(* First term: subsequence convergence bound *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `abs(inv(&(2 EXP j)) * sum (0..2 EXP j - 1) + (\i. (Y:num->A->real) i (x:A)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN + REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT; EXP_LT_0] THEN ARITH_TAC; + UNDISCH_TAC `2 EXP j <= n` THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC]; + SUBGOAL_THEN `K_subseq <= (j:num)` MP_TAC THENL + [MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `(K_gap:num) + K_subseq` THEN + CONJ_TAC THENL [ARITH_TAC; ASM_REWRITE_TAC[]]; + DISCH_THEN(fun th -> FIRST_X_ASSUM(MP_TAC o C MATCH_MP th)) THEN + SIMP_TAC[REAL_SUB_RZERO]]]; + (* Second term: gap control bound *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `inv(&(SUC m))` THEN CONJ_TAC THENL + [(* abs(inv(SUC n) * sum(...)) <= inv(SUC m) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv (&(SUC n)) * + abs(sum (2 EXP j..n) (\i. (Y:num->A->real) i (x:A)))` THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_ABS_MUL; REAL_ABS_INV; REAL_ABS_NUM] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `abs(sum(2 EXP j..n) (\i. (Y:num->A->real) i (x:A))) < + &(2 EXP j) * inv(&(SUC m))` ASSUME_TAC THENL + [SUBGOAL_THEN `K_gap <= (j:num)` MP_TAC THENL + [MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `(K_gap:num) + K_subseq` THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + DISCH_THEN(fun th -> + let gap_asm = ASSUME + `!j. K_gap <= j + ==> (!nn. 2 EXP j <= nn /\ nn < 2 EXP SUC j + ==> abs(sum(2 EXP j..nn) + (\i. (Y:num->A->real) i (x:A))) < + &(2 EXP j) * inv(&(SUC m)))` in + MP_TAC(MATCH_MP gap_asm th)) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `inv(&(SUC n)) * (&(2 EXP j) * inv(&(SUC m)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_MUL_ASSOC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [SUBGOAL_THEN `inv(&(SUC n)) * &(2 EXP j) = &(2 EXP j) / &(SUC n)` + SUBST1_TAC THENL + [REWRITE_TAC[real_div]; ALL_TAC] THEN + SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + REWRITE_TAC[REAL_MUL_LID; REAL_OF_NUM_LE] THEN + UNDISCH_TAC `2 EXP j <= n` THEN ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]]; + (* inv(SUC m) < e / 2 *) + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `inv(&m)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN + UNDISCH_TAC `~(m = 0)` THEN ARITH_TAC]]);; + + +(* ===================================================================== *) +(* Etemadi's SLLN: IID integrable ==> SLLN *) +(* ===================================================================== *) + + +(* Real version of Cesaro mean convergence *) +let REAL_CESARO_MEAN = prove + (`!a l. (a ---> l) sequentially + ==> ((\n. inv(&(SUC n)) * sum(0..n) a) ---> l) sequentially`, + REPEAT GEN_TAC THEN + REWRITE_TAC[TENDSTO_REAL; o_DEF] THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`\n. lift((a:num->real) n)`; `lift l:real^1`; `0`; `&1`] + LIM_CESARO) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_CONJ] LIM_TRANSFORM) THEN + MATCH_MP_TAC LIM_EVENTUALLY THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[VSUM_REAL; o_DEF; LIFT_DROP; GSYM LIFT_CMUL; + GSYM LIFT_SUB; LIFT_EQ; REAL_SUB_0] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_SUC; ETA_AX; REAL_SUB_REFL; LIFT_NUM]);; + +(* Pointwise bound: sum of floor indicators <= x for nonneg x *) +let SUM_INDICATOR_LE_REAL = prove + (`!x:real n. &0 <= x + ==> sum(0..n) (\k. if x >= &(k + 1) then &1 else &0) <= x`, + GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG] THEN DISCH_TAC THEN + COND_CASES_TAC THENL + [POP_ASSUM MP_TAC THEN REWRITE_TAC[GSYM REAL_OF_NUM_ADD; real_ge] THEN + REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]; + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN DISCH_TAC THEN + COND_CASES_TAC THENL + [SUBGOAL_THEN `!k. k <= n ==> x >= &(k + 1)` ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + UNDISCH_TAC `x >= &(SUC n + 1)` THEN REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> b <= x ==> a <= x`) THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..n) (\k. if x >= &(k + 1) then &1 else &0) = &(n + 1)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `sum(0..n) (\k. if x >= &(k + 1) then &1 else &0) = + sum(0..n) (\k:num. &1)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + ASM_SIMP_TAC[]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; REAL_MUL_RID]]; + UNDISCH_TAC `x >= &(SUC n + 1)` THEN + REWRITE_TAC[real_ge; GSYM REAL_OF_NUM_ADD; ADD1] THEN + REAL_ARITH_TAC]; + REWRITE_TAC[REAL_ADD_RID] THEN ASM_MESON_TAC[]]]);; + +(* Tail probability bound: for nonneg integrable X *) +let TAIL_PROB_SUM_LE_EXPECTATION = prove + (`!p:A prob_space X n. + integrable p X /\ + (!x. x IN prob_carrier p ==> &0 <= X x) + ==> sum(0..n) (\k. prob p {x | x IN prob_carrier p /\ X x >= &(k + 1)}) + <= expectation p X`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `random_variable (p:A prob_space) (X:A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[integrable]; ALL_TAC] THEN + SUBGOAL_THEN + `!k. {x:A | x IN prob_carrier p /\ X x >= &(k + 1)} IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!k. prob p {x:A | x IN prob_carrier p /\ X x >= &(k + 1)} = + expectation p (indicator_fn {x | x IN prob_carrier p /\ X x >= &(k + 1)})` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\k. indicator_fn {x:A | x IN prob_carrier p /\ (X:A->real) x >= &(k + 1)}`; + `n:num`] EXPECTATION_SUM) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT STRIP_TAC THEN ASM_SIMP_TAC[INTEGRABLE_INDICATOR]; + DISCH_THEN(SUBST1_TAC o SYM)] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[INTEGRABLE_INDICATOR]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SUM_INDICATOR_LE_REAL THEN ASM_SIMP_TAC[]]);; + +(* Tail probabilities are summable for nonneg integrable RVs *) +let TAIL_PROB_SUMMABLE = prove + (`!p:A prob_space X. + integrable p X /\ + (!x. x IN prob_carrier p ==> &0 <= X x) + ==> real_summable (from 0) + (\k. prob p {x | x IN prob_carrier p /\ X x >= &(k + 1)})`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC `expectation p (X:A->real)` THEN + ASM_SIMP_TAC[TAIL_PROB_SUM_LE_EXPECTATION] THEN + GEN_TAC THEN MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + ASM_MESON_TAC[integrable]);; + +(* Telescoping sum for inverse differences *) +let SUM_TELESCOPING_INV = prove + (`!m n. 1 <= m /\ m <= n + 1 + ==> sum(m..n) (\k. inv(&k) - inv(&(k + 1))) = inv(&m) - inv(&(n + 1))`, + GEN_TAC THEN INDUCT_TAC THENL + [DISCH_TAC THEN + SUBGOAL_THEN `m = 1` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; + SIMP_TAC[SUM_TRIV_NUMSEG; ARITH] THEN CONV_TAC REAL_RAT_REDUCE_CONV]; + DISCH_TAC THEN ASM_CASES_TAC `m <= SUC n` THENL + [REWRITE_TAC[SUM_CLAUSES_NUMSEG] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `sum(m..n) (\k. inv(&k) - inv(&(k + 1))) = + inv(&m) - inv(&(n + 1))` + SUBST1_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[ADD1; GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `SUC n < m` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[SUM_TRIV_NUMSEG] THEN + SUBGOAL_THEN `m = SUC n + 1` ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ADD1; GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC]]);; + +(* inv(k+1)^2 <= inv(k) - inv(k+1) = 1/(k(k+1)), so sum bounded by inv(m) *) +let SUM_INV_SQ_LE_INV = prove + (`!m n. 1 <= m ==> sum(m..n) (\k. inv(&(k + 1)) pow 2) <= inv(&m)`, + REPEAT STRIP_TAC THEN ASM_CASES_TAC `n:num < m` THENL + [ASM_SIMP_TAC[SUM_TRIV_NUMSEG] THEN + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(m..n) (\k. inv(&k) - inv(&(k + 1)))` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `1 <= k` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(&k = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~(&(k + 1) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `inv(&k) - inv(&(k + 1)) = inv(&k * &(k + 1))` + SUBST1_TAC THENL + [MP_TAC(REAL_FIELD `~(&k = &0) /\ ~(&(k+1) = &0) + ==> inv(&k) - inv(&(k+1)) = (&(k+1) - &k) * inv(&k * &(k+1))`) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD; REAL_ARITH `(x + &1) - x = &1`; + REAL_MUL_LID]; + REWRITE_TAC[GSYM REAL_INV_POW] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + REWRITE_TAC[REAL_POW_2; REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN + ASM_ARITH_TAC]]; + ASM_SIMP_TAC[SUM_TELESCOPING_INV; + ARITH_RULE `~(n < m) ==> m <= n + 1`] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= b ==> a - b <= a`) THEN + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]]);; + +(* Global bound: sum of 1/(k+1)^2 over 0..n is at most 2 *) +let SUM_INV_SQ_BOUND = prove + (`!n. sum(0..n) (\k. inv(&(k + 1)) pow 2) <= &2`, + GEN_TAC THEN ASM_CASES_TAC `n = 0` THENL + [ASM_REWRITE_TAC[SUM_SING_NUMSEG] THEN + CONV_TAC NUM_REDUCE_CONV THEN CONV_TAC REAL_RAT_REDUCE_CONV; + ALL_TAC] THEN + SUBGOAL_THEN `0 <= n:num` (MP_TAC o MATCH_MP(ISPEC + `\k. inv(&(k + 1)) pow 2` SUM_CLAUSES_LEFT)) THENL + [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[] THEN CONV_TAC NUM_REDUCE_CONV THEN + CONV_TAC REAL_RAT_REDUCE_CONV THEN + DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[REAL_ARITH `&1 / x = inv x`] THEN + MATCH_MP_TAC(REAL_ARITH `s <= &1 ==> &1 + s <= &2`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `inv(&1)` THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_INV_SQ_LE_INV THEN ARITH_TAC; + CONV_TAC REAL_RAT_REDUCE_CONV]);; + +(* min(x,c)^2 splits into x^2 * 1(x<=c) + c^2 * 1(x>c) *) +let MIN_POW2_SPLIT = prove + (`!x c. &0 <= x /\ &0 <= c + ==> min x c pow 2 = + x pow 2 * (if x <= c then &1 else &0) + + c pow 2 * (if x > c then &1 else &0)`, + REPEAT STRIP_TAC THEN ASM_CASES_TAC `x <= c:real` THENL + [ASM_SIMP_TAC[REAL_ARITH `x <= c ==> min x c = x`] THEN + ASM_SIMP_TAC[REAL_ARITH `x <= c ==> ~(x > c)`] THEN + REAL_ARITH_TAC; + ASM_SIMP_TAC[REAL_ARITH `~(x <= c) ==> min x c = c`] THEN + ASM_SIMP_TAC[REAL_ARITH `~(x <= c) ==> x > c`] THEN + REAL_ARITH_TAC]);; + +(* Every nonneg real lies between consecutive naturals (floor existence) *) +let REAL_FLOOR_EXISTS = prove + (`!x:real. &0 <= x ==> ?n. &n <= x /\ x < &(n + 1)`, + GEN_TAC THEN DISCH_TAC THEN + MP_TAC(fst(EQ_IMP_RULE(SPEC `\n. x < &n` num_WOP))) THEN + REWRITE_TAC[] THEN + ANTS_TAC THENL + [MP_TAC(SPEC `x:real` REAL_ARCH_LT) THEN MESON_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + ASM_CASES_TAC `m = 0` THENL + [UNDISCH_TAC `x < &m` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 <= x` THEN REAL_ARITH_TAC; ALL_TAC] THEN + EXISTS_TAC `m - 1` THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `m - 1`) THEN + ASM_SIMP_TAC[ARITH_RULE `~(m = 0) ==> m - 1 < m`] THEN + REWRITE_TAC[REAL_NOT_LT]; + ASM_SIMP_TAC[ARITH_RULE `~(m = 0) ==> (m - 1) + 1 = m`]]);; + +(* min(x,c) = x when x <= c *) +let MIN_EQ_LEFT = prove + (`!x y:real. x <= y ==> min x y = x`, + REAL_ARITH_TAC);; + +(* min(x,c)^2/c^2 <= 1 for any nonneg x and c = k+1 *) +let MINPOW_DIV_LE_ONE = prove + (`!x:real k. &0 <= x ==> min x (&(k + 1)) pow 2 / &(k + 1) pow 2 <= &1`, + REPEAT STRIP_TAC THEN + SIMP_TAC[REAL_LE_LDIV_EQ; REAL_POW_LT; REAL_OF_NUM_LT; + ARITH_RULE `0 < k + 1`] THEN + REWRITE_TAC[REAL_MUL_LID] THEN + MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_LE_MIN] THEN ASM_REWRITE_TAC[REAL_POS]; + REWRITE_TAC[REAL_MIN_LE; REAL_LE_REFL]]);; + +(* Key bound: sum of min(x,k+1)^2/(k+1)^2 is at most 2x+2 *) +let TRUNCATED_VARIANCE_SUM_BOUND = prove + (`!x:real n. &0 <= x + ==> sum(0..n) (\k. min x (&(k + 1)) pow 2 / &(k + 1) pow 2) + <= &2 * x + &2`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MP_TAC(SPEC `x:real` REAL_FLOOR_EXISTS) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `J:num` STRIP_ASSUME_TAC) THEN + ASM_CASES_TAC `J:num <= n` THENL + [(* J <= n: split sum(0..n) = sum(0..J) + sum(J+1..n) *) + SUBGOAL_THEN + `sum(0..n) (\k. min x (&(k + 1)) pow 2 / &(k + 1) pow 2) = + sum(0..J) (\k. min x (&(k + 1)) pow 2 / &(k + 1) pow 2) + + sum(J+1..n) (\k. min x (&(k + 1)) pow 2 / &(k + 1) pow 2)` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_REWRITE_TAC[LE_0]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&(J + 1) + x pow 2 * inv(&(J + 1))` THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [(* sum(0..J) <= J+1: each term <= 1 *) + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..J) (\k:num. &1)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN + ASM_SIMP_TAC[MINPOW_DIV_LE_ONE]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; REAL_MUL_RID; REAL_LE_REFL]]; + (* sum(J+1..n) <= x^2/(J+1): for k>=J+1, min(x,k+1)=x *) + SUBGOAL_THEN + `sum(J+1..n) (\k. min x (&(k + 1)) pow 2 / &(k + 1) pow 2) = + sum(J+1..n) (\k. x pow 2 / &(k + 1) pow 2)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `min x (&(k + 1)) = x` (fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC MIN_EQ_LEFT THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `&(J + 1)` THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; + SUBGOAL_THEN + `sum(J+1..n) (\k. x pow 2 / &(k + 1) pow 2) = + x pow 2 * sum(J+1..n) (\k. inv(&(k + 1)) pow 2)` SUBST1_TAC THENL + [REWRITE_TAC[GSYM SUM_LMUL] THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN + REPEAT STRIP_TAC THEN + REWRITE_TAC[real_div; GSYM REAL_INV_POW; REAL_MUL_AC]; + MATCH_MP_TAC REAL_LE_LMUL THEN REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC SUM_INV_SQ_LE_INV THEN ARITH_TAC]]]; + (* J+1 + x^2/(J+1) <= 2x+2 *) + SUBGOAL_THEN `&(J + 1) <= x + &1` ASSUME_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `x pow 2 * inv (&(J + 1)) <= x` ASSUME_TAC THENL + [REWRITE_TAC[GSYM real_div] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT; + ARITH_RULE `0 < J + 1`] THEN + REWRITE_TAC[REAL_POW_2] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC]; + (* ~(J <= n): all terms <= 1, sum <= n+1 <= J+1 <= x+1 <= 2x+2 *) + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `sum(0..n) (\k:num. &1)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN REWRITE_TAC[] THEN + ASM_SIMP_TAC[MINPOW_DIV_LE_ONE]; + REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; REAL_MUL_RID] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= x /\ a <= x + &1 ==> a <= &2 * x + &2`) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&(J + 1)` THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN ASM_REAL_ARITH_TAC]]]);; + +(* Variance summability for truncated nonneg integrable RVs *) +let TRUNCATED_VARIANCE_SUMMABLE = prove + (`!p:A prob_space (X:A->real). + integrable p X /\ (!x. x IN prob_carrier p ==> &0 <= X x) + ==> real_summable (from 0) + (\k. expectation p (\x. min (X x) (&(SUC k)) pow 2) / + &(SUC k) pow 2)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC `&2 * expectation p (X:A->real) + &2` THEN + REWRITE_TAC[] THEN CONJ_TAC THENL + [(* Nonnegativity: E[min(X,SUC n)^2] / (SUC n)^2 >= 0 *) + GEN_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_LE_POW_2] THEN + MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&(SUC n) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN ASM_MESON_TAC[integrable]; + REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ARITH + `abs(min x c) <= c <=> min x c <= c /\ --c <= min x c`] THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_MIN_LE; REAL_LE_REFL]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN + REWRITE_TAC[REAL_NEG_LE0; REAL_POS; REAL_LE_MIN] THEN + ASM_SIMP_TAC[REAL_POS]]]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_POW_2]]; + (* Partial sum bound: sum <= 2*E[X] + 2 *) + X_GEN_TAC `N:num` THEN + SUBGOAL_THEN + `!k. integrable p (\x:A. min ((X:A->real) x) (&(SUC k)) pow 2)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&(SUC k) pow 2` THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POW THEN + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST] THEN ASM_MESON_TAC[integrable]; + REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_ABS_POW] THEN MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_ABS_POS] THEN + REWRITE_TAC[REAL_ARITH + `abs(min x c) <= c <=> min x c <= c /\ --c <= min x c`] THEN + CONJ_TAC THENL + [REWRITE_TAC[REAL_MIN_LE; REAL_LE_REFL]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN + REWRITE_TAC[REAL_NEG_LE0; REAL_POS; REAL_LE_MIN] THEN + ASM_SIMP_TAC[REAL_POS]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!k. integrable p + (\x:A. inv(&(SUC k) pow 2) * min ((X:A->real) x) (&(SUC k)) pow 2)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Rewrite E[f]/c^2 as E[inv(c^2)*f] *) + SUBGOAL_THEN + `sum(0..N) (\k. expectation p (\x. min ((X:A->real) x) (&(SUC k)) pow 2) / + &(SUC k) pow 2) = + sum(0..N) (\k. expectation p + (\x. inv(&(SUC k) pow 2) * min (X x) (&(SUC k)) pow 2))` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_NUMSEG THEN X_GEN_TAC `k:num` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN ASM_SIMP_TAC[EXPECTATION_CMUL] THEN + REWRITE_TAC[real_div; GSYM REAL_INV_POW] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Pull sum inside expectation *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\k. (\x:A. inv(&(SUC k) pow 2) * min ((X:A->real) x) (&(SUC k)) pow 2)`; + `N:num`] EXPECTATION_SUM) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[]; DISCH_THEN(SUBST1_TAC o SYM)] THEN + (* Rewrite to k+1 form for TRUNCATED_VARIANCE_SUM_BOUND *) + SUBGOAL_THEN + `!x:A. sum(0..N) + (\i. inv(&(SUC i) pow 2) * min ((X:A->real) x) (&(SUC i)) pow 2) = + sum(0..N) (\k. min (X x) (&(k + 1)) pow 2 / &(k + 1) pow 2)` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ADD1; real_div; GSYM REAL_INV_POW; REAL_MUL_AC]; + ALL_TAC] THEN + (* Bound by E[2X+2] via EXPECTATION_MONO *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. &2 * (X:A->real) x + &2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [(* Integrability of the sum *) + SUBGOAL_THEN + `(\x:A. sum(0..N) + (\k. min ((X:A->real) x) (&(k + 1)) pow 2 / &(k + 1) pow 2)) = + (\x. sum(0..N) + (\k. inv(&(SUC k) pow 2) * min (X x) (&(SUC k)) pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN + MATCH_MP_TAC SUM_EQ_NUMSEG THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[ADD1; real_div; GSYM REAL_INV_POW; REAL_MUL_AC]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\k. (\x:A. inv(&(SUC k) pow 2) * + min ((X:A->real) x) (&(SUC k)) pow 2)`; + `N:num`] INTEGRABLE_SUM) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + (* Integrability of 2X+2 *) + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN + REWRITE_TAC[INTEGRABLE_CONST] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + (* Pointwise bound via TRUNCATED_VARIANCE_SUM_BOUND *) + REPEAT STRIP_TAC THEN MATCH_MP_TAC TRUNCATED_VARIANCE_SUM_BOUND THEN + ASM_SIMP_TAC[]]]; + (* E[2X+2] = 2*E[X]+2 *) + ASM_SIMP_TAC[EXPECTATION_ADD; INTEGRABLE_CMUL; INTEGRABLE_CONST; + EXPECTATION_CMUL; EXPECTATION_CONST; REAL_LE_REFL]]]);; + +(* ================================================================== *) +(* Etemadi's SLLN for nonneg pairwise IID random variables *) +(* ================================================================== *) + +(* Geometric subsequence gseq b k with ratio approx (b+2)/(b+1) *) +let gseq = define + `gseq b 0 = 1 /\ + gseq b (SUC k) = gseq b k + gseq b k DIV (b + 1) + 1`;; + +let GSEQ_SUC_GT = prove + (`!b k. gseq b k < gseq b (SUC k)`, + REWRITE_TAC[gseq] THEN ARITH_TAC);; + +let GSEQ_POS = prove + (`!b k. 1 <= gseq b k`, + GEN_TAC THEN INDUCT_TAC THEN REWRITE_TAC[gseq] THENL + [ARITH_TAC; ASM_ARITH_TAC]);; + +let GSEQ_LINEAR_LOWER = prove + (`!b k. k + 1 <= gseq b k`, + GEN_TAC THEN INDUCT_TAC THEN REWRITE_TAC[gseq] THENL + [ARITH_TAC; ASM_ARITH_TAC]);; + +let GSEQ_NZ = prove + (`!b k. ~(gseq b k = 0)`, + REPEAT GEN_TAC THEN MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN + ARITH_TAC);; + +let GSEQ_MONOTONE = prove + (`!b j k. j <= k ==> gseq b j <= gseq b k`, + GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[LE] THEN DISCH_TAC THEN ASM_REWRITE_TAC[LE_REFL]; + REWRITE_TAC[LE] THEN STRIP_TAC THENL + [ASM_REWRITE_TAC[LE_REFL]; + MATCH_MP_TAC LE_TRANS THEN EXISTS_TAC `gseq b k` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC LT_IMP_LE THEN REWRITE_TAC[GSEQ_SUC_GT]]]]);; + +let GSEQ_UNBOUNDED = prove + (`!b N. ?k. N < gseq b k`, + REPEAT GEN_TAC THEN EXISTS_TAC `SUC N` THEN + MP_TAC(SPECL [`b:num`; `SUC N`] GSEQ_LINEAR_LOWER) THEN ARITH_TAC);; + +(* Floor of real division by natural DIV *) +let REAL_DIV_FLOOR_LE = prove + (`!m n. 0 < n ==> &(m DIV n) <= &m / &n`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < &n` ASSUME_TAC THENL + [ASM_REWRITE_TAC[REAL_OF_NUM_LT]; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + SUBGOAL_THEN `&(m DIV n * n) <= &m` MP_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN + ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[DIV_MUL_LE]; + REWRITE_TAC[GSYM REAL_OF_NUM_MUL]]);; + +(* Key identity: (b+2)/(b+1) * gseq = gseq + gseq/(b+1) *) +let GSEQ_DIV_IDENTITY = prove + (`!b k. &(b + 2) / &(b + 1) * &(gseq b k) = + &(gseq b k) + &(gseq b k) / &(b + 1)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `~(&(b + 1) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&(b + 2) = &(b + 1) + &1` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[real_div; REAL_ADD_RDISTRIB; REAL_MUL_RINV; REAL_MUL_LID] THEN + REWRITE_TAC[REAL_MUL_AC]);; + +(* Lower bound: gseq grows at least as fast as (b+2)/(b+1) per step *) +let GSEQ_GROWTH_STEP = prove + (`!b k. (&(b + 2) / &(b + 1)) * &(gseq b k) <= &(gseq b (SUC k))`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `gseq b k * (b + 2) <= gseq b (SUC k) * (b + 1)` MP_TAC THENL + [REWRITE_TAC[gseq; LEFT_ADD_DISTRIB; MULT_CLAUSES] THEN + SUBGOAL_THEN `gseq b k DIV (b + 1) * (b + 1) <= gseq b k` + (fun th -> MP_TAC th THEN ARITH_TAC) THEN + ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[DIV_MUL_LE]; + ALL_TAC] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_MUL; GSYM REAL_OF_NUM_LE] THEN + DISCH_TAC THEN + MP_TAC(ISPECL [`&(gseq b k) * &(b + 2)`; `&(gseq b (SUC k)) * &(b + 1)`; + `inv(&(b + 1))`] REAL_LE_RMUL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_INV THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `~(&(b + 1) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_RINV; REAL_MUL_RID] THEN + REWRITE_TAC[real_div; REAL_MUL_AC]);; + +(* Upper bound: gseq grows at most (b+2)/(b+1) * gseq + 1 per step *) +let GSEQ_UPPER_STEP_NAT = prove + (`!b k. gseq b (SUC k) * (b + 1) <= gseq b k * (b + 2) + (b + 1)`, + REPEAT GEN_TAC THEN REWRITE_TAC[gseq] THEN + REWRITE_TAC[LEFT_ADD_DISTRIB; MULT_CLAUSES] THEN + SUBGOAL_THEN `gseq b k DIV (b + 1) * (b + 1) <= gseq b k` + (fun th -> MP_TAC th THEN ARITH_TAC) THEN + ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[DIV_MUL_LE]);; + +let GSEQ_UPPER_STEP = prove + (`!b k. &(gseq b (SUC k)) <= &(b + 2) / &(b + 1) * &(gseq b k) + &1`, + REPEAT GEN_TAC THEN REWRITE_TAC[gseq] THEN + SUBGOAL_THEN `&(gseq b k DIV (b + 1)) <= &(gseq b k) / &(b + 1)` MP_TAC THENL + [MP_TAC(SPECL [`gseq b k`; `b + 1`] REAL_DIV_FLOOR_LE) THEN + REWRITE_TAC[ARITH_RULE `0 < b + 1`]; + ALL_TAC] THEN + MP_TAC(SPEC_ALL GSEQ_DIV_IDENTITY) THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN + REAL_ARITH_TAC);; + +(* Iterated growth: (b+2)/(b+1)^m * gseq(k) <= gseq(k+m) *) +let GSEQ_GROWTH_ITERATED = prove + (`!b m k. (&(b + 2) / &(b + 1)) pow m * &(gseq b k) <= &(gseq b (k + m))`, + GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[real_pow; ADD_CLAUSES; REAL_MUL_LID; REAL_LE_REFL]; + GEN_TAC THEN REWRITE_TAC[real_pow; ADD_CLAUSES] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&(b + 2) / &(b + 1) * &(gseq b (k + m))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [SIMP_TAC[REAL_LE_DIV; REAL_POS]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[GSEQ_GROWTH_STEP]]]);; + +(* Geometric lower bound: (b+2)/(b+1)^k <= gseq(b,k) *) +let GSEQ_GEOMETRIC_LOWER = prove + (`!b k. (&(b + 2) / &(b + 1)) pow k <= &(gseq b k)`, + GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[real_pow; gseq] THEN REAL_ARITH_TAC; + REWRITE_TAC[real_pow] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&(b + 2) / &(b + 1)) * &(gseq b k)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [SIMP_TAC[REAL_LE_DIV; REAL_POS]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[GSEQ_GROWTH_STEP]]]);; + +(* Inverse-square ratio for gseq: key ingredient for recurrence *) +let GSEQ_INV_POW2_RATIO = prove + (`!b k. inv(&(gseq b (SUC k)) pow 2) <= + (&(b + 1) / &(b + 2)) pow 2 * inv(&(gseq b k) pow 2)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `(&(b + 2) / &(b + 1) * &(gseq b k)) pow 2 <= + &(gseq b (SUC k)) pow 2` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_POW_LE2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_POS] THEN MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_POS]; + REWRITE_TAC[GSEQ_GROWTH_STEP]]; ALL_TAC] THEN + SUBGOAL_THEN `inv(&(gseq b (SUC k)) pow 2) <= + inv((&(b + 2) / &(b + 1) * &(gseq b k)) pow 2)` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_POW_LT THEN + MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH_RULE `0 < b + 2`; + ARITH_RULE `0 < b + 1`]; + REWRITE_TAC[REAL_OF_NUM_LT] THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC]; + ALL_TAC] THEN + REWRITE_TAC[REAL_POW_MUL; REAL_INV_MUL; REAL_POW_INV; + real_div; REAL_INV_INV; REAL_MUL_AC]);; + +(* Sum splitting along gseq blocks *) +let GSEQ_SUM_SPLIT = prove + (`!b V k. sum(0..gseq b (SUC k) - 1) V = + sum(0..gseq b k - 1) (V:num->real) + + sum(gseq b k..gseq b (SUC k) - 1) V`, + REPEAT GEN_TAC THEN + MP_TAC(ISPECL [`V:num->real`; `0`; `gseq b k`; + `gseq b (SUC k) - 1`] SUM_COMBINE_L) THEN + ANTS_TAC THENL + [MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_SUC_GT) THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN + SIMP_TAC[ARITH_RULE `1 <= n ==> n - 1 + 1 = n`]]);; + +(* Summability of the "variance-like" terms along gseq subsequence *) +let SUMMABLE_VARIANCE_GSEQ = prove + (`!b V. (!n. &0 <= V n) /\ + real_summable (from 0) (\n. V n / &(SUC n) pow 2) + ==> real_summable (from 0) + (\k. sum(0..gseq b k - 1) V / &(gseq b k) pow 2)`, + GEN_TAC THEN GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `a = \k. sum(0..gseq b k - 1) (V:num->real) / + &(gseq b k) pow 2` THEN + ABBREV_TAC `c = \k. sum(gseq b k..gseq b (SUC k) - 1) (V:num->real) / + &(gseq b (SUC k)) pow 2` THEN + (* c is summable *) + SUBGOAL_THEN `real_summable (from 0) (c:num->real)` ASSUME_TAC THENL + [EXPAND_TAC "c" THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\k. sum(gseq b k..gseq b (SUC k) - 1) + (\i. (V:num->real) i / &(SUC i) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC + `real_infsum (from 0) (\n. (V:num->real) n / &(SUC n) pow 2)` THEN + CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_LE THEN REAL_ARITH_TAC; + GEN_TAC THEN + SUBGOAL_THEN + `!N. sum(0..N) (\k. sum(gseq b k..gseq b (SUC k) - 1) + (\i. (V:num->real) i / &(SUC i) pow 2)) <= + sum(gseq b 0..gseq b (SUC N) - 1) + (\i. V i / &(SUC i) pow 2)` MP_TAC THENL + [INDUCT_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG] THEN BETA_TAC THEN REAL_ARITH_TAC; + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(gseq b 0..gseq b (SUC N) - 1) + (\i. (V:num->real) i / &(SUC i) pow 2) + + sum(gseq b (SUC N)..gseq b (SUC (SUC N)) - 1) + (\i. V i / &(SUC i) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC[REAL_LE_REFL]; + MP_TAC(ISPECL [`\i. (V:num->real) i / &(SUC i) pow 2`; + `gseq b 0`; `gseq b (SUC N)`; + `gseq b (SUC (SUC N)) - 1`] SUM_COMBINE_L) THEN + SUBGOAL_THEN `gseq b 0 <= gseq b (SUC N)` ASSUME_TAC THENL + [MESON_TAC[GSEQ_MONOTONE; LE_0]; ALL_TAC] THEN + SUBGOAL_THEN `gseq b (SUC N) < gseq b (SUC (SUC N))` + ASSUME_TAC THENL + [REWRITE_TAC[GSEQ_SUC_GT]; ALL_TAC] THEN + SUBGOAL_THEN `1 <= gseq b (SUC N)` ASSUME_TAC THENL + [REWRITE_TAC[GSEQ_POS]; ALL_TAC] THEN + SUBGOAL_THEN `1 <= gseq b (SUC (SUC N))` ASSUME_TAC THENL + [REWRITE_TAC[GSEQ_POS]; ALL_TAC] THEN + ANTS_TAC THENL + [ASM_ARITH_TAC; + ASM_SIMP_TAC[ARITH_RULE `1 <= n ==> n - 1 + 1 = n`] THEN + SIMP_TAC[REAL_LE_REFL]]]]; + ALL_TAC] THEN + DISCH_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(gseq b 0..gseq b (SUC N) - 1) + (\i. (V:num->real) i / &(SUC i) pow 2)` THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum(0..gseq b (SUC N) - 1) + (\i. (V:num->real) i / &(SUC i) pow 2)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN + REWRITE_TAC[FINITE_NUMSEG; SUBSET; IN_NUMSEG] THEN CONJ_TAC THENL + [MP_TAC(SPEC `b:num` GSEQ_POS) THEN REWRITE_TAC[gseq] THEN + ARITH_TAC; + REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_LE THEN + REAL_ARITH_TAC]; + MP_TAC(ISPECL [`\n. (V:num->real) n / &(SUC n) pow 2`; `from 0`; + `gseq b (SUC N) - 1`] REAL_PARTIAL_SUMS_LE_INFSUM) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[FROM_INTER_NUMSEG; IN_FROM; LE_0] THEN + REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC REAL_POW_LE THEN + REAL_ARITH_TAC; + ASM_REWRITE_TAC[FROM_INTER_NUMSEG]]]]; + (* Pointwise bound *) + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; + ALL_TAC] THEN + REWRITE_TAC[real_div; GSYM SUM_RMUL] THEN + MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LT THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + ARITH_TAC; + MATCH_MP_TAC REAL_POW_LE2 THEN + REWRITE_TAC[REAL_POS; REAL_OF_NUM_LE] THEN + MP_TAC(SPECL [`b:num`; `SUC n`] GSEQ_POS) THEN ASM_ARITH_TAC]]; + ALL_TAC] THEN + (* a is nonneg *) + SUBGOAL_THEN `!k. &0 <= (a:num->real) k` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "a" THEN MATCH_MP_TAC REAL_LE_DIV THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; + ALL_TAC] THEN + (* c is nonneg *) + SUBGOAL_THEN `!k. &0 <= (c:num->real) k` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "c" THEN MATCH_MP_TAC REAL_LE_DIV THEN + CONJ_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_POW_LE THEN REWRITE_TAC[REAL_POS]]; + ALL_TAC] THEN + ABBREV_TAC `rho = (&(b + 1) / &(b + 2)) pow 2` THEN + SUBGOAL_THEN `&0 <= rho /\ rho < &1` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "rho" THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_POW_LE THEN MATCH_MP_TAC REAL_LE_DIV THEN + REWRITE_TAC[REAL_POS]; + MATCH_MP_TAC REAL_POW_1_LT THEN REWRITE_TAC[ARITH] THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS]; + SIMP_TAC[REAL_LT_LDIV_EQ; REAL_OF_NUM_LT; + ARITH_RULE `0 < b + 2`; REAL_MUL_LID; + REAL_OF_NUM_LT] THEN ARITH_TAC]]; + ALL_TAC] THEN + (* Recurrence: a(SUC k) <= rho * a(k) + c(k) *) + SUBGOAL_THEN `!k. (a:num->real) (SUC k) <= rho * a k + (c:num->real) k` + (LABEL_TAC "REC") THENL + [GEN_TAC THEN EXPAND_TAC "a" THEN EXPAND_TAC "c" THEN + REWRITE_TAC[GSEQ_SUM_SPLIT; real_div; REAL_ADD_RDISTRIB] THEN + MATCH_MP_TAC(REAL_ARITH `x <= y ==> x + z <= y + z`) THEN + SUBGOAL_THEN `inv(&(gseq b (SUC k)) pow 2) <= + rho * inv(&(gseq b k) pow 2)` MP_TAC THENL + [EXPAND_TAC "rho" THEN REWRITE_TAC[GSEQ_INV_POW2_RATIO]; + ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `sum(0..gseq b k - 1) (V:num->real)` o + MATCH_MP(ISPECL [`x:real`; `y:real`] + (REWRITE_RULE[IMP_CONJ] REAL_LE_RMUL))) THEN + ANTS_TAC THENL + [MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_AC]; + ALL_TAC] THEN + (* Infsum of c *) + SUBGOAL_THEN `&0 <= real_infsum (from 0) (c:num->real)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sum((from 0) INTER (0..0)) (c:num->real)` THEN + CONJ_TAC THENL + [REWRITE_TAC[FROM_INTER_NUMSEG; SUM_SING_NUMSEG] THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_PARTIAL_SUMS_LE_INFSUM THEN + ASM_REWRITE_TAC[IN_FROM; LE_0]]; + ALL_TAC] THEN + (* Bounded partial sums *) + MATCH_MP_TAC REAL_SUMMABLE_BOUND_PARTIAL THEN + EXISTS_TAC + `((a:num->real) 0 + real_infsum (from 0) c) / (&1 - rho)` THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN + SUBGOAL_THEN `&0 < &1 - rho` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + MATCH_MP_TAC(REAL_ARITH + `s <= a0 + rho * s + C + ==> s * (&1 - rho) <= a0 + C`) THEN + ASM_CASES_TAC `N = 0` THENL + [ASM_REWRITE_TAC[SUM_SING_NUMSEG] THEN + MATCH_MP_TAC(REAL_ARITH + `&0 <= x /\ &0 <= y ==> a <= a + x + y`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `?M. N = SUC M` + (X_CHOOSE_THEN `M:num` SUBST_ALL_TAC) THENL + [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + SUBGOAL_THEN `sum(0..SUC M) (a:num->real) = + a 0 + sum(0..M) (\k. a (SUC k))` SUBST1_TAC THENL + [MP_TAC(ISPECL [`a:num->real`; `0`; `SUC M`] SUM_CLAUSES_LEFT) THEN + REWRITE_TAC[LE_0] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[ADD1] THEN AP_TERM_TAC THEN + MP_TAC(ISPECL [`1`; `a:num->real`; `0`; `M:num`] SUM_OFFSET) THEN + REWRITE_TAC[ADD_CLAUSES] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[GSYM ADD1]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `x <= y ==> a + x <= a + y`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `rho * sum(0..M) (a:num->real) + sum(0..M) (c:num->real)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `sum(0..M) (\k. (a:num->real) (SUC k)) <= + sum(0..M) (\k. rho * a k + (c:num->real) k)` MP_TAC THENL + [MATCH_MP_TAC SUM_LE_NUMSEG THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + USE_THEN "REC" (ACCEPT_TAC o SPEC `i:num`); + ALL_TAC] THEN + SUBGOAL_THEN `sum(0..M) (\k. rho * (a:num->real) k + c k) = + rho * sum(0..M) a + sum(0..M) c` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[SUM_ADD_NUMSEG; SUM_LMUL]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(a:num->real) 0 + sum(0..M) (\k. a(SUC k)) = sum(0..SUC M) a` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`a:num->real`; `0`; `SUC M`] SUM_CLAUSES_LEFT) THEN + REWRITE_TAC[LE_0] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[ADD1] THEN AP_TERM_TAC THEN + MP_TAC(ISPECL [`1`; `a:num->real`; `0`; `M:num`] SUM_OFFSET) THEN + REWRITE_TAC[ADD_CLAUSES] THEN DISCH_THEN SUBST1_TAC THEN + REWRITE_TAC[GSYM ADD1]; + ALL_TAC] THEN + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> a <= a + x`) THEN + ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`c:num->real`; `from 0`; `M:num`] + REAL_PARTIAL_SUMS_LE_INFSUM) THEN + ASM_REWRITE_TAC[FROM_INTER_NUMSEG; IN_FROM; LE_0]]);; + +(* SLLN subsequence convergence along gseq -- generalization of SLLN_SUBSEQ_DYADIC *) +(* S_{gseq(k)} / gseq(k) -> 0 a.s. under summable variance condition *) +let SLLN_SUBSEQ_GSEQ = prove + (`!p:A prob_space X b. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (X n) = &0) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> almost_surely p + {x | ((\k. inv(&(gseq b k)) * sum(0..gseq b k - 1) (\i. X i x)) + ---> &0) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC BCL1_CONVERGENCE_RV THEN BETA_TAC THEN + CONJ_TAC THENL + [(* Each Y_k = inv(gseq b k) * sum Xi is a random variable *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; + `gseq b k - 1`] INTEGRABLE_SUM) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[integrable] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* Summability of deviation probabilities *) + X_GEN_TAC `eps:real` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN + EXISTS_TAC `\k:num. inv(eps pow 2) * + (sum(0..gseq b k - 1) (\i. variance p ((X:num->A->real) i)) / + &(gseq b k) pow 2)` THEN + CONJ_TAC THENL + [(* Comparison is summable *) + MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN + MATCH_MP_TAC SUMMABLE_VARIANCE_GSEQ THEN BETA_TAC THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN MATCH_MP_TAC VARIANCE_NONNEG THEN BETA_TAC THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO]; ALL_TAC] THEN + (* Pointwise bound via Chebyshev *) + EXISTS_TAC `0` THEN X_GEN_TAC `k:num` THEN + REWRITE_TAC[GE; LE_0; IN_FROM] THEN BETA_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + ABBREV_TAC `nn = gseq b k` THEN + SUBGOAL_THEN `~(&nn = &0)` ASSUME_TAC THENL + [EXPAND_TAC "nn" THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. sum(0..nn - 1) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM THEN BETA_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (sum(0..nn - 1) (\i. (X:num->A->real) i x)) pow 2)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUM_SQUARE THEN BETA_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) (\i. (X:num->A->real) i x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) (\i. (X:num->A->real) i x)) = &0` + (LABEL_TAC "EXP") THENL + [ASM_SIMP_TAC[EXPECTATION_CMUL] THEN + ASM_SIMP_TAC[EXPECTATION_SUM] THEN + ASM_REWRITE_TAC[SUM_0; REAL_MUL_RZERO]; ALL_TAC] THEN + CONJ_TAC THENL + [(* prob >= 0 *) + MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN MATCH_MP_TAC RANDOM_VARIABLE_CMUL THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`; `nn - 1`] + INTEGRABLE_SUM) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[integrable] THEN MESON_TAC[]]; + ALL_TAC] THEN + (* Apply Chebyshev via transitivity *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `variance (p:A prob_space) + (\x:A. inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) / eps pow 2` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + abs(inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) >= eps} = + {x | x IN prob_carrier p /\ + abs((\x. inv(&nn) * sum(0..nn - 1) + (\i. (X:num->A->real) i x)) x - + expectation p (\x. inv(&nn) * sum(0..nn - 1) + (\i. X i x))) >= eps}` + SUBST1_TAC THENL + [CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO]; + ALL_TAC] THEN + MATCH_MP_TAC CHEBYSHEV_INEQUALITY THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_SUB_RZERO; REAL_POW_MUL] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[VARIANCE_CMUL] THEN + SUBGOAL_THEN `variance (p:A prob_space) + (\x:A. sum(0..nn - 1) (\i. (X:num->A->real) i x)) = + sum(0..nn - 1) (\i. variance p (X i))` SUBST1_TAC THENL + [ASM_SIMP_TAC[VARIANCE_SUM_UNCORRELATED]; ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_INV_POW; GSYM REAL_MUL_ASSOC] THEN + REWRITE_TAC[REAL_MUL_AC] THEN + REAL_ARITH_TAC);; + +(* ================================================================== *) +(* Squeeze lemma: extend convergence from gseq subsequences to all n *) +(* ================================================================== *) + +(* Helper: fractional monotonicity *) +let REAL_LE_DIV_MONO = prove + (`!a1 a2 d1 d2:real. &0 < d1 /\ d1 <= d2 /\ &0 <= a1 /\ a1 <= a2 + ==> a1 / d2 <= a2 / d1`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < d2` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `a2 / d2:real` THEN + CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LE_DIV2_EQ]; + REWRITE_TAC[real_div] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[]]]);; + +(* Helper: for any n, there exists k with gseq(b,k) <= n+1 < gseq(b,k+1) *) +let GSEQ_BRACKET = prove + (`!b n. ?k. gseq b k <= SUC n /\ SUC n < gseq b (SUC k)`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `?k:num. SUC n < gseq b k` MP_TAC THENL + [MP_TAC(SPECL [`b:num`; `SUC n`] GSEQ_UNBOUNDED) THEN + DISCH_THEN(X_CHOOSE_TAC `j:num`) THEN EXISTS_TAC `j:num` THEN + ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o REWRITE_RULE + [BETA_RULE(SPEC `\k. SUC n < gseq b k` num_WOP)]) THEN + DISCH_THEN(X_CHOOSE_THEN `k0:num` STRIP_ASSUME_TAC) THEN + ASM_CASES_TAC `k0 = 0` THENL + [SUBGOAL_THEN `gseq b 0 = 1` ASSUME_TAC THENL + [REWRITE_TAC[gseq]; ALL_TAC] THEN + UNDISCH_TAC `SUC n < gseq b k0` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `?j. k0 = SUC j` (X_CHOOSE_THEN `j:num` SUBST_ALL_TAC) THENL + [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + EXISTS_TAC `j:num` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[NOT_LT]);; + +(* gseq step size bound *) +let GSEQ_STEP_BOUND = prove + (`!b k. gseq b (SUC k) - gseq b k <= gseq b k DIV (b + 1) + 1`, + REWRITE_TAC[gseq] THEN ARITH_TAC);; + +(* gseq step size real bound *) +let GSEQ_STEP_RATIO = prove + (`!b k. &(gseq b (SUC k) - gseq b k) / &(gseq b k) <= + inv(&(b + 1)) + inv(&(gseq b k))`, + REPEAT GEN_TAC THEN + SUBGOAL_THEN `gseq b (SUC k) - gseq b k = gseq b k DIV (b + 1) + 1` + SUBST1_TAC THENL + [REWRITE_TAC[gseq] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(gseq b k)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(&(gseq b k) / &(b + 1) + &1) / &(gseq b k)` THEN + CONJ_TAC THENL + [ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN + SIMP_TAC[REAL_LE_RDIV_EQ; REAL_ARITH `&0 < &b + &1`] THEN + REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE; REAL_OF_NUM_ADD] THEN + MP_TAC(SPECL [`gseq b k`; `b + 1`] DIVISION) THEN + ANTS_TAC THENL [ARITH_TAC; ARITH_TAC]; + REAL_ARITH_TAC]; ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_ADD_RDISTRIB; REAL_MUL_LID] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + SUBGOAL_THEN `&(gseq b k) * inv (&(b + 1)) * inv (&(gseq b k)) = + inv(&(b + 1))` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_AC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_ARITH `&0 < x ==> ~(x = &0)`; + REAL_MUL_RID]; + REAL_ARITH_TAC]);; + +(* Main squeeze lemma *) +let NONDECREASING_CONVERGENCE_GSEQ = prove + (`!f L. + (!m n:num. m <= n ==> f m <= f n) /\ + (!n. &0 <= f n) /\ + &0 <= L /\ + (!b. ((\k. f(gseq b k - 1) / &(gseq b k)) ---> L) sequentially) + ==> ((\n. f n / &(SUC n)) ---> L) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Choose b0 large: C/(b0+1) < e/8 *) + ABBREV_TAC `C = L + e + &1` THEN + SUBGOAL_THEN `&0 < C` ASSUME_TAC THENL + [EXPAND_TAC "C" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPEC `&8 * C / e` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `b0:num`) THEN + SUBGOAL_THEN `C / &(b0 + 1) < e / &8` (LABEL_TAC "Hb") THENL + [SUBGOAL_THEN `0 < b0` ASSUME_TAC THENL + [REWRITE_TAC[ARITH_RULE `0 < b0 <=> ~(b0 = 0)`] THEN DISCH_TAC THEN + UNDISCH_TAC `&8 * C / e <= &b0` THEN ASM_REWRITE_TAC[] THEN + SIMP_TAC[REAL_NOT_LE] THEN + ASM_SIMP_TAC[REAL_LT_MUL; REAL_LT_DIV; REAL_OF_NUM_LT; ARITH]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `C / &b0` THEN CONJ_TAC THENL + [REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LT_LMUL THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LT_INV2 THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_LDIV_EQ; REAL_OF_NUM_LT] THEN + SUBGOAL_THEN `C <= e / &8 * &b0` MATCH_ACCEPT_TAC THEN + SUBGOAL_THEN `&8 * C <= e * &b0` ASSUME_TAC THENL + [SUBGOAL_THEN `(&8 * C / e) * e = &8 * C` ASSUME_TAC THENL + [REWRITE_TAC[real_div; GSYM REAL_MUL_ASSOC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_ARITH `&0 < e ==> ~(e = &0)`; + REAL_MUL_RID]; ALL_TAC] THEN + SUBGOAL_THEN `(&8 * C / e) * e <= &b0 * e` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; ARITH] THEN + ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Get K from convergence along gseq b0 *) + FIRST_X_ASSUM(MP_TAC o SPEC `b0:num`) THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e / &4`) THEN + ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN + DISCH_THEN(X_CHOOSE_THEN `K:num` (LABEL_TAC "Hconv")) THEN + (* Get K2 from gseq being unbounded *) + MP_TAC(SPECL [`b0:num`; `b0 + 1`] GSEQ_UNBOUNDED) THEN + DISCH_THEN(X_CHOOSE_THEN `K2:num` ASSUME_TAC) THEN + (* Set threshold *) + EXISTS_TAC `gseq b0 (K + K2 + 1) - 1` THEN + X_GEN_TAC `n:num` THEN DISCH_TAC THEN + (* Find k with gseq(b0,k) <= n+1 < gseq(b0,k+1) *) + MP_TAC(SPECL [`b0:num`; `n:num`] GSEQ_BRACKET) THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + (* Show k >= K+K2+1 *) + SUBGOAL_THEN `K + K2 + 1 <= k` ASSUME_TAC THENL + [SUBGOAL_THEN `gseq b0 (K + K2 + 1) <= SUC n` ASSUME_TAC THENL + [MP_TAC(SPECL [`b0:num`; `K + K2 + 1`] GSEQ_POS) THEN ASM_ARITH_TAC; + ALL_TAC] THEN + ASM_CASES_TAC `k < K + K2 + 1` THENL + [SUBGOAL_THEN `gseq b0 (SUC k) <= gseq b0 (K + K2 + 1)` MP_TAC THENL + [MATCH_MP_TAC GSEQ_MONOTONE THEN ASM_ARITH_TAC; ASM_ARITH_TAC]; + ASM_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `K <= k /\ K <= SUC k /\ K2 <= k` STRIP_ASSUME_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + (* gseq(b0,k) is large: b0+1 < gseq(K2) <= gseq(k) *) + SUBGOAL_THEN `b0 + 1 < gseq b0 k` ASSUME_TAC THENL + [MATCH_MP_TAC LTE_TRANS THEN EXISTS_TAC `gseq b0 K2` THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC GSEQ_MONOTONE THEN ASM_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(gseq b0 k)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(gseq b0 (SUC k))` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN + MP_TAC(SPECL [`b0:num`; `SUC k`] GSEQ_POS) THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &(SUC n)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC; ALL_TAC] THEN + (* Key ratio bound: C * inv(gseq(k)) < e/8 *) + SUBGOAL_THEN `C * inv(&(gseq b0 k)) < e / &8` (LABEL_TAC "Hgk") THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `C / &(b0 + 1)` THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[GSYM real_div] THEN + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL THEN + ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN + ASM_ARITH_TAC; ALL_TAC] THEN + (* Convergence values *) + SUBGOAL_THEN `abs(f(gseq b0 k - 1) / &(gseq b0 k) - L) < e / &4` + (LABEL_TAC "Hak") THENL + [USE_THEN "Hconv" MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `abs(f(gseq b0 (SUC k) - 1) / &(gseq b0 (SUC k)) - L) < e / &4` + (LABEL_TAC "Hak1") THENL + [USE_THEN "Hconv" MATCH_MP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + ABBREV_TAC `ak = f(gseq b0 k - 1:num) / &(gseq b0 k)` THEN + ABBREV_TAC `ak1 = f(gseq b0 (SUC k) - 1:num) / &(gseq b0 (SUC k))` THEN + (* ak, ak1 are nonneg and close to L *) + SUBGOAL_THEN `&0 <= ak /\ ak < L + e / &4 /\ L - e / &4 < ak` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [EXPAND_TAC "ak" THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + UNDISCH_TAC `abs(ak - L) < e / &4` THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= ak1 /\ ak1 < L + e / &4 /\ L - e / &4 < ak1` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [EXPAND_TAC "ak1" THEN MATCH_MP_TAC REAL_LE_DIV THEN + ASM_REWRITE_TAC[REAL_POS]; ALL_TAC] THEN + UNDISCH_TAC `abs(ak1 - L) < e / &4` THEN REAL_ARITH_TAC; ALL_TAC] THEN + (* ak < C and ak1 < C *) + SUBGOAL_THEN `ak < C /\ ak1 < C` STRIP_ASSUME_TAC THENL + [EXPAND_TAC "C" THEN ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* Step ratio bound: C * step/g < e/4 *) + SUBGOAL_THEN `C * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 k) < e / &4` + (LABEL_TAC "Hstep") THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `C * (inv(&(b0 + 1)) + inv(&(gseq b0 k)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + REWRITE_TAC[GSEQ_STEP_RATIO]; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `e / &8 + e / &8` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL + [REWRITE_TAC[GSYM real_div] THEN USE_THEN "Hb" ACCEPT_TAC; + USE_THEN "Hgk" ACCEPT_TAC]; + REAL_ARITH_TAC]; ALL_TAC] THEN + (* Upper bound: f(n)/(n+1) - L < e *) + SUBGOAL_THEN `f n / &(SUC n) - L < e` (LABEL_TAC "upper") THENL + [SUBGOAL_THEN `f n / &(SUC n) <= + f(gseq b0 (SUC k) - 1) / &(gseq b0 k)` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV_MONO THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN + REPEAT CONJ_TAC THENL + [ASM_ARITH_TAC; + ASM_REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `u - L < e ==> x <= u ==> x - L < e`) THEN + (* f(gseq(k+1)-1)/gseq(k) - L = ak1 * gseq(k+1)/gseq(k) - L *) + SUBGOAL_THEN `f(gseq b0 (SUC k) - 1) / &(gseq b0 k) = + ak1 * &(gseq b0 (SUC k)) / &(gseq b0 k)` SUBST1_TAC THENL + [EXPAND_TAC "ak1" THEN REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_LINV; + REAL_ARITH `&0 < x ==> ~(x = &0)`; REAL_MUL_RID]; + ALL_TAC] THEN + (* Decompose: ak1 * gseq(k+1)/gseq(k) - L = + (ak1 - L) + ak1 * (gseq(k+1)-gseq(k))/gseq(k) *) + SUBGOAL_THEN `&(gseq b0 (SUC k)) = + &(gseq b0 k) + &(gseq b0 (SUC k) - gseq b0 k)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_ADD] THEN AP_TERM_TAC THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_SUC_GT) THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `ak1 * &(gseq b0 (SUC k)) / &(gseq b0 k) - L = + (ak1 - L) + ak1 * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 k)` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_div; REAL_ADD_RDISTRIB; REAL_MUL_LID] THEN + ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_RINV; + REAL_ARITH `&0 < x ==> ~(x = &0)`; REAL_MUL_RID] THEN + REWRITE_TAC[REAL_MUL_AC] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Bound: (ak1 - L) < e/4 and ak1 * step < C * step < e/4 *) + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `e / &4 + e / &4` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL + [UNDISCH_TAC `abs(ak1 - L) < e / &4` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `C * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 k)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_RMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS]; + USE_THEN "Hstep" ACCEPT_TAC]]; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* Lower bound: L - f(n)/(n+1) < e *) + SUBGOAL_THEN `L - f n / &(SUC n) < e` (LABEL_TAC "lower") THENL + [SUBGOAL_THEN `f(gseq b0 k - 1) / &(gseq b0 (SUC k)) <= f n / &(SUC n)` + MP_TAC THENL + [MATCH_MP_TAC REAL_LE_DIV_MONO THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN + REPEAT CONJ_TAC THENL + [ASM_ARITH_TAC; + ASM_REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_POS) THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `L - l < e ==> l <= x ==> L - x < e`) THEN + (* L - f(gseq(k)-1)/gseq(k+1) *) + SUBGOAL_THEN `f(gseq b0 k - 1) / &(gseq b0 (SUC k)) = + ak * &(gseq b0 k) / &(gseq b0 (SUC k))` SUBST1_TAC THENL + [EXPAND_TAC "ak" THEN REWRITE_TAC[real_div; REAL_MUL_ASSOC] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + ASM_SIMP_TAC[GSYM REAL_MUL_ASSOC; REAL_MUL_LINV; + REAL_ARITH `&0 < x ==> ~(x = &0)`; REAL_MUL_RID]; + ALL_TAC] THEN + SUBGOAL_THEN `&(gseq b0 (SUC k)) = + &(gseq b0 k) + &(gseq b0 (SUC k) - gseq b0 k)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_ADD] THEN AP_TERM_TAC THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_SUC_GT) THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `L - ak * &(gseq b0 k) / &(gseq b0 (SUC k)) = + (L - ak) + ak * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 (SUC k))` + SUBST1_TAC THENL + [REWRITE_TAC[real_div] THEN ONCE_REWRITE_TAC[GSYM REAL_SUB_0] THEN + MATCH_MP_TAC(REAL_ARITH + `q + p = a ==> l - p - ((l - a) + q) = &0`) THEN + REWRITE_TAC[GSYM REAL_ADD_LDISTRIB; GSYM REAL_ADD_RDISTRIB] THEN + SUBGOAL_THEN `&(gseq b0 (SUC k) - gseq b0 k) + &(gseq b0 k) = + &(gseq b0 (SUC k))` SUBST1_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_ADD] THEN AP_TERM_TAC THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_SUC_GT) THEN ARITH_TAC; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_MUL_RINV; REAL_ARITH `&0 < x ==> ~(x = &0)`; + REAL_MUL_RID]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `e / &4 + e / &4` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LT_ADD2 THEN CONJ_TAC THENL + [UNDISCH_TAC `abs(ak - L) < e / &4` THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `C * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 k)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `ak * &(gseq b0 (SUC k) - gseq b0 k) / &(gseq b0 k)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_LMUL THEN + REWRITE_TAC[REAL_POS] THEN + MATCH_MP_TAC REAL_LE_INV2 THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN + MP_TAC(SPECL [`b0:num`; `k:num`] GSEQ_SUC_GT) THEN ARITH_TAC; + MATCH_MP_TAC REAL_LE_RMUL THEN ASM_SIMP_TAC[REAL_LT_IMP_LE] THEN + MATCH_MP_TAC REAL_LE_DIV THEN REWRITE_TAC[REAL_POS]]; + USE_THEN "Hstep" ACCEPT_TAC]]; + UNDISCH_TAC `&0 < e` THEN REAL_ARITH_TAC]; ALL_TAC] THEN + UNDISCH_TAC `f n / &(SUC n) - L < e` THEN + UNDISCH_TAC `L - f n / &(SUC n) < e` THEN + REAL_ARITH_TAC);; + +(* Nonneg SLLN: Strong Law of Large Numbers for nonneg uncorrelated RVs *) +(* Uses the squeeze lemma NONDECREASING_CONVERGENCE_GSEQ to extend *) +(* convergence along gseq subsequences to convergence along all n. *) +let NONNEG_SLLN = prove + (`!p:A prob_space (X:num->A->real) mu. + (!n. integrable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n x. x IN prob_carrier p ==> &0 <= X n x) /\ + (!n. expectation p (X n) = mu) /\ + (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ + real_summable (from 0) (\n. variance p (X n) / &(SUC n) pow 2) + ==> almost_surely p + {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) + sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* mu >= 0 from nonnegativity *) + SUBGOAL_THEN `&0 <= mu` ASSUME_TAC THENL + [SUBGOAL_THEN `mu = expectation p ((X:num->A->real) 0)` SUBST1_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Reduce: suffices to show a.s. convergence along all gseq b *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `INTERS + {(\b:num. {x:A | + ((\k. inv(&(gseq b k)) * + sum(0..gseq b k - 1) (\i. (X:num->A->real) i x - mu)) + ---> &0) sequentially}) b | b IN (:num)}` THEN + CONJ_TAC THENL + [(* Almost sure convergence along gseq for all b *) + MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN + BETA_TAC THEN GEN_TAC THEN + (* Apply SLLN_SUBSEQ_GSEQ to centered variables X_n - mu *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n (x:A). (X:num->A->real) n x - mu`; + `b:num`] SLLN_SUBSEQ_GSEQ) THEN + BETA_TAC THEN + DISCH_THEN MATCH_MP_TAC THEN REPEAT CONJ_TAC THENL + [(* integrable (\x. X n x - mu) *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; + (* integrable (\x. (X n x - mu) pow 2) *) + GEN_TAC THEN + SUBGOAL_THEN `(\x:A. ((X:num->A->real) n x - mu) pow 2) = + (\x. X n x pow 2 + (--(&2 * mu) * X n x + mu pow 2))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_SIMP_TAC[ETA_AX]; + REWRITE_TAC[INTEGRABLE_CONST]]]]; + (* expectation (\x. X n x - mu) = 0 *) + GEN_TAC THEN + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN + ASM_REWRITE_TAC[ETA_AX] THEN REAL_ARITH_TAC; + (* covariance (\x. X i x - mu) (\x. X j x - mu) = 0 *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `covariance p (\x:A. (X:num->A->real) i x - mu) + (\x. X j x - mu) = covariance p (X i) (X j)` SUBST1_TAC THENL + [MATCH_MP_TAC COVARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; + (* summable variance *) + MATCH_MP_TAC REAL_SUMMABLE_EQ THEN + EXISTS_TAC `\n. variance p ((X:num->A->real) n) / &(SUC n) pow 2` THEN + ASM_REWRITE_TAC[IN_FROM] THEN + GEN_TAC THEN DISCH_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN `(\x':A. (X:num->A->real) x x' - mu) = + (\x'. X x x' + --mu)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC VARIANCE_SHIFT THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* On the a.s. set, apply NONDECREASING_CONVERGENCE_GSEQ pointwise *) + REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + BETA_TAC THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN DISCH_TAC THEN + (* Apply the deterministic squeeze lemma *) + MP_TAC(SPECL [`\n. sum(0..n) (\i. (X:num->A->real) i x)`; `mu:real`] + NONDECREASING_CONVERGENCE_GSEQ) THEN + BETA_TAC THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [(* nondecreasing: sum(0..m) <= sum(0..n) when m <= n *) + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SUM_SUBSET_SIMPLE THEN + REWRITE_TAC[FINITE_NUMSEG] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_NUMSEG] THEN ASM_ARITH_TAC; + REWRITE_TAC[IN_DIFF; IN_NUMSEG] THEN ASM_MESON_TAC[]]; + (* nonneg *) + GEN_TAC THEN MATCH_MP_TAC SUM_POS_LE_NUMSEG THEN + ASM_MESON_TAC[]; + (* 0 <= mu *) + ASM_REWRITE_TAC[]; + (* convergence along gseq: sum(0..gseq(b,k)-1)(X_i)/gseq(b,k) -> mu *) + GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `b:num`) THEN + SUBGOAL_THEN `!k. inv(&(gseq b k)) * + sum(0..gseq b k - 1) (\i. (X:num->A->real) i x - mu) = + sum(0..gseq b k - 1) (\i. X i x) / &(gseq b k) - mu` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN + REWRITE_TAC[SUM_SUB_NUMSEG; SUM_CONST_NUMSEG] THEN + SUBGOAL_THEN `&((gseq b k - 1 + 1) - 0) = &(gseq b k)` SUBST1_TAC THENL + [AP_TERM_TAC THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `~(&(gseq b k) = &0)` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_EQ] THEN + MP_TAC(SPECL [`b:num`; `k:num`] GSEQ_POS) THEN ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[real_div; REAL_SUB_RDISTRIB] THEN + SUBGOAL_THEN `&(gseq b k) * mu * inv(&(gseq b k)) = mu` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_AC] THEN + ASM_SIMP_TAC[REAL_MUL_RINV; REAL_MUL_LID]; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_LDISTRIB; REAL_MUL_AC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV; REAL_MUL_RID]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(fun th -> X_GEN_TAC `e:real` THEN DISCH_TAC THEN + MP_TAC(SPEC `e:real` th)) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MONO_EXISTS THEN GEN_TAC THEN + MATCH_MP_TAC MONO_FORALL THEN GEN_TAC THEN + MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Conclude: f(n)/(n+1) -> mu gives inv(n+1)*sum(X_i) -> mu *) + SUBGOAL_THEN `(\n. inv(&(SUC n)) * sum(0..n) (\i. (X:num->A->real) i x)) = + (\n. sum(0..n) (\i. X i x) / &(SUC n))` (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; real_div] THEN GEN_TAC THEN REAL_ARITH_TAC);; + +(* ========================================================================= *) +(* UNIFORM INTEGRABILITY *) +(* *) +(* Williams, "Probability with Martingales", Chapter 13. *) +(* A family {X_n} is uniformly integrable if the "tails" *) +(* E[max(|X_n| - K, 0)] can be made uniformly small. *) +(* ========================================================================= *) + +let uniformly_integrable = new_definition + `uniformly_integrable (p:A prob_space) (X:num->A->real) <=> + (!n. integrable p (X n)) /\ + !e. &0 < e ==> + ?K. !n. expectation p (\x. max (abs(X n x) - K) (&0)) < e`;; + +(* Key arithmetic inequality for the tail splitting argument *) +let MAX_ABS_SUB_TRIANGLE = prove + (`!a b K. &0 <= K + ==> max (abs(a - b) - &2 * K) (&0) <= + max (abs a - K) (&0) + max (abs b - K) (&0)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC);; + +(* Tail function max(|f|-K, 0) is integrable when f is *) +let INTEGRABLE_MAX_SUB_CONST = prove + (`!p:A prob_space f K. + integrable p f + ==> integrable p (\x. max (abs(f x) - K) (&0))`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_MAX THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + REWRITE_TAC[INTEGRABLE_CONST]]);; + +(* Tail expectation is bounded by full expectation (for K >= 0) *) +let EXPECTATION_TAIL_BOUND = prove + (`!p:A prob_space f K. + integrable p f /\ &0 <= K + ==> expectation p (\x. max (abs(f x) - K) (&0)) <= + expectation p (\x. abs(f x))`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC EXPECTATION_MONO THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[REAL_MAX_LE] THEN + ASM_REAL_ARITH_TAC]);; + +(* Tail expectation is non-negative *) +let EXPECTATION_TAIL_POS = prove + (`!p:A prob_space f K. + integrable p f + ==> &0 <= expectation p (\x. max (abs(f x) - K) (&0))`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC EXPECTATION_POS THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC]);; + +(* E[min(|f|, &n)] converges to E[|f|] for integrable f *) +let EXPECTATION_MIN_ABS_LIMIT = prove + (`!p:A prob_space f. + integrable p f + ==> ((\n. expectation p (\x. min (abs(f x)) (&n))) ---> + expectation p (\x. abs(f x))) sequentially`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. abs((f:A->real) x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* NN_EXPECTATION_MIN_LIMIT gives the result for nn_expectation *) + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; `\x:A. abs((f:A->real) x)`] + NN_EXPECTATION_MIN_LIMIT)) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[REAL_ABS_POS]; ALL_TAC] THEN + (* Bridge nn_expectation to expectation *) + SUBGOAL_THEN `nn_expectation (p:A prob_space) (\x:A. abs((f:A->real) x)) = + expectation p (\x. abs(f x))` + (fun th -> REWRITE_TAC[th]) THENL + [MATCH_MP_TAC(GSYM EXPECTATION_NONNEG_EQ_NN) THEN + ASM_REWRITE_TAC[REAL_ABS_POS]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. nn_expectation (p:A prob_space) + (\x:A. min (abs((f:A->real) x)) (&n)) = + expectation p (\x. min (abs(f x)) (&n))` + (fun th -> REWRITE_TAC[th]) THEN + GEN_TAC THEN MATCH_MP_TAC(GSYM EXPECTATION_NONNEG_EQ_NN) THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[INTEGRABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_LE_MIN; REAL_ABS_POS; REAL_POS]]);; + +(* Tail decomposition: |f| = min(|f|, K) + max(|f|-K, 0) for expectations *) +let EXPECTATION_TAIL_DECOMP = prove + (`!p:A prob_space f n. + integrable p f + ==> expectation p (\x. max (abs(f x) - &n) (&0)) = + expectation p (\x. abs(f x)) - + expectation p (\x. min (abs(f x)) (&n))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. abs((f:A->real) x))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. abs((f:A->real) x)) = + expectation p (\x. min (abs(f x)) (&n)) + + expectation p (\x. max (abs(f x) - &n) (&0))` MP_TAC THENL + [SUBGOAL_THEN `expectation (p:A prob_space) (\x:A. abs((f:A->real) x)) = + expectation p (\x. min (abs(f x)) (&n) + max (abs(f x) - &n) (&0))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN ASM_REWRITE_TAC[]]; + REAL_ARITH_TAC]);; + +(* Key helper: for integrable f, the tail expectation vanishes *) +let INTEGRABLE_TAIL_VANISHES = prove + (`!p:A prob_space f. + integrable p f + ==> ((\n. expectation p (\x. max (abs(f x) - &n) (&0))) ---> &0) + sequentially`, + REPEAT STRIP_TAC THEN + (* Establish the two key facts *) + SUBGOAL_THEN `((\n. expectation (p:A prob_space) + (\x:A. min (abs((f:A->real) x)) (&n))) ---> + expectation p (\x. abs(f x))) sequentially` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_MIN_ABS_LIMIT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &n) (&0)) = + expectation p (\x. abs(f x)) - + expectation p (\x. min (abs(f x)) (&n))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC EXPECTATION_TAIL_DECOMP THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Replace the target sequence with E[|f|] - E[min(|f|, &n)] *) + SUBGOAL_THEN + `(\n. expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &n) (&0))) = + (\n. expectation p (\x. abs(f x)) - + expectation p (\x. min (abs(f x)) (&n)))` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Show E[|f|] - E[min(|f|, &n)] -> E[|f|] - E[|f|] = 0 *) + SUBGOAL_THEN `&0 = expectation (p:A prob_space) (\x:A. abs((f:A->real) x)) - + expectation p (\x. abs(f x))` SUBST1_TAC THENL + [REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REALLIM_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[REALLIM_CONST]; + ASM_REWRITE_TAC[]]);; + +(* Uniform integrability implies L^1 boundedness *) +let UI_IMP_L1_BOUNDED = prove + (`!p:A prob_space (X:num->A->real). + uniformly_integrable p X + ==> ?B. !n. expectation p (\x. abs(X n x)) <= B`, + REPEAT GEN_TAC THEN REWRITE_TAC[uniformly_integrable] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(MP_TAC o SPEC `&1`) THEN REWRITE_TAC[REAL_LT_01] THEN + DISCH_THEN(X_CHOOSE_TAC `K:real`) THEN + EXISTS_TAC `K + &1` THEN X_GEN_TAC `n:num` THEN + (* Establish integrability of parts *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x)) K)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Stack: E[max(|X_n|-K,0)] < 1 *) + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0)) < &1` MP_TAC THENL + [FIRST_X_ASSUM(fun th -> ACCEPT_TAC(SPEC `n:num` th)); ALL_TAC] THEN + (* Stack: E[min(|X_n|,K)] <= K *) + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x)) K) <= K` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x:A. K)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC]; + REWRITE_TAC[EXPECTATION_CONST; REAL_LE_REFL]]; ALL_TAC] THEN + (* Stack: E[|X_n|] = E[min] + E[max] *) + SUBGOAL_THEN + `expectation (p:A prob_space) (\x:A. abs((X:num->A->real) n x)) = + expectation p (\x. min (abs(X n x)) K) + + expectation p (\x. max (abs(X n x) - K) (&0))` MP_TAC THENL + [MP_TAC(BETA_RULE(ISPECL + [`p:A prob_space`; + `\x:A. min (abs((X:num->A->real) n x)) K`; + `\x:A. max (abs((X:num->A->real) n x) - K) (&0)`] + EXPECTATION_ADD)) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(SUBST1_TAC o GSYM) THEN + MATCH_MP_TAC EXPECTATION_EXT THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + REAL_ARITH_TAC);; + +(* A dominated family is uniformly integrable *) +let DOMINATED_IMP_UI = prove + (`!p:A prob_space (X:num->A->real) g. + (!n. integrable p (X n)) /\ + integrable p g /\ + (!n x. x IN prob_carrier p ==> abs(X n x) <= g x) + ==> uniformly_integrable p X`, + REPEAT GEN_TAC THEN REWRITE_TAC[uniformly_integrable] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* INTEGRABLE_TAIL_VANISHES for g: E[max(|g|-&n, 0)] -> 0 *) + SUBGOAL_THEN + `((\n. expectation (p:A prob_space) + (\x:A. max (abs((g:A->real) x) - &n) (&0))) ---> &0) sequentially` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_TAIL_VANISHES THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + EXISTS_TAC `&N` THEN + X_GEN_TAC `n:num` THEN + (* E[max(|X_n| - &N, 0)] <= E[max(|g| - &N, 0)] < e *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. max (abs((g:A->real) x) - &N) (&0))` THEN + CONJ_TAC THENL + [(* E[max(|X_n|-&N,0)] <= E[max(|g|-&N,0)] via domination *) + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + (* max(|X_n(x)| - &N, 0) <= max(|g(x)| - &N, 0) *) + SUBGOAL_THEN `abs((X:num->A->real) n x) <= abs((g:A->real) x)` + (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(g:A->real) x` THEN + CONJ_TAC THENL + [ASM_MESON_TAC[]; + REAL_ARITH_TAC]]; + (* E[max(|g|-&N,0)] < e: from the limit witness *) + SUBGOAL_THEN + `&0 <= expectation (p:A prob_space) + (\x:A. max (abs((g:A->real) x) - &N) (&0))` MP_TAC THENL + [MATCH_MP_TAC EXPECTATION_TAIL_POS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N:num`) THEN + REWRITE_TAC[LE_REFL; REAL_SUB_RZERO] THEN + REAL_ARITH_TAC]);; + +(* Pointwise limit of a UI family is integrable *) +let INTEGRABLE_POINTWISE_LIMIT_UI = prove + (`!p:A prob_space (X:num->A->real) f. + uniformly_integrable p X /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) + ==> integrable p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [UNDISCH_TAC `uniformly_integrable (p:A prob_space) (X:num->A->real)` THEN + REWRITE_TAC[uniformly_integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN + UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `X:num->A->real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `X:num->A->real`] UI_IMP_L1_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN + REWRITE_TAC[integrable] THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `B:real` THEN + X_GEN_TAC `g:A->real` THEN STRIP_TAC THEN + (* g is simple, bounded: get bound M *) + MP_TAC(SPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `M0:real`) THEN + ABBREV_TAC `M = max M0 (&0)` THEN + SUBGOAL_THEN `&0 <= M` ASSUME_TAC THENL + [EXPAND_TAC "M" THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + (g:A->real) x <= min (abs((f:A->real) x)) M` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `M0:real` THEN + ASM_SIMP_TAC[] THEN EXPAND_TAC "M" THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. min (abs((f:A->real) x)) M)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `M:real` THEN + CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> abs(min a M) <= M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS]]; + ALL_TAC] THEN + (* Chain: simple_exp g <= nn_exp(min(|f|, M)) = E[min(|f|, M)] <= B *) + SUBGOAL_THEN `simple_expectation (p:A prob_space) (g:A->real) <= + nn_expectation p (\x:A. min (abs((f:A->real) x)) M)` MP_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_GE_SIMPLE THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> &0 <= min a M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS]; + ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x:A. min (abs((f:A->real) x)) M) <= B` MP_TAC THENL + [SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x:A. min (abs((f:A->real) x)) M) = + expectation p (\x. min (abs(f x)) M)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN + ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> &0 <= min a M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS]; + ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n:num. expectation (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x)) M)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `M:real` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + GEN_TAC THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> abs(min a M) <= M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> abs(min a M) <= M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REALLIM_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC REALLIM_ABS THEN ASM_SIMP_TAC[]; + REWRITE_TAC[REALLIM_CONST]]]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]]; + ASM_REAL_ARITH_TAC]);; + +(* Vitali convergence theorem: UI + pointwise => integrable + L^1 *) +let UI_POINTWISE_L1 = prove + (`!p:A prob_space (X:num->A->real) f. + uniformly_integrable p X /\ + (!x. x IN prob_carrier p ==> ((\n. X n x) ---> f x) sequentially) + ==> integrable p f /\ + ((\n. expectation p (\x. abs(X n x - f x))) ---> &0) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [UNDISCH_TAC `uniformly_integrable (p:A prob_space) (X:num->A->real)` THEN + REWRITE_TAC[uniformly_integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. random_variable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN + UNDISCH_TAC `!n. integrable (p:A prob_space) ((X:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `random_variable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_POINTWISE_LIMIT THEN + EXISTS_TAC `X:num->A->real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_POINTWISE_LIMIT_UI THEN + EXISTS_TAC `X:num->A->real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* E[|X_n - f|] -> 0 *) + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 < e / &3` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + SUBGOAL_THEN `!n:num. &0 <= expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. abs(expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))) = + expectation p (\x. abs(X n x - f x))` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH `&0 <= x ==> abs x = x`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Get K from UI and tail vanishes for f *) + UNDISCH_TAC `uniformly_integrable (p:A prob_space) (X:num->A->real)` THEN + REWRITE_TAC[uniformly_integrable] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `e / &3`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `K1:real`) THEN + MP_TAC(ISPECL [`p:A prob_space`; `f:A->real`] INTEGRABLE_TAIL_VANISHES) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N1:num`) THEN + ABBREV_TAC `K = max K1 (&N1)` THEN + SUBGOAL_THEN `&0 <= K` ASSUME_TAC THENL + [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN + (* Tail bounds with K *) + SUBGOAL_THEN `!n:num. expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0)) < e / &3` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K1) (&0))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `K1 <= K` (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN + EXPAND_TAC "K" THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &N1) (&0)) < e / &3` + ASSUME_TAC THENL + [SUBGOAL_THEN `&0 <= expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &N1) (&0))` MP_TAC THENL + [MATCH_MP_TAC EXPECTATION_TAIL_POS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `!n:num. N1 <= n ==> + abs(expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &n) (&0)) - &0) < e / &3` THEN + DISCH_THEN(MP_TAC o SPEC `N1:num`) THEN + REWRITE_TAC[LE_REFL; REAL_SUB_RZERO] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - K) (&0)) < e / &3` + ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - &N1) (&0))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `&N1 <= K` (fun th -> MP_TAC th THEN REAL_ARITH_TAC) THEN + EXPAND_TAC "K" THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Bounded convergence: E[min(|X_n-f|, 2K)] -> 0 *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + ((\n. min (abs((X:num->A->real) n x - (f:A->real) x)) (&2 * K)) ---> &0) + sequentially` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `((\n. (X:num->A->real) n x - (f:A->real) x) ---> &0) + sequentially` ASSUME_TAC THENL + [REWRITE_TAC[GSYM REALLIM_NULL] THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `((\n:num. abs((X:num->A->real) n x - (f:A->real) x)) ---> &0) + sequentially` ASSUME_TAC THENL + [MP_TAC(ISPEC `sequentially` REALLIM_ABS) THEN + DISCH_THEN(MP_TAC o SPECL + [`\n:num. (X:num->A->real) n x - (f:A->real) x`; `&0`]) THEN + REWRITE_TAC[REAL_ABS_NUM] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 = min (&0) (&2 * K)` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= M ==> min (&0) M = &0`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REALLIM_MIN THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[REALLIM_CONST]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `((\n. expectation (p:A prob_space) (\x:A. min (abs((X:num->A->real) n x - + (f:A->real) x)) (&2 * K))) ---> &0) sequentially` ASSUME_TAC THENL + [SUBGOAL_THEN `&0 = expectation (p:A prob_space) (\x:A. &0)` + SUBST1_TAC THENL + [REWRITE_TAC[EXPECTATION_CONST]; ALL_TAC] THEN + MATCH_MP_TAC BOUNDED_CONVERGENCE_EXPECTATION THEN + EXISTS_TAC `&2 * K` THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]; + GEN_TAC THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> abs(min a M) <= M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS; REAL_LE_MUL; REAL_POS]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= M ==> abs(&0) <= M`) THEN + MATCH_MP_TAC REAL_LE_MUL THEN REWRITE_TAC[REAL_POS] THEN + ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* Combine: E[|X_n-f|] = E[min] + E[max], and bound both parts *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e / &3`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N2:num`) THEN + EXISTS_TAC `N2:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x - (f:A->real) x)) (&2 * K)) < + e / &3` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN + SUBGOAL_THEN `&0 <= expectation (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x - (f:A->real) x)) (&2 * K))` + MP_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= a /\ &0 <= M ==> &0 <= min a M`) THEN + ASM_SIMP_TAC[REAL_ABS_POS; REAL_LE_MUL; REAL_POS]]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Split E[|X_n-f|] = E[min] + E[max] *) + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x)) = + expectation p (\x. min (abs(X n x - f x)) (&2 * K)) + + expectation p (\x. max (abs(X n x - f x) - &2 * K) (&0))` + SUBST1_TAC THENL + [MP_TAC(BETA_RULE(ISPECL + [`p:A prob_space`; + `\x:A. min (abs((X:num->A->real) n x - (f:A->real) x)) (&2 * K)`; + `\x:A. max (abs((X:num->A->real) n x - (f:A->real) x) - &2 * K) (&0)`] + EXPECTATION_ADD)) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]]; + DISCH_THEN(SUBST1_TAC o GSYM) THEN + MATCH_MP_TAC EXPECTATION_EXT THEN + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Bound the tail via MAX_ABS_SUB_TRIANGLE *) + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x - (f:A->real) x) - &2 * K) (&0)) < + &2 * e / &3` MP_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0) + + max (abs((f:A->real) x) - K) (&0))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + MP_TAC(BETA_RULE(ISPECL + [`p:A prob_space`; + `\x:A. max (abs((X:num->A->real) n x) - K) (&0)`; + `\x:A. max (abs((f:A->real) x) - K) (&0)`] + INTEGRABLE_ADD)) THEN + ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + MP_TAC(SPECL [`(X:num->A->real) n x`; `(f:A->real) x`; `K:real`] + MAX_ABS_SUB_TRIANGLE) THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0) + + max (abs((f:A->real) x) - K) (&0)) = + expectation p (\x. max (abs(X n x) - K) (&0)) + + expectation p (\x. max (abs(f x) - K) (&0))` SUBST1_TAC THENL + [MP_TAC(BETA_RULE(ISPECL + [`p:A prob_space`; + `\x:A. max (abs((X:num->A->real) n x) - K) (&0)`; + `\x:A. max (abs((f:A->real) x) - K) (&0)`] + EXPECTATION_ADD)) THEN + ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + DISCH_THEN(fun th -> REWRITE_TAC[th])]; + UNDISCH_TAC `!n:num. expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0)) < e / &3` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + UNDISCH_TAC `expectation (p:A prob_space) + (\x:A. max (abs((f:A->real) x) - K) (&0)) < e / &3` THEN + REAL_ARITH_TAC]]; + UNDISCH_TAC `expectation (p:A prob_space) + (\x:A. min (abs((X:num->A->real) n x - (f:A->real) x)) (&2 * K)) < + e / &3` THEN + REAL_ARITH_TAC]);; + +(* ========================================================================= *) +(* L^2-BOUNDED FAMILIES ARE UNIFORMLY INTEGRABLE *) +(* *) +(* Williams, "Probability with Martingales": de la Vallee-Poussin criterion. *) +(* If sup_n E[X_n^2] <= C, then {X_n} is uniformly integrable. *) +(* ========================================================================= *) + +(* Key arithmetic: max(|a| - K, 0) * K <= a^2 for K > 0 *) +let TAIL_MUL_LE_SQ = prove + (`!a K. &0 < K ==> max (abs a - K) (&0) * K <= a pow 2`, + REPEAT STRIP_TAC THEN + ASM_CASES_TAC `abs a <= K` THENL + [SUBGOAL_THEN `max (abs a - K) (&0) = &0` + (fun th -> REWRITE_TAC[th; REAL_MUL_LZERO; REAL_LE_POW_2]) THEN + ASM_REAL_ARITH_TAC; + SUBGOAL_THEN `max (abs a - K) (&0) = abs a - K` + SUBST1_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(abs a - K) * K = abs a * K - K pow 2` SUBST1_TAC THENL + [REWRITE_TAC[REAL_POW_2] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `a pow 2 = abs a * abs a` SUBST1_TAC THENL + [REWRITE_TAC[GSYM REAL_POW_2; REAL_POW2_ABS]; ALL_TAC] THEN + SUBGOAL_THEN `abs a * K <= abs a * abs a` MP_TAC THENL + [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= K pow 2` MP_TAC THENL + [REWRITE_TAC[REAL_LE_POW_2]; REAL_ARITH_TAC]]);; + +(* Corollary: max(|a| - K, 0) <= a^2 / K for K > 0 *) +let TAIL_LE_SQ_DIV = prove + (`!a K. &0 < K ==> max (abs a - K) (&0) <= a pow 2 / K`, + REPEAT STRIP_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + MATCH_MP_TAC TAIL_MUL_LE_SQ THEN ASM_REWRITE_TAC[]);; + +(* Square-integrable implies integrable *) +let INTEGRABLE_POW2_IMP = prove + (`!p:A prob_space f. + random_variable p f /\ integrable p (\x. f x pow 2) + ==> integrable p f`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. &1 + (f:A->real) x pow 2` THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; ASM_REWRITE_TAC[]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `abs a <= &1 + a pow 2 /\ &0 <= a pow 2 + ==> abs a <= abs(&1 + a pow 2)`) THEN + REWRITE_TAC[REAL_LE_POW_2] THEN + MP_TAC(SPEC `abs((f:A->real) x) - &1` REAL_LE_POW_2) THEN + REWRITE_TAC[REAL_POW2_ABS] THEN REAL_ARITH_TAC]);; + +(* L^2-bounded families are uniformly integrable *) +let L2_BOUNDED_IMP_UI = prove + (`!p:A prob_space (X:num->A->real) C. + (!n. random_variable p (X n)) /\ + (!n. integrable p (\x. X n x pow 2)) /\ + (!n. expectation p (\x. X n x pow 2) <= C) + ==> uniformly_integrable p X`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_POW2_IMP THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[uniformly_integrable] THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + EXISTS_TAC `max ((C:real) / e) (&0) + &1` THEN + ABBREV_TAC `K = max ((C:real) / e) (&0) + &1` THEN + SUBGOAL_THEN `&0 < K` ASSUME_TAC THENL + [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(C:real) / e < K` ASSUME_TAC THENL + [EXPAND_TAC "K" THEN REAL_ARITH_TAC; ALL_TAC] THEN + X_GEN_TAC `n:num` THEN + (* Strategy: E[max(|X_n|-K,0)] <= C/K < e *) + MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `(C:real) / K` THEN + CONJ_TAC THENL + [(* E[tail] <= C/K: by REAL_LE_RDIV_EQ reduce to E[tail]*K <= C *) + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x pow 2)` THEN + CONJ_TAC THENL + [ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + SUBGOAL_THEN `K * expectation (p:A prob_space) + (\x:A. max (abs((X:num->A->real) n x) - K) (&0)) = + expectation p (\x. K * max (abs(X n x) - K) (&0))` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_CMUL THEN + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL_ALT THEN + MATCH_MP_TAC INTEGRABLE_MAX_SUB_CONST THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `K * max (abs((X:num->A->real) n x) - K) (&0) = + max (abs(X n x) - K) (&0) * K` SUBST1_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC TAIL_MUL_LE_SQ THEN ASM_REWRITE_TAC[]]]]; + ASM_REWRITE_TAC[]]; + (* C/K < e: from C/e < K *) + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + SUBGOAL_THEN `(C:real) = e * (C / e)` SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM REAL_DIV_LMUL) THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LT_LMUL THEN ASM_REWRITE_TAC[]]]);; + +(* Phase 6: Set integral infrastructure for Radon-Nikodym *) + +(* Difference of signed measures is a signed measure *) +let SIGNED_MEASURE_DIFFERENCE = prove + (`!p:A prob_space mu nu. + signed_measure p mu /\ signed_measure p nu + ==> signed_measure p (\A. mu A - nu A)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[signed_measure] THEN CONJ_TAC THENL + [SUBGOAL_THEN `(mu:(A->bool)->real) {} = &0 /\ (nu:(A->bool)->real) {} = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + ASM_MESON_TAC[signed_measure]; ALL_TAC] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN + REWRITE_TAC[] THEN MATCH_MP_TAC REAL_SERIES_SUB THEN CONJ_TAC THENL + [UNDISCH_TAC `signed_measure (p:A prob_space) mu` THEN + REWRITE_TAC[signed_measure] THEN + DISCH_THEN(MP_TAC o SPEC `A:num->A->bool` o CONJUNCT2) THEN + ASM_REWRITE_TAC[]; + UNDISCH_TAC `signed_measure (p:A prob_space) nu` THEN + REWRITE_TAC[signed_measure] THEN + DISCH_THEN(MP_TAC o SPEC `A:num->A->bool` o CONJUNCT2) THEN + ASM_REWRITE_TAC[]]);; + +(* Integral over a null set is zero *) +let SET_INTEGRAL_ZERO_ON_NULL = prove + (`!p:A prob_space f A. + integrable p f /\ A IN prob_events p /\ prob p A = &0 + ==> expectation p (\x. f x * indicator_fn A x) = &0`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `abs(x) <= &0 ==> x = &0`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x:A. abs(f x * indicator_fn A x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. abs(f x * indicator_fn A x)) = (\x. abs(f x) * indicator_fn A x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn] THEN X_GEN_TAC `x:A` THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; REAL_ABS_0]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) (\x. abs(f x) * indicator_fn A x) = + nn_expectation p (\x. abs(f x) * indicator_fn A x)` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_NONNEG_EQ_NN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_MESON_TAC[INTEGRABLE_ABS]; + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; REAL_LE_REFL] THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC NN_EXPECTATION_LE_FROM_SIMPLE THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; REAL_LE_REFL] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) h = &0` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + REWRITE_TAC[simple_expectation] THEN + MATCH_MP_TAC SUM_EQ_0 THEN + REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `v:real` THEN DISCH_TAC THEN + ASM_CASES_TAC `v = &0` THENL + [ASM_REWRITE_TAC[REAL_MUL_LZERO]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ (h:A->real) x = v} = &0` + (fun th -> REWRITE_TAC[th; REAL_MUL_RZERO]) THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (h:A->real) x = v} SUBSET A` ASSUME_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN STRIP_TAC THEN + ASM_CASES_TAC `x:A IN A` THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[indicator_fn] THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_MUL_RZERO] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~(v = &0)` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (h:A->real) x = v} IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_LEVEL_SET THEN + ASM_MESON_TAC[simple_rv]; + ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) {x:A | x IN prob_carrier p /\ (h:A->real) x = v} <= prob p A` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) {x:A | x IN prob_carrier p /\ (h:A->real) x = v}` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ABBREV_TAC `q = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ (h:A->real) x = v}` THEN + UNDISCH_TAC `q <= prob (p:A prob_space) A` THEN + UNDISCH_TAC `&0 <= q` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; + +(* DCT with a.e. convergence (standard textbook version). + Weakens the pointwise convergence hypothesis of DOMINATED_CONVERGENCE + to almost-sure convergence, at the cost of requiring random_variable p f + and abs(f x) <= g x as hypotheses (these were derived from pointwise + convergence in the stronger version). See also: DOMINATED_CONVERGENCE. *) +let DOMINATED_CONVERGENCE_AE = prove + (`!p:A prob_space X f g. + (!n. integrable p (X n)) /\ + integrable p g /\ + (!n x. x IN prob_carrier p ==> abs(X n x) <= g x) /\ + random_variable p f /\ + (!x. x IN prob_carrier p ==> abs(f x) <= g x) /\ + almost_surely p {x | ((\n. X n x) ---> f x) sequentially} + ==> integrable p f /\ + ((\n. expectation p (X n)) ---> expectation p f) sequentially`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: f is integrable *) + SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `(g:A->real)` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(g:A->real) x` THEN ASM_SIMP_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= g ==> g <= abs g`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((f:A->real) x)` THEN ASM_SIMP_TAC[REAL_ABS_POS]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 2: Extract null set from almost_surely *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [almost_surely]) THEN + REWRITE_TAC[null_event; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `N:A->bool` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF (N:A->bool) IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN `(N:A->bool) SUBSET prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[PROB_EVENT_SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p /\ ~(x IN N) + ==> ((\n. (X:num->A->real) n x) ---> (f:A->real) x) sequentially` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN STRIP_TAC THEN + UNDISCH_TAC `{x:A | x IN prob_carrier p /\ + ~((\n. (X:num->A->real) n x) ---> (f:A->real) x) sequentially} + SUBSET N` THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN + ASM_REWRITE_TAC[] THEN MESON_TAC[]; + ALL_TAC] THEN + (* Step 3: |X_n - f| is integrable *) + SUBGOAL_THEN + `!n:num. integrable (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_ABS THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* Step 4: E[h_n] -> 0 where h_n = |X_n - f| * 1_{carrier\N} + by DOMINATED_CONVERGENCE_NULL with dominator 2g *) + SUBGOAL_THEN + `((\n. expectation p (\x:A. abs((X:num->A->real) n x - (f:A->real) x) * + indicator_fn (prob_carrier p DIFF N) x)) + ---> &0) sequentially` ASSUME_TAC THENL + [MATCH_MP_TAC DOMINATED_CONVERGENCE_NULL THEN + EXISTS_TAC `\x:A. &2 * (g:A->real) x` THEN + REPEAT CONJ_TAC THENL + [(* RV for h_n *) + GEN_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_MUL THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN + MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[INTEGRABLE_IMP_RANDOM_VARIABLE]; + MP_TAC(ISPECL [`p:A prob_space`; + `prob_carrier (p:A prob_space) DIFF (N:A->bool)`] + SIMPLE_RV_INDICATOR) THEN + ASM_REWRITE_TAC[simple_rv] THEN STRIP_TAC THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + (* RV for 2g *) + UNDISCH_TAC `integrable (p:A prob_space) (g:A->real)` THEN + DISCH_THEN(fun th -> MP_TAC(MATCH_MP INTEGRABLE_CMUL th)) THEN + DISCH_THEN(MP_TAC o SPEC `&2`) THEN + REWRITE_TAC[integrable] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + (* integrable 2g *) + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + (* bounds: 0 <= h_n <= 2g on carrier *) + REWRITE_TAC[] THEN REPEAT STRIP_TAC THENL + [MATCH_MP_TAC REAL_LE_MUL THEN + REWRITE_TAC[REAL_ABS_POS; indicator_fn] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((X:num->A->real) n x - (f:A->real) x)` THEN CONJ_TAC THENL + [REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL; REAL_ABS_POS]; + MATCH_MP_TAC(REAL_ARITH + `abs(x) <= g /\ abs(f) <= g ==> abs(x - f) <= &2 * g`) THEN + ASM_SIMP_TAC[]]]; + (* h_n -> 0 pointwise on carrier *) + REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + ASM_CASES_TAC `(x:A) IN N` THENL + [SUBGOAL_THEN + `indicator_fn (prob_carrier (p:A prob_space) DIFF (N:A->bool)) (x:A) = &0` + SUBST1_TAC THENL + [REWRITE_TAC[indicator_fn; IN_DIFF] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RZERO; REALLIM_CONST]; + SUBGOAL_THEN + `indicator_fn (prob_carrier (p:A prob_space) DIFF (N:A->bool)) (x:A) = &1` + SUBST1_TAC THENL + [REWRITE_TAC[indicator_fn; IN_DIFF] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN + `((\n. (X:num->A->real) n x - (f:A->real) x) ---> &0) sequentially` + (fun th -> MP_TAC(MATCH_MP REALLIM_ABS th) THEN + REWRITE_TAC[REAL_ABS_NUM]) THEN + REWRITE_TAC[GSYM REALLIM_NULL] THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Step 5: E[|X_n - f|] <= E[h_n] via decomposition + null integral *) + SUBGOAL_THEN `!n:num. expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x)) <= + expectation p (\x. abs(X n x - f x) * + indicator_fn (prob_carrier p DIFF N) x)` + ASSUME_TAC THENL + [X_GEN_TAC `m:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) m x - (f:A->real) x) * + indicator_fn (prob_carrier p DIFF N) x) + + expectation p (\x. abs(X m x - f x) * indicator_fn N x)` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. abs((X:num->A->real) m x - (f:A->real) x) * + indicator_fn (prob_carrier (p:A prob_space) DIFF N) x`; + `\x:A. abs((X:num->A->real) m x - (f:A->real) x) * + indicator_fn (N:A->bool) x`] + EXPECTATION_ADD) THEN + ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `(x:A) IN N` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC]; + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) m x - (f:A->real) x) * + indicator_fn (N:A->bool) x) = &0` + (fun th -> REWRITE_TAC[th; REAL_ADD_RID; REAL_LE_REFL]) THEN + MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 6: E[|X_n - f|] -> 0 via squeeze *) + SUBGOAL_THEN + `((\n. expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))) + ---> &0) sequentially` + ASSUME_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + UNDISCH_TAC `((\n. expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x) * + indicator_fn (prob_carrier p DIFF N) x)) ---> &0) sequentially` THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `M:num` ASSUME_TAC) THEN + EXISTS_TAC `M:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_SUB_RZERO] THEN + SUBGOAL_THEN `&0 <= expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` + ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `!n:num. expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x)) <= + expectation p (\x. abs(X n x - f x) * + indicator_fn (prob_carrier p DIFF N) x)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Step 7: E[X_n] -> E[f] from E[|X_n - f|] -> 0 *) + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(MP_TAC o SPEC `e:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `M:num`) THEN + EXISTS_TAC `M:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x - (f:A->real) x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs(expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x - (f:A->real) x))` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; `f:A->real`] + EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + REAL_ARITH_TAC; + MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[ETA_AX]]; FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ASM_REWRITE_TAC[REAL_SUB_RZERO] THEN REAL_ARITH_TAC]);; -(* ========================================================================= *) -(* Strong law of large numbers without bounded support *) -(* ========================================================================= *) - -(* Chebyshev bound for shifted partial sums of uncorrelated RVs. - P(|sum(0..j)(X(a+i) - mu)| >= t) <= (j+1)*sigma_sq / t^2. *) -let CHEBYSHEV_SHIFTED_SUM = prove - (`!p:A prob_space X mu sigma_sq a j t. - (!n. integrable p (X n)) /\ - (!n. integrable p (\x. X n x pow 2)) /\ - (!n. expectation p (X n) = mu) /\ - (!n. variance p (X n) = sigma_sq) /\ - (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) /\ - &0 < t - ==> prob p {x | x IN prob_carrier p /\ - abs (sum (0..j) (\i. X (a + i) x - mu)) >= t} - <= &(SUC j) * sigma_sq * inv (t pow 2)`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - ABBREV_TAC `f = \x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x - mu)` THEN - ABBREV_TAC `g = \x:A. sum(0..j) (\i. (X:num->A->real) (a + i) x)` THEN - (* f = g + constant *) - SUBGOAL_THEN `f = (\x:A. (g:A->real) x + (-- &(SUC j) * mu))` - (LABEL_TAC "fg") THENL - [EXPAND_TAC "f" THEN EXPAND_TAC "g" THEN - REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN - ONCE_REWRITE_TAC[SUM_SUB_NUMSEG] THEN - REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN REAL_ARITH_TAC; - ALL_TAC] THEN - (* integrability of g *) - SUBGOAL_THEN `integrable (p:A prob_space) (g:A->real)` (LABEL_TAC "ig") THENL - [EXPAND_TAC "g" THEN - MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; - `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] - INTEGRABLE_SUM)) THEN - ANTS_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - REWRITE_TAC[]]; ALL_TAC] THEN - (* integrability of f *) - SUBGOAL_THEN `integrable (p:A prob_space) (f:A->real)` (LABEL_TAC "if") THENL - [REMOVE_THEN "fg" SUBST1_TAC THEN - MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; +(* Integral defines a signed measure *) +let SIGNED_MEASURE_FROM_INTEGRAL = prove + (`!p:A prob_space f. + integrable p f + ==> signed_measure p (\A. expectation p (\x. f x * indicator_fn A x))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[signed_measure] THEN CONJ_TAC THENL + [SUBGOAL_THEN `(\x:A. f x * indicator_fn {} x) = (\x. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn; NOT_IN_EMPTY; REAL_MUL_RZERO]; + REWRITE_TAC[EXPECTATION_CONST]]; ALL_TAC] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + REWRITE_TAC[real_sums; FROM_INTER_NUMSEG] THEN + ABBREV_TAC `U = UNIONS {(A:num->A->bool) n | n IN (:num)}` THEN + SUBGOAL_THEN `!n. sum (0..n) (\k. expectation (p:A prob_space) + (\x. f x * indicator_fn ((A:num->A->bool) k) x)) = + expectation p (\x. f x * indicator_fn (UNIONS (IMAGE A (0..n))) x)` + (fun th -> REWRITE_TAC[th]) THENL + [INDUCT_TAC THENL + [REWRITE_TAC[SUM_SING_NUMSEG; IMAGE_CLAUSES; NUMSEG_SING; UNIONS_1]; + REWRITE_TAC[SUM_CLAUSES_NUMSEG; LE_0] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `UNIONS (IMAGE (A:num->A->bool) (0..SUC n)) = + UNIONS (IMAGE A (0..n)) UNION A(SUC n)` SUBST1_TAC THENL + [REWRITE_TAC[NUMSEG_CLAUSES; LE_0; IMAGE_CLAUSES; UNIONS_INSERT] THEN + SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. f x * indicator_fn (UNIONS (IMAGE A (0..n)) UNION A (SUC n)) x) = + (\x. f x * indicator_fn (UNIONS (IMAGE A (0..n))) x + + f x * indicator_fn (A (SUC n)) x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `x:A` THEN + REWRITE_TAC[indicator_fn; IN_UNION] THEN + SUBGOAL_THEN + `~(x:A IN UNIONS (IMAGE (A:num->A->bool) (0..n)) /\ x IN A (SUC n))` + ASSUME_TAC THENL + [STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_UNIONS]) THEN + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_IMAGE]) THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`k:num`; `SUC n`]) THEN + SUBGOAL_THEN `~(k:num = SUC n)` (fun th -> REWRITE_TAC[th]) THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [IN_NUMSEG]) THEN + ARITH_TAC; + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY] THEN + DISCH_THEN(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ASM_CASES_TAC `x:A IN UNIONS (IMAGE (A:num->A->bool) (0..n))` THEN + ASM_CASES_TAC `x:A IN (A:num->A->bool) (SUC n)` THEN + ASM_REWRITE_TAC[] THEN TRY REAL_ARITH_TAC THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC(GSYM EXPECTATION_ADD) THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_IMAGE; IN_NUMSEG] THEN ASM_MESON_TAC[]; + MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN + MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]]]; ALL_TAC] THEN - (* E[f] = 0 *) - SUBGOAL_THEN `expectation (p:A prob_space) (f:A->real) = &0` - (LABEL_TAC "ef") THENL - [REMOVE_THEN "fg" SUBST1_TAC THEN - W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_ADD o lhand o snd) THEN - ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN - DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST] THEN - EXPAND_TAC "g" THEN - MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; - `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] - EXPECTATION_SUM)) THEN - ANTS_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ETA_AX] THEN - ASM_REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN - REAL_ARITH_TAC]; ALL_TAC] THEN - (* Var(f) = (j+1)*sigma_sq *) - SUBGOAL_THEN `variance (p:A prob_space) (f:A->real) = &(SUC j) * sigma_sq` - (LABEL_TAC "vf") THENL - [REMOVE_THEN "fg" SUBST1_TAC THEN + MP_TAC(ISPECL + [`p:A prob_space`; + `\n:num. \x:A. f x * indicator_fn + (UNIONS (IMAGE (A:num->A->bool) (0..n))) x`; + `\x:A. f x * indicator_fn (U:A->bool) x`; + `\x:A. abs((f:A->real) x)`] DOMINATED_CONVERGENCE) THEN + ANTS_TAC THENL + [REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_IMAGE; IN_NUMSEG] THEN ASM_MESON_TAC[]; + MATCH_MP_TAC FINITE_IMP_COUNTABLE THEN + MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]]; + ASM_MESON_TAC[INTEGRABLE_ABS]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; + REAL_ABS_0; REAL_ABS_POS; REAL_LE_REFL]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REALLIM_EVENTUALLY THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + ASM_CASES_TAC `x:A IN U` THENL + [UNDISCH_TAC `x:A IN U` THEN + UNDISCH_TAC `UNIONS {(A:num->A->bool) n | n IN (:num)} = U` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + REWRITE_TAC[UNIONS_GSPEC; IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_TAC `k:num`) THEN + EXISTS_TAC `k:num` THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + SUBGOAL_THEN `(?n:num. x:A IN A n)` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `x:A IN UNIONS (IMAGE (A:num->A->bool) (0..m))` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_NUMSEG] THEN + EXISTS_TAC `(A:num->A->bool) k` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `k:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + EXISTS_TAC `0` THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `~(x:A IN UNIONS (IMAGE (A:num->A->bool) (0..m)))` + (fun th -> REWRITE_TAC[th]) THEN + UNDISCH_TAC `~(x:A IN U)` THEN + FIRST_X_ASSUM(SUBST1_TAC o GSYM) THEN + REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_NUMSEG; + IN_ELIM_THM; IN_UNIV; UNIONS_GSPEC] THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN MESON_TAC[]]]; + SIMP_TAC[]]);; + +(* Scalar multiple of a signed measure *) +let SIGNED_MEASURE_CMUL = prove + (`!p:A prob_space mu c. + signed_measure p mu ==> signed_measure p (\A. c * mu A)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[signed_measure] THEN CONJ_TAC THENL + [SUBGOAL_THEN `(mu:(A->bool)->real) {} = &0` + (fun th -> REWRITE_TAC[th; REAL_MUL_RZERO]) THEN + ASM_MESON_TAC[signed_measure]; ALL_TAC] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN REWRITE_TAC[] THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + DISCH_THEN(MP_TAC o SPEC `A:num->A->bool` o CONJUNCT2) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> + MATCH_MP_TAC REAL_SERIES_LMUL THEN MATCH_ACCEPT_TAC th));; + +(* Max of two feasible functions is feasible *) +let MAX_IN_FEASIBLE_SET = prove + (`!p:A prob_space mu g1 g2. + signed_measure p mu /\ + simple_rv p g1 /\ simple_rv p g2 /\ + (!x. x IN prob_carrier p ==> &0 <= g1 x) /\ + (!x. x IN prob_carrier p ==> &0 <= g2 x) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. g1 x * indicator_fn A x) <= mu A) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. g2 x * indicator_fn A x) <= mu A) + ==> (!A. A IN prob_events p ==> + simple_expectation p (\x. max (g1 x) (g2 x) * indicator_fn A x) <= mu A)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + ABBREV_TAC + `B = A INTER {x:A | x IN prob_carrier p /\ + (g1:A->real) x >= (g2:A->real) x}` THEN + SUBGOAL_THEN `B:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[] THEN SUBGOAL_THEN - `variance p (\x:A. (g:A->real) x + -- &(SUC j) * mu) = variance p g` - SUBST1_TAC THENL - [MATCH_MP_TAC VARIANCE_SHIFT THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - EXPAND_TAC "g" THEN - MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; - `\(i:num) (x:A). (X:num->A->real) (a + i) x`; `j:num`] - VARIANCE_SUM_UNCORRELATED)) THEN - ANTS_TAC THENL - [REPEAT CONJ_TAC THENL - [REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; - REPEAT STRIP_TAC THEN REWRITE_TAC[ETA_AX] THEN - FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; - DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[ETA_AX] THEN - ASM_REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1]]; ALL_TAC] THEN - (* integrability of (f - E[f])^2 for Chebyshev *) - SUBGOAL_THEN `integrable (p:A prob_space) (\x. ((f:A->real) x - - expectation p f) pow 2)` (LABEL_TAC "if2") THENL - [USE_THEN "ef" (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN - EXPAND_TAC "f" THEN - MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; - `\(i:num) (x:A). (X:num->A->real) (a + i) x - mu`; `j:num`] - INTEGRABLE_SUM_SQUARE)) THEN - ANTS_TAC THENL - [CONJ_TAC THEN REPEAT STRIP_TAC THENL - [MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; - (* integrable p (\x. (X(a+i) x - mu) pow 2) from X^2, X, and const *) - SUBGOAL_THEN `(\x:A. ((X:num->A->real) (a + i) x - mu) pow 2) = - (\x. X (a + i) x pow 2 - &2 * mu * X (a + i) x + mu pow 2)` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL - [ASM_REWRITE_TAC[ETA_AX]; - REWRITE_TAC[REAL_MUL_ASSOC] THEN - MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[ETA_AX]]; - REWRITE_TAC[INTEGRABLE_CONST]]]; - REWRITE_TAC[]]; ALL_TAC] THEN - (* Rewrite event using f and apply Chebyshev *) - SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ - abs(sum(0..j) (\i. (X:num->A->real) (a + i) x - mu)) >= t} = - {x | x IN prob_carrier p /\ abs(f x - expectation p f) >= t}` + `{x:A | x IN prob_carrier p /\ (g1:A->real) x >= g2 x} = + {x | x IN prob_carrier p /\ g1 x - g2 x >= &0}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `x:A IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_RV_GE_EVENT THEN + MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `A DIFF B:A->bool IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + max ((g1:A->real) x) (g2 x) * indicator_fn A x = + g1 x * indicator_fn B x + g2 x * indicator_fn (A DIFF B) x` + ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN + ASM_CASES_TAC `x:A IN A` THENL + [ASM_REWRITE_TAC[REAL_MUL_RID] THEN + ASM_CASES_TAC `x:A IN B` THENL + [ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_ADD_RID] THEN + SUBGOAL_THEN `(g1:A->real) x >= g2 x` ASSUME_TAC THENL + [UNDISCH_TAC `x:A IN B` THEN EXPAND_TAC "B" THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; REAL_ADD_LID] THEN + SUBGOAL_THEN `~((g1:A->real) x >= g2 x)` ASSUME_TAC THENL + [UNDISCH_TAC `~(x:A IN B)` THEN EXPAND_TAC "B" THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + MESON_TAC[]; + ASM_REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]]; + ASM_REWRITE_TAC[REAL_MUL_RZERO] THEN + ASM_CASES_TAC `x:A IN B` THENL + [SUBGOAL_THEN `x:A IN A` MP_TAC THENL + [UNDISCH_TAC `x:A IN B` THEN EXPAND_TAC "B" THEN SET_TAC[]; + ASM_MESON_TAC[]]; + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_ADD_LID; REAL_ADD_RID]]]; + ALL_TAC] THEN + SUBGOAL_THEN `B UNION (A DIFF B) = A:A->bool` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. max (g1 x) (g2 x) * indicator_fn A x) = + simple_expectation p (\x. g1 x * indicator_fn B x) + + simple_expectation p (\x. g2 x * indicator_fn (A DIFF B) x)` SUBST1_TAC THENL - [USE_THEN "ef" (fun th -> REWRITE_TAC[th; REAL_SUB_RZERO]) THEN - REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN - UNDISCH_TAC `(\x:A. sum (0..j) (\i. (X:num->A->real) (a + i) x - mu)) = - (f:A->real)` THEN - DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]); ALL_TAC] THEN - (* Apply Chebyshev and substitute Var(f) *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `variance (p:A prob_space) (f:A->real) / t pow 2` THEN - CONJ_TAC THENL - [MATCH_MP_TAC CHEBYSHEV_INEQUALITY THEN ASM_REWRITE_TAC[]; - ASM_REWRITE_TAC[real_div; REAL_MUL_ASSOC; REAL_LE_REFL]]);; - -(* Gap control for SLLN: for each tolerance 1/(m+1), almost surely the - centered partial sums in each gap (k^2, (k+1)^2] are bounded by - (k^2+1)/(m+1). Proved via Chebyshev + union bound + Borel-Cantelli. *) -let SLLN_GAP_CONTROL = prove - (`!p:A prob_space (X:num->A->real) mu sigma_sq. - (!n. integrable p (X n)) /\ - (!n. integrable p (\x. X n x pow 2)) /\ - (!n. expectation p (X n) = mu) /\ - (!n. variance p (X n) = sigma_sq) /\ - (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) - ==> !m:num. almost_surely p - {x:A | ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. X i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))}`, - REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `m:num` THEN - REWRITE_TAC[almost_surely] THEN - ABBREV_TAC `B = \k. {x:A | x IN prob_carrier p /\ - ?nn:num. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ - abs(sum(k * k + 1..nn) (\i. (X:num->A->real) i x - mu)) >= - &(SUC(k * k)) * inv(&(SUC m))}` THEN - EXISTS_TAC `limsup_events (B:num->A->bool)` THEN - (* Key subgoal: B k is a prob_event for each k *) - SUBGOAL_THEN `!k. (B:num->A->bool) k IN prob_events p` (LABEL_TAC "Bev") THENL - [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN - SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ - (?nn. k * k < nn /\ nn <= (k + 1) * (k + 1) /\ - abs (sum (k * k + 1..nn) (\i. X i x - mu)) >= - &(SUC (k * k)) * inv (&(SUC m)))} = - UNIONS (IMAGE (\nn. {x:A | x IN prob_carrier p /\ - abs (sum (k * k + 1..nn) (\i. X i x - mu)) >= - &(SUC (k * k)) * inv (&(SUC m))}) - {nn | k * k < nn /\ nn <= (k + 1) * (k + 1)})` - SUBST1_TAC THENL - [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM] THEN - GEN_TAC THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; - ALL_TAC] THEN - MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_ELIM_THM] THEN - X_GEN_TAC `nn:num` THEN STRIP_TAC THEN - MATCH_MP_TAC RANDOM_VARIABLE_GE THEN - MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - (* sum(k*k+1..nn)(X_i - mu) = sum(0..nn)(X_i - mu) - sum(0..k*k)(X_i - mu) *) - SUBGOAL_THEN `(\x:A. sum(k * k + 1..nn) (\i. (X:num->A->real) i x - mu)) = - (\x. sum(0..nn) (\i. X i x - mu) - sum(0..k * k) (\i. X i x - mu))` - SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN - MATCH_MP_TAC(REAL_ARITH `!a b c:real. a + b = c ==> b = c - a`) THEN - MATCH_MP_TAC SUM_COMBINE_R THEN ASM_ARITH_TAC; - MATCH_MP_TAC RANDOM_VARIABLE_SUB THEN CONJ_TAC THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUM THEN - REPEAT STRIP_TAC THEN BETA_TAC THEN - MATCH_MP_TAC RANDOM_VARIABLE_SUB_CONST THEN - REWRITE_TAC[ETA_AX] THEN - ASM_MESON_TAC[integrable]]; - MATCH_MP_TAC FINITE_IMAGE THEN - MATCH_MP_TAC FINITE_SUBSET THEN - EXISTS_TAC `0..(k + 1) * (k + 1):num` THEN - REWRITE_TAC[FINITE_NUMSEG] THEN - REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_NUMSEG] THEN ARITH_TAC]; + [SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. max (g1 x) (g2 x) * indicator_fn A x) = + simple_expectation p + (\x. g1 x * indicator_fn B x + g2 x * indicator_fn (A DIFF B) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_EXPECTATION_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `g1:A->real`; + `indicator_fn (B:A->bool)`] SIMPLE_RV_MUL) THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `g2:A->real`; + `indicator_fn (A DIFF B:A->bool)`] SIMPLE_RV_MUL) THEN + ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]]]; ALL_TAC] THEN + SUBGOAL_THEN `(mu:(A->bool)->real) A = mu B + mu (A DIFF B)` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `B:A->bool`; `A DIFF B:A->bool`] SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + SUBGOAL_THEN `DISJOINT (B:A->bool) (A DIFF B)` ASSUME_TAC THENL + [SET_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_SIMP_TAC[]]);; + +(* Absolute continuity of a set integral *) +let ABSOLUTELY_CONTINUOUS_FROM_INTEGRAL = prove + (`!p:A prob_space f. + integrable p f + ==> absolutely_continuous p + (\A. expectation p (\x. f x * indicator_fn A x))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[absolutely_continuous] THEN CONJ_TAC THENL + [MATCH_MP_TAC SIGNED_MEASURE_FROM_INTEGRAL THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN ASM_REWRITE_TAC[]]);; + +(* Simple expectation of zero-multiplied function is zero *) +let SIMPLE_EXPECTATION_ZERO_MUL = prove + (`!p:A prob_space A. A IN prob_events p + ==> simple_expectation p (\x:A. &0 * indicator_fn A x) = &0`, + REPEAT STRIP_TAC THEN + TRANS_TAC EQ_TRANS `simple_expectation (p:A prob_space) (\x:A. &0)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_MUL_LZERO]; + REWRITE_TAC[SIMPLE_EXPECTATION_CONST]]);; + +(* Simple expectation on carrier equals simple expectation *) +let SIMPLE_EXPECTATION_ON_CARRIER = prove + (`!p:A prob_space g. + simple_expectation p (\x. g x * indicator_fn (prob_carrier p) x) = + simple_expectation p g`, + REPEAT GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[indicator_fn] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]);; + +(* Simple expectation of nonneg function on a null set is zero *) +let SIMPLE_EXPECTATION_NULL_SET = prove + (`!p:A prob_space g A. + simple_rv p g /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + A IN prob_events p /\ prob p A = &0 + ==> simple_expectation p (\x. g x * indicator_fn A x) = &0`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_POS THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(X_CHOOSE_TAC `Bg:real`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x:A. Bg * indicator_fn (A:A->bool) x)` THEN CONJ_TAC THENL - [REWRITE_TAC[null_event] THEN CONJ_TAC THENL - [MATCH_MP_TAC LIMSUP_EVENTS_IN_EVENTS THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC FIRST_BOREL_CANTELLI THEN ASM_REWRITE_TAC[] THEN - (* Need: real_summable (from 0) (\i. prob p (B i)) *) - (* Strategy: P(B k) <= C/(k^2+1) via Chebyshev + union bound, then compare *) - (* with summable 1/(k^2+1). *) - ABBREV_TAC `A = \k j. {x:A | x IN prob_carrier p /\ - abs(sum(0..j) (\i. (X:num->A->real) (k * k + 1 + i) x - mu)) >= - &(SUC(k * k)) * inv(&(SUC m))}` THEN - (* Each A k j is a prob_event *) - SUBGOAL_THEN `!k j. (A:num->num->A->bool) k j IN prob_events p` - (LABEL_TAC "Aev") THENL - [REPEAT GEN_TAC THEN EXPAND_TAC "A" THEN - MATCH_MP_TAC RANDOM_VARIABLE_GE THEN - MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN - MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; - `\(i:num) (x:A). (X:num->A->real) (k * k + 1 + i) x - mu`; - `j:num`] RANDOM_VARIABLE_SUM)) THEN - ANTS_TAC THENL - [REPEAT STRIP_TAC THEN MATCH_MP_TAC RANDOM_VARIABLE_SUB_CONST THEN - MP_TAC(SPEC `k * k + 1 + i:num` - (ASSUME `!n. integrable (p:A prob_space) ((X:num->A->real) n)`)) THEN - REWRITE_TAC[integrable] THEN SIMP_TAC[ETA_AX]; - REWRITE_TAC[]]; ALL_TAC] THEN - (* B k SUBSET UNIONS(IMAGE (A k) (0..2*k)) *) - SUBGOAL_THEN `!k. (B:num->A->bool) k SUBSET - UNIONS(IMAGE ((A:num->num->A->bool) k) (0..2 * k))` - (LABEL_TAC "Bsub") THENL - [X_GEN_TAC `k:num` THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN - REWRITE_TAC[SUBSET; UNIONS_IMAGE; IN_ELIM_THM; IN_NUMSEG; LE_0] THEN - X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN - EXISTS_TAC `nn - (k * k + 1):num` THEN - SUBGOAL_THEN `nn - (k * k + 1) <= 2 * k` (fun th -> REWRITE_TAC[th]) THENL - [ASM_ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN `!i:num. k * k + 1 + i = (k * k + 1) + i` - (fun th -> REWRITE_TAC[th]) THENL - [ARITH_TAC; ALL_TAC] THEN - SUBGOAL_THEN - `sum (0..nn - (k * k + 1)) - (\i:num. (X:num->A->real) ((k * k + 1) + i) x - mu) = - sum (k * k + 1..nn) (\i. X i x - mu)` - (fun th -> ASM_REWRITE_TAC[th]) THEN - MP_TAC(BETA_RULE(ISPECL [`\i:num. (X:num->A->real) i x - mu`; - `k * k + 1`; `nn:num`] SUM_OFFSET_0)) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN SUBST1_TAC THEN - MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN - REPEAT STRIP_TAC THEN - AP_THM_TAC THEN AP_TERM_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN - ARITH_TAC; ALL_TAC] THEN - (* Comparison test: bound P(B k) by C/(k^2+1) *) - MATCH_MP_TAC REAL_SUMMABLE_COMPARISON THEN - EXISTS_TAC `\k. &5 * sigma_sq * &(SUC m) pow 2 * - inv(&(SUC(k * k)))` THEN + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CMUL THEN + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + ASM_MESON_TAC[REAL_ARITH `!x b:real. abs x <= b ==> x <= b`]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]; + ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_CMUL; ETA_AX; SIMPLE_RV_INDICATOR] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR] THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]);; + +(* Monotone convergence for nonneg simple functions with bounded expectations. + Produces an integrable limit function f with E[f*1_A] = lim E_s[fn*1_A]. *) +let MCT_SIMPLE_NONNEG = prove + (`!p:A prob_space fn. + (!n. simple_rv p (fn n)) /\ + (!n x. x IN prob_carrier p ==> &0 <= fn n x) /\ + (!n x. x IN prob_carrier p ==> fn n x <= fn (SUC n) x) /\ + (?B. !n. simple_expectation p (fn n) <= B) + ==> ?f. integrable p f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!A. A IN prob_events p ==> + ((\n. simple_expectation p + (\x. fn n x * indicator_fn A x)) ---> + expectation p (\x. f x * indicator_fn A x)) sequentially)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Step 1: Transitive monotonicity *) + SUBGOAL_THEN `!m n x:A. m <= n /\ x IN prob_carrier p + ==> (fn:num->A->real) m x <= fn n x` ASSUME_TAC THENL + [GEN_TAC THEN INDUCT_TAC THENL + [SIMP_TAC[LE] THEN MESON_TAC[REAL_LE_REFL]; + GEN_TAC THEN REWRITE_TAC[LE] THEN STRIP_TAC THENL + [ASM_REWRITE_TAC[REAL_LE_REFL]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `(fn:num->A->real) n x` THEN + CONJ_TAC THENL [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[]]]]; ALL_TAC] THEN + (* Step 2: fn are random variables *) + SUBGOAL_THEN `!n. random_variable p ((fn:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_rv]; ALL_TAC] THEN + (* Step 3: Level sets are events *) + SUBGOAL_THEN `!n a. {x:A | x IN prob_carrier p /\ + (fn:num->A->real) n x <= a} IN prob_events p` ASSUME_TAC THENL + [REPEAT GEN_TAC THEN + UNDISCH_TAC `!n:num. random_variable (p:A prob_space) ((fn:num->A->real) n)` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 4: Bounded set definition *) + ABBREV_TAC `bdd_set = {x:A | x IN prob_carrier p /\ + ?M:real. !n:num. (fn:num->A->real) n x <= M}` THEN + (* Step 5: For each k, S_k = {x | carrier /\ !n. fn n x <= &k} is in events *) + SUBGOAL_THEN `!k:num. {x:A | x IN prob_carrier p /\ + !n. (fn:num->A->real) n x <= &k} IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + !n. (fn:num->A->real) n x <= &k} = + INTERS (IMAGE (\n. {x | x IN prob_carrier p /\ fn n x <= &k}) + (:num))` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_UNIV] THEN + GEN_TAC THEN EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + SIMP_TAC[COUNTABLE_IMAGE; NUM_COUNTABLE] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_UNIV] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY]]; ALL_TAC] THEN + (* Step 6: bdd_set is in events *) + SUBGOAL_THEN `(bdd_set:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "bdd_set" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + ?M:real. !n. (fn:num->A->real) n x <= M} = + UNIONS (IMAGE (\k:num. {x | x IN prob_carrier p /\ !n. fn n x <= &k}) + (:num))` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; UNIONS_IMAGE; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `y:A` THEN EQ_TAC THENL + [STRIP_TAC THEN MP_TAC(SPEC `M:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `k0:num`) THEN EXISTS_TAC `k0:num` THEN + ASM_REWRITE_TAC[] THEN GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `M:real` THEN + ASM_SIMP_TAC[REAL_OF_NUM_LE]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]; ALL_TAC] THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN + SIMP_TAC[COUNTABLE_IMAGE; NUM_COUNTABLE] THEN + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Step 7: P(carrier \ bdd_set) = 0 *) + SUBGOAL_THEN `prob p (prob_carrier (p:A prob_space) DIFF bdd_set:A->bool) = &0` + ASSUME_TAC THENL + [MATCH_MP_TAC(prove(`!x:real. &0 <= x /\ (!e. &0 < e ==> x < e) ==> x = &0`, + GEN_TAC THEN STRIP_TAC THEN + ASM_CASES_TAC `x = &0:real` THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:real`) THEN ASM_REAL_ARITH_TAC)) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + X_GEN_TAC `e:real` THEN DISCH_TAC THEN + (* Use Markov inequality: for large C, P(fn n > C) <= B/C for all n *) + SUBGOAL_THEN `&0 <= B` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((fn:num->A->real) 0)` THEN + CONJ_TAC THENL [MATCH_MP_TAC SIMPLE_EXPECTATION_POS THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + MP_TAC(SPEC `B / e:real` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `C':num`) THEN + ABBREV_TAC `C = C' + 1` THEN + SUBGOAL_THEN `B / e <= &C` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&C'` THEN + ASM_REWRITE_TAC[REAL_OF_NUM_LE] THEN EXPAND_TAC "C" THEN ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < &C` ASSUME_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LT] THEN EXPAND_TAC "C" THEN ARITH_TAC; + ALL_TAC] THEN + (* P(carrier \ bdd_set) <= P(carrier \ S_C) *) + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `prob p (prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ !n. (fn:num->A->real) n x <= &C})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN - MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN - MATCH_MP_TAC REAL_SUMMABLE_LMUL THEN - REWRITE_TAC[SUMMABLE_INV_SUC_SQUARES]; ALL_TAC] THEN - EXISTS_TAC `0` THEN REWRITE_TAC[GE; LE_0; IN_FROM] THEN - X_GEN_TAC `k:num` THEN - SUBGOAL_THEN `&0 <= prob p ((B:num->A->bool) k)` - (fun th -> REWRITE_TAC[MATCH_MP - (REAL_ARITH `&0 <= x ==> abs x = x`) th]) THENL - [ASM_SIMP_TAC[PROB_POSITIVE]; ALL_TAC] THEN - (* Chain: P(B k) <= P(union) <= sum(P(A k j)) <= bound *) + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + EXPAND_TAC "bdd_set" THEN SET_TAC[]; ALL_TAC] THEN + (* Use continuity from below for {fn n > &C} *) + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ !n. (fn:num->A->real) n x <= &C} = + UNIONS {prob_carrier p DIFF {x | x IN prob_carrier p /\ fn n x <= &C} | + n IN (:num)}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM; UNIONS_GSPEC; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [STRIP_TAC THEN + SUBGOAL_THEN `~(!n. (fn:num->A->real) n x <= &C)` MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + REWRITE_TAC[NOT_FORALL_THM] THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN EXISTS_TAC `nn:num` THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[REAL_NOT_LE]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Apply PROB_CONTINUITY_FROM_BELOW + REALLIM_UBOUND *) + MP_TAC(ISPECL + [`p:A prob_space`; + `\n. prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x <= &C}`] + PROB_CONTINUITY_FROM_BELOW) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN BETA_TAC THEN MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; + GEN_TAC THEN BETA_TAC THEN REWRITE_TAC[SUBSET; IN_DIFF; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~((x:A) IN prob_carrier p /\ (fn:num->A->real) n x <= &C)` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_NOT_LE] THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `(fn:num->A->real) n x` THEN + ASM_SIMP_TAC[]]; ALL_TAC] THEN + DISCH_THEN(ASSUME_TAC o BETA_RULE) THEN + (* Each term P(fn n > C) <= B / C *) + SUBGOAL_THEN `!n. prob p (prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x <= &C}) <= B / &C` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `prob p (prob_carrier (p:A prob_space) DIFF + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x <= &C}) <= + simple_expectation p (fn n) / &C` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x >= &C}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_GE_EVENT THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + REWRITE_TAC[SUBSET; IN_DIFF; IN_ELIM_THM; real_ge] THEN + GEN_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~((x:A) IN prob_carrier p /\ (fn:num->A->real) n x <= &C)` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(fn:num->A->real) n`; + `\x:A. &C`; `{x:A | x IN prob_carrier p /\ (fn:num->A->real) n x >= &C}`] + SIMPLE_EXPECTATION_GE_ON_EVENT) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[SIMPLE_RV_CONST] THEN + CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_GE_EVENT THEN ASM_REWRITE_TAC[ETA_AX]; + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]]; ALL_TAC] THEN + DISCH_THEN(ASSUME_TAC o BETA_RULE) THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. &C * indicator_fn + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x >= &C} x) = + &C * prob p {x | x IN prob_carrier p /\ fn n x >= &C}` SUBST_ALL_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. indicator_fn {x | x IN prob_carrier p /\ + (fn:num->A->real) n x >= &C} x`; `&C`] + SIMPLE_EXPECTATION_CMUL) THEN + REWRITE_TAC[ETA_AX] THEN ANTS_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC SIMPLE_RV_GE_EVENT THEN ASM_REWRITE_TAC[ETA_AX]; + DISCH_THEN SUBST1_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR; SIMPLE_RV_GE_EVENT; ETA_AX]]; + ALL_TAC] THEN + RULE_ASSUM_TAC(REWRITE_RULE[real_ge]) THEN + REWRITE_TAC[real_ge] THEN ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `prob (p:A prob_space) (UNIONS(IMAGE - ((A:num->num->A->bool) k) (0..2 * k)))` THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((fn:num->A->real) n) / &C` THEN + ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[REAL_LE_DIV2_EQ] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* By REALLIM_UBOUND: limit <= B/C *) + MP_TAC(ISPECL + [`sequentially`; + `\n. prob (p:A prob_space) (prob_carrier p DIFF + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x <= &C})`; + `prob (p:A prob_space) (UNIONS {prob_carrier p DIFF + {x:A | x IN prob_carrier p /\ (fn:num->A->real) n x <= &C} | + n IN (:num)})`; + `B / &C`] REALLIM_UBOUND) THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + ANTS_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `a < e ==> x <= a ==> x < e`) THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + SUBGOAL_THEN `B / e < &C` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `&C'` THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + EXPAND_TAC "C" THEN ARITH_TAC; + ALL_TAC] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN + ASM_SIMP_TAC[GSYM REAL_LT_LDIV_EQ]; + ALL_TAC] THEN + (* Step 8: Pointwise convergence on bdd_set *) + SUBGOAL_THEN `!x:A. x IN bdd_set + ==> ((\n. (fn:num->A->real) n x) ---> + sup {fn n x | n IN (:num)}) sequentially` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN EXPAND_TAC "bdd_set" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MATCH_MP_TAC INCREASING_BOUNDED_CONVERGES_TO_SUP THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `M:real` THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Step 9: sup is nonneg on bdd_set *) + SUBGOAL_THEN `!x:A. x IN bdd_set + ==> &0 <= sup {(fn:num->A->real) n x | n IN (:num)}` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN EXPAND_TAC "bdd_set" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(fn:num->A->real) 0 x` THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + MP_TAC(SPEC `{(fn:num->A->real) n x | n IN (:num)}` SUP) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `(fn:num->A->real) 0 x` THEN EXISTS_TAC `0` THEN REFL_TAC; + EXISTS_TAC `M:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (K ALL_TAC)) THEN + DISCH_THEN(MP_TAC o SPEC `(fn:num->A->real) 0 x`) THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN MATCH_MP_TAC THEN EXISTS_TAC `0` THEN REFL_TAC; ALL_TAC] THEN + (* Step 10: Provide the witness *) + EXISTS_TAC `\x:A. if x IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0` THEN + REWRITE_TAC[BETA_THM] THEN + (* Step 11: Key property: fn n <= f on bdd_set *) + SUBGOAL_THEN `!n x:A. x IN bdd_set + ==> (fn:num->A->real) n x <= + sup {fn k x | k IN (:num)}` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + SUBGOAL_THEN `x:A IN prob_carrier p /\ + ?M:real. !n. (fn:num->A->real) n x <= M` STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `(x:A) IN bdd_set` THEN EXPAND_TAC "bdd_set" THEN + REWRITE_TAC[IN_ELIM_THM]; ALL_TAC] THEN + MP_TAC(SPEC `{(fn:num->A->real) k x | k IN (:num)}` SUP) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + MESON_TAC[]; + EXISTS_TAC `M:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (K ALL_TAC)) THEN + DISCH_THEN(MP_TAC o SPEC `(fn:num->A->real) n x`) THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + DISCH_THEN MATCH_MP_TAC THEN EXISTS_TAC `n:num` THEN REFL_TAC; + ALL_TAC] THEN + (* Step 12: bdd_set SUBSET carrier *) + SUBGOAL_THEN `bdd_set SUBSET prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [EXPAND_TAC "bdd_set" THEN SET_TAC[]; ALL_TAC] THEN + (* Step 13: f = 0 outside bdd_set *) + (* Step 14: On carrier, f * 1_bdd = f *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + (if x IN bdd_set then sup {(fn:num->A->real) n x | n IN (:num)} else &0) * + indicator_fn bdd_set x = + (if x IN bdd_set then sup {fn n x | n IN (:num)} else &0)` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO]; + ALL_TAC] THEN + (* Now prove the three conjuncts *) + (* First: prove nonneg *) + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + &0 <= (if x IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0)` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN COND_CASES_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; ALL_TAC] THEN + (* Second: prove random_variable *) + SUBGOAL_THEN `random_variable (p:A prob_space) + (\x:A. if x IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0)` ASSUME_TAC THENL + [REWRITE_TAC[random_variable] THEN X_GEN_TAC `a:real` THEN + ASM_CASES_TAC `a < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (if x IN bdd_set then sup {(fn:num->A->real) n x | n IN (:num)} + else &0) <= a} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + X_GEN_TAC `x:A` THEN + COND_CASES_TAC THENL + [STRIP_TAC THEN + SUBGOAL_THEN `&0 <= sup {(fn:num->A->real) n x | n IN (:num)}` + ASSUME_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[REAL_ARITH `&0 <= s ==> s <= a ==> a < &0 ==> F`]; + STRIP_TAC THEN + ASM_MESON_TAC[REAL_ARITH `&0 <= a ==> a < &0 ==> F`]]; + ALL_TAC] THEN + REWRITE_TAC[PROB_EMPTY_IN_EVENTS]; ALL_TAC] THEN + (* Case a >= 0 *) + SUBGOAL_THEN `&0 <= a` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + (if x IN bdd_set then sup {(fn:num->A->real) n x | n IN (:num)} + else &0) <= a} = + {x | x IN prob_carrier p /\ !n. fn n x <= a} UNION + (prob_carrier p DIFF bdd_set)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNION; IN_DIFF] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [(* Forward *) + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `(x:A) IN bdd_set` THENL + [DISJ1_TAC THEN ASM_REWRITE_TAC[] THEN GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `sup {(fn:num->A->real) n' x | n' IN (:num)}` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `(if (x:A) IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0) <= a` THEN + ASM_REWRITE_TAC[]; + DISJ2_TAC THEN ASM_REWRITE_TAC[]]; + (* Backward *) + STRIP_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_CASES_TAC `(x:A) IN bdd_set` THENL + [ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(x:A) IN bdd_set` THEN EXPAND_TAC "bdd_set" THEN + REWRITE_TAC[IN_ELIM_THM] THEN STRIP_TAC THEN + MP_TAC(SPEC `{(fn:num->A->real) n' x | n' IN (:num)}` SUP) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM; IN_UNIV] THEN + MESON_TAC[]; + EXISTS_TAC `M:real` THEN REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) MP_TAC) THEN + DISCH_THEN MATCH_MP_TAC THEN + REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[] THEN ASM_CASES_TAC `(x:A) IN bdd_set` THENL + [ASM_MESON_TAC[]; ASM_REWRITE_TAC[]]]]; ALL_TAC] THEN + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ !n. (fn:num->A->real) n x <= a} = + INTERS (IMAGE (\n. {x | x IN prob_carrier p /\ fn n x <= a}) (:num))` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; INTERS_IMAGE; IN_ELIM_THM; IN_UNIV] THEN + GEN_TAC THEN EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN + SIMP_TAC[COUNTABLE_IMAGE; NUM_COUNTABLE] THEN CONJ_TAC THENL - [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN CONJ_TAC THENL - [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_NUMSEG] THEN - REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; - MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG]]; ALL_TAC] THEN + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_UNIV] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[IMAGE_EQ_EMPTY; UNIV_NOT_EMPTY]]; + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; ALL_TAC] THEN + (* Third: prove integrability *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. if x IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0)` ASSUME_TAC THENL + [REWRITE_TAC[integrable] THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `B:real` THEN + X_GEN_TAC `g:A->real` THEN STRIP_TAC THEN + (* For simple g with 0 <= g <= |f| = f, show E_s[g] <= B *) + (* Use: min(g, fn n) is simple, increasing to g, bounded, *) + (* so SIMPLE_MCT_NN_EXPECTATION gives E_s[min(g, fn n)] -> nn_exp(g) = E_s[g] *) + (* And E_s[min(g, fn n)] <= E_s[fn n] <= B *) + (* So E_s[g] <= B by REALLIM_UBOUND *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n. (\x:A. min ((g:A->real) x) ((fn:num->A->real) n x))`; + `g:A->real`] SIMPLE_MCT_NN_EXPECTATION) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_MIN THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> min c a <= min c b`) THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `ee:real` THEN DISCH_TAC THEN + ASM_CASES_TAC `(x:A) IN bdd_set` THENL + [(* On bdd_set: fn n x -> sup >= g x, so min(g x, fn n x) -> g x *) + SUBGOAL_THEN `((\n. (fn:num->A->real) n x) ---> + sup {fn n x | n IN (:num)}) sequentially` MP_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `ee:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `N:num` THEN + X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(fn:num->A->real) nn x <= + sup {fn k x | k IN (:num)}` ASSUME_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(g:A->real) x <= + sup {(fn:num->A->real) k x | k IN (:num)}` ASSUME_TAC THENL + [SUBGOAL_THEN `(g:A->real) x <= + abs((if (x:A) IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0))` + MP_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= s ==> g <= abs s ==> g <= s`) THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `abs(min ((g:A->real) x) ((fn:num->A->real) nn x) - g x) = + max (g x - fn nn x) (&0)` SUBST1_TAC THENL + [REWRITE_TAC[real_min; real_max] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THENL + [ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `g <= s ==> abs(fnx - s) < e ==> g - fnx < e`) THEN + ASM_REWRITE_TAC[]]; + (* On ~bdd_set: g x = 0 (since g <= |f| = 0 on ~bdd) *) + SUBGOAL_THEN `(g:A->real) x = &0` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= g /\ g <= &0 ==> g = &0`) THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((if (x:A) IN bdd_set + then sup {(fn:num->A->real) n x | n IN (:num)} else &0))` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + COND_CASES_TAC THENL [ASM_MESON_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `min ((g:A->real) x) ((fn:num->A->real) nn x) = &0` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= f ==> min (&0) f = &0`) THEN + ASM_SIMP_TAC[]; + ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_NUM]]]; ALL_TAC] THEN + (* g is bounded *) + MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `Bg:real`) THEN + EXISTS_TAC `Bg:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Now have E_s[min(g, fn n)] -> nn_exp(g) = E_s[g] *) + DISCH_TAC THEN + (* Also: E_s[min(g, fn n)] <= E_s[fn n] <= B *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. min ((g:A->real) x) ((fn:num->A->real) n x)) <= + simple_expectation p (fn n)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MIN THEN ASM_REWRITE_TAC[ETA_AX]; + ASM_REWRITE_TAC[] THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[REAL_MIN_LE] THEN DISJ2_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* nn_exp(g) = E_s[g] *) + MP_TAC(ISPECL [`p:A prob_space`; `g:A->real`] NN_EXPECTATION_SIMPLE) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST_ALL_TAC o SYM) THEN + (* REALLIM_UBOUND *) + MP_TAC(ISPECL + [`sequentially`; + `\n. simple_expectation (p:A prob_space) + (\x:A. min ((g:A->real) x) ((fn:num->A->real) n x))`; + `nn_expectation (p:A prob_space) (g:A->real)`; + `B:real`] REALLIM_UBOUND) THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + ANTS_TAC THENL + [REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..2 * k) - (\j. prob (p:A prob_space) ((A:num->num->A->bool) k j))` THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((fn:num->A->real) n)` THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; ALL_TAC] THEN + (* NOW PROVE THE THREE GOALS *) + ASM_REWRITE_TAC[] THEN + (* Convergence *) + X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + (* E_s[fn n * 1_A] = E_s[fn n * 1_{A ∩ bdd}] + E_s[fn n * 1_{A ∩ ~bdd}] *) + (* E_s[fn n * 1_{A ∩ ~bdd}] = 0 since P(~bdd) = 0 *) + (* E_s[fn n * 1_{A ∩ bdd}] -> nn_exp(f * 1_{A ∩ bdd}) = nn_exp(f * 1_A) = E[f * 1_A] *) + (* Decompose: fn n * 1_A = fn n * 1_{A ∩ bdd} + fn n * 1_{A \ bdd} on carrier *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn A x) = + simple_expectation p (\x. fn n x * indicator_fn (A INTER bdd_set) x) + + simple_expectation p (\x. fn n x * indicator_fn (A DIFF bdd_set) x)` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn A x) = + simple_expectation p + (\x. fn n x * indicator_fn (A INTER bdd_set) x + + fn n x * indicator_fn (A DIFF bdd_set) x)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER; IN_DIFF] THEN + ASM_CASES_TAC `(x:A) IN A` THEN ASM_CASES_TAC `(x:A) IN bdd_set` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + (MATCH_MP_TAC PROB_INTER_IN_EVENTS ORELSE + MATCH_MP_TAC PROB_DIFF_IN_EVENTS) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* E_s[fn n * 1_{A \ bdd}] = 0 *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A DIFF bdd_set) x) = &0` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_NULL_SET THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) + (prob_carrier p DIFF bdd_set:A->bool)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + ASM_MESON_TAC[PROB_EVENT_SUBSET; SUBSET; IN_DIFF]; + ONCE_ASM_REWRITE_TAC[] THEN REWRITE_TAC[REAL_LE_REFL]]; ALL_TAC] THEN + (* So E_s[fn n * 1_A] = E_s[fn n * 1_{A ∩ bdd}] *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn A x) = + simple_expectation p (\x. fn n x * indicator_fn (A INTER bdd_set) x)` + ASSUME_TAC THENL + [GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_ADD_RID] THEN + (* Now show E_s[fn n * 1_{A ∩ bdd}] -> E[f * 1_A] *) + (* Key: fn n * 1_{A ∩ bdd} -> f * 1_{A ∩ bdd} = f * 1_A pointwise on carrier *) + (* f is bounded on A ∩ bdd (hmm, is it? f = sup, which could be unbounded) *) + (* Actually f might not be bounded on bdd_set! *) + (* Need a different argument: use the min trick again *) + (* Lower bound: nn_exp(f * 1_A) <= lim E_s[fn n * 1_{A ∩ bdd}] *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x) <= + nn_expectation p (\x. (if x IN bdd_set + then sup {fn k x | k IN (:num)} else &0) * indicator_fn A x)` + ASSUME_TAC THENL + [GEN_TAC THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` NN_EXPECTATION_LE) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]; ALL_TAC] THEN + CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + ASM_CASES_TAC `(x:A) IN A` THEN ASM_CASES_TAC `(x:A) IN bdd_set` THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO; REAL_MUL_RID; REAL_LE_REFL] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + REAL_ARITH_TAC]]; ALL_TAC] THEN + (* Monotonicity of the sequence *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x) <= + simple_expectation p + (\x. fn (SUC n) x * indicator_fn (A INTER bdd_set) x)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + ASM_CASES_TAC `(x:A) IN A /\ x IN bdd_set` THEN + ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Non-negativity *) + SUBGOAL_THEN `!n. &0 <= simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_POS THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + REAL_ARITH_TAC]]; ALL_TAC] THEN + (* Upper bound by B *) + SUBGOAL_THEN `!n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x) <= + B` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((fn:num->A->real) n)` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + ASM_CASES_TAC `(x:A) IN A /\ x IN bdd_set` THEN + ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL] THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Convergence to some limit L *) + MP_TAC(REWRITE_RULE[GSYM REALLIM_SEQUENTIALLY] + (ISPECL [ + `\n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x)`; + `abs B`] CONVERGENT_BOUNDED_MONOTONE)) THEN + DISCH_THEN(fun imp -> + SUBGOAL_THEN (lhand(concl imp)) (fun th -> + MP_TAC(MP imp th)) THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC(REAL_ARITH + `&0 <= x /\ x <= B ==> abs x <= abs B`) THEN ASM_REWRITE_TAC[]; + DISJ1_TAC THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + MATCH_MP_TAC MONOTONE_EXTENDS THEN ASM_REWRITE_TAC[]]; + DISCH_THEN(X_CHOOSE_TAC `L:real`)]) THEN + (* L <= nn_exp via REALLIM_UBOUND *) + SUBGOAL_THEN `L <= nn_expectation (p:A prob_space) + (\x:A. (if x IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x)` ASSUME_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* nn_exp <= L via NN_EXPECTATION_LE_FROM_SIMPLE *) + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x:A. (if x IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x) <= L` ASSUME_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_LE_FROM_SIMPLE THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + CONJ_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_MUL THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + REAL_ARITH_TAC]; ALL_TAC] THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + (* For simple h <= f * 1_A, show E_s[h] <= L using REALLIM_LE *) + MP_TAC(ISPECL [`p:A prob_space`; + `\n. (\x:A. min ((h:A->real) x) + ((fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x))`; + `h:A->real`] SIMPLE_MCT_NN_EXPECTATION) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_MIN THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC PROB_FINITE_SUBADDITIVE THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Apply CHEBYSHEV_SHIFTED_SUM to each P(A k j) *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..2 * k) (\j. &(SUC j) * sigma_sq * - inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2))` THEN + [REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_LE_MIN] THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + REWRITE_TAC[indicator_fn; IN_INTER] THEN REAL_ARITH_TAC]]; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC SUM_LE_NUMSEG THEN X_GEN_TAC `j':num` THEN STRIP_TAC THEN - EXPAND_TAC "A" THEN - ONCE_REWRITE_TAC[ARITH_RULE `k * k + 1 + i:num = (k * k + 1) + i`] THEN - MATCH_MP_TAC CHEBYSHEV_SHIFTED_SUM THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LT_MUL THEN - REWRITE_TAC[REAL_OF_NUM_LT; LT_0] THEN - MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; - ALL_TAC] THEN - (* Simplify inv((N * inv(M))^2) = M^2 * inv(N^2) *) - SUBGOAL_THEN `inv((&(SUC(k * k)) * inv(&(SUC m))) pow 2) = - &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` SUBST1_TAC THENL - [MATCH_MP_TAC(REAL_FIELD `~(a = &0) /\ ~(b = &0) ==> - inv((a * inv b) pow 2) = b pow 2 * inv(a pow 2)`) THEN - REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]; ALL_TAC] THEN - REWRITE_TAC[SUM_RMUL] THEN - (* sum(0..2k)(SUC j) * c <= 5*N * c, then 5*N*c = 5*sigma_sq*M^2/N *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `(&5 * &(SUC(k * k))) * sigma_sq * - &(SUC m) pow 2 * inv(&(SUC(k * k)) pow 2)` THEN + [REPEAT STRIP_TAC THEN REWRITE_TAC[real_min] THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + ASM_CASES_TAC `(x:A) IN A /\ x IN bdd_set` THEN + ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO] THENL + [SUBGOAL_THEN `(fn:num->A->real) n x <= fn (SUC n) x` MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]; + REAL_ARITH_TAC]; ALL_TAC] THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL - [(* sum(0..2k)(SUC j) <= 5*SUC(k*k) on reals *) - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `sum(0..2*k) (\j. &(SUC(2*k)))` THEN CONJ_TAC THENL - [MATCH_MP_TAC SUM_LE_NUMSEG THEN - GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; - REWRITE_TAC[SUM_CONST_NUMSEG; SUB_0; ADD1] THEN - REWRITE_TAC[REAL_OF_NUM_MUL; REAL_OF_NUM_LE] THEN - ASM_CASES_TAC `k <= 3` THENL - [FIRST_X_ASSUM(REPEAT_TCL DISJ_CASES_THEN ASSUME_TAC o - MATCH_MP(ARITH_RULE `k <= 3 ==> k = 0 \/ k = 1 \/ k = 2 \/ k = 3`)) THEN - ASM_REWRITE_TAC[] THEN ARITH_TAC; - MATCH_MP_TAC(ARITH_RULE - `4 * k <= k * k ==> (2 * k + 1) * (2 * k + 1) <= 5 * (k * k + 1)`) THEN - ONCE_REWRITE_TAC[MULT_SYM] THEN REWRITE_TAC[LE_MULT_LCANCEL] THEN - DISJ2_TAC THEN ASM_ARITH_TAC]]; - (* 0 <= sigma_sq * M^2 * inv(N^2) *) - MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL - [SUBGOAL_THEN `sigma_sq = variance p ((X:num->A->real) 0)` SUBST1_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `0` o - check(fun th -> fst(dest_const(fst(strip_comb( - lhand(snd(dest_forall(concl th))))))) = "variance")) THEN - REWRITE_TAC[EQ_SYM_EQ]; ALL_TAC] THEN - MATCH_MP_TAC VARIANCE_NONNEG THEN - SUBGOAL_THEN `expectation p ((X:num->A->real) 0) = mu` SUBST1_TAC THENL - [ASM_REWRITE_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `(\x:A. ((X:num->A->real) 0 x - mu) pow 2) = - (\x. X 0 x pow 2 - &2 * mu * X 0 x + mu pow 2)` SUBST1_TAC THENL - [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN - MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL - [MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL - [MP_TAC(SPEC `0` (ASSUME `!n. integrable p (\x:A. (X:num->A->real) n x pow 2)`)) THEN - REWRITE_TAC[]; - MATCH_MP_TAC INTEGRABLE_CMUL THEN - MATCH_MP_TAC INTEGRABLE_CMUL THEN - MP_TAC(SPEC `0` (ASSUME `!n. integrable (p:A prob_space) ((X:num->A->real) n)`)) THEN - SIMP_TAC[ETA_AX]]; - REWRITE_TAC[INTEGRABLE_CONST]]; - MATCH_MP_TAC REAL_LE_MUL THEN - REWRITE_TAC[REAL_LE_POW_2] THEN - MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_LE_POW_2]]]; - (* 5*N * c = 5 * sigma_sq * M^2 * inv(N) by algebra *) - MATCH_MP_TAC(REAL_ARITH `a = b ==> a <= b`) THEN - MATCH_MP_TAC(REAL_FIELD `~(n = &0) ==> - (&5 * n) * s * m * inv(n pow 2) = &5 * s * m * inv n`) THEN - REWRITE_TAC[REAL_OF_NUM_EQ; NOT_SUC]]]; - (* Subset: complement of target within carrier is contained in limsup B *) - REWRITE_TAC[SUBSET; IN_ELIM_THM; limsup_events; INTERS_GSPEC; IN_UNIV] THEN - EXPAND_TAC "B" THEN REWRITE_TAC[IN_ELIM_THM] THEN + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + X_GEN_TAC `ee:real` THEN DISCH_TAC THEN + ASM_CASES_TAC `(x:A) IN A INTER bdd_set` THENL + [(* On A ∩ bdd: fn n x -> sup >= h x (since h <= f * 1_A = sup on A ∩ bdd) *) + UNDISCH_TAC `(x:A) IN A INTER bdd_set` THEN + REWRITE_TAC[IN_INTER] THEN STRIP_TAC THEN + SUBGOAL_THEN `((\n. (fn:num->A->real) n x) ---> + sup {fn n x | n IN (:num)}) sequentially` MP_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `ee:real`) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN EXISTS_TAC `N:num` THEN + X_GEN_TAC `nn:num` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + ASM_REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(h:A->real) x <= + sup {(fn:num->A->real) k x | k IN (:num)}` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(if (x:A) IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[indicator_fn; REAL_MUL_RID; REAL_LE_REFL]; + ALL_TAC] THEN + SUBGOAL_THEN `abs(min ((h:A->real) x) ((fn:num->A->real) nn x) - h x) = + max (h x - fn nn x) (&0)` SUBST1_TAC THENL + [REWRITE_TAC[real_min; real_max] THEN REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THENL + [ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH + `h <= s ==> abs(fnx - s) < e ==> h - fnx < e`) THEN + ASM_REWRITE_TAC[]]; + (* Not in A ∩ bdd: h x = 0 and fn n * 1_{A ∩ bdd} = 0 *) + SUBGOAL_THEN `(h:A->real) x = &0` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 <= h /\ h <= &0 ==> h = &0`) THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(if (x:A) IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + UNDISCH_TAC `~((x:A) IN A INTER bdd_set)` THEN + REWRITE_TAC[IN_INTER] THEN STRIP_TAC THEN + ASM_CASES_TAC `(x:A) IN bdd_set` THEN ASM_CASES_TAC `(x:A) IN A` THEN + ASM_REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL] THEN + UNDISCH_TAC `~((x:A) IN A /\ x IN bdd_set)` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[indicator_fn; IN_INTER] THEN + UNDISCH_TAC `~((x:A) IN A INTER bdd_set)` THEN + REWRITE_TAC[IN_INTER] THEN STRIP_TAC THEN + ASM_CASES_TAC `(x:A) IN A` THENL + [ASM_CASES_TAC `(x:A) IN bdd_set` THENL + [UNDISCH_TAC `~((x:A) IN A /\ x IN bdd_set)` THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[REAL_MUL_RZERO; real_min] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_NUM] THEN + ASM_REAL_ARITH_TAC; + ASM_REWRITE_TAC[REAL_MUL_RZERO; real_min] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[REAL_SUB_REFL; REAL_ABS_NUM] THEN + ASM_REAL_ARITH_TAC]]; ALL_TAC] THEN + (* h is bounded *) + MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`] SIMPLE_RV_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `Bh:real`) THEN + EXISTS_TAC `Bh:real` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* E_s[min(h, fn n * 1_{A ∩ bdd})] -> nn_exp(h) *) + DISCH_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `h:A->real`] NN_EXPECTATION_SIMPLE) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> RULE_ASSUM_TAC(REWRITE_RULE[th])) THEN + (* E_s[h] <= L via REALLIM_LE: min_seq --> E_s[h], seq --> L, min <= full *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + MAP_EVERY EXISTS_TAC [ + `\n. simple_expectation (p:A prob_space) + (\x:A. min ((h:A->real) x) + ((fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x))`; + `\n. simple_expectation (p:A prob_space) + (\x:A. (fn:num->A->real) n x * indicator_fn (A INTER bdd_set) x)`] THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `0` THEN + X_GEN_TAC `nn:num` THEN DISCH_TAC THEN BETA_TAC THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MIN THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[real_min] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* L = nn_exp: combine L <= nn_exp and nn_exp <= L, then substitute *) + SUBGOAL_THEN `L = nn_expectation (p:A prob_space) + (\x:A. (if x IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x)` SUBST_ALL_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= b /\ b <= a ==> b = a`) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Convert nn_exp to expectation *) + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (if x IN bdd_set + then sup {(fn:num->A->real) k x | k IN (:num)} else &0) * + indicator_fn A x`] EXPECTATION_NONNEG_EQ_NN) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]]; ALL_TAC] THEN + DISCH_THEN(fun th -> + RULE_ASSUM_TAC(REWRITE_RULE[SYM th]) THEN + ASM_REWRITE_TAC[]));; + +(* Key lemma: a feasible function improved by epsilon on a positive set + is still feasible when the residual measure dominates epsilon * prob *) +let FEASIBLE_IMPROVEMENT_BOUND = prove + (`!p:A prob_space mu g eps H. + signed_measure p mu /\ + simple_rv p g /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. g x * indicator_fn A x) <= mu A) /\ + H IN prob_events p /\ &0 < eps /\ + (!B. B IN prob_events p /\ B SUBSET H ==> + mu B - simple_expectation p (\x. g x * indicator_fn B x) >= + eps * prob p B) + ==> !A. A IN prob_events p ==> + simple_expectation p + (\x. (g x + eps * indicator_fn H x) * indicator_fn A x) <= mu A`, + REPEAT GEN_TAC THEN STRIP_TAC THEN X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + (* Rewrite (g + eps*1_H)*1_A = g*1_A + eps*1_{A INTER H} *) + SUBGOAL_THEN + `(\x:A. (g x + eps * indicator_fn H x) * indicator_fn A x) = + (\x. g x * indicator_fn A x + eps * indicator_fn (A INTER H) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn; IN_INTER] THEN X_GEN_TAC `x:A` THEN - REWRITE_TAC[NOT_EXISTS_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN - STRIP_TAC THEN X_GEN_TAC `NN:num` THEN - REWRITE_TAC[UNIONS_GSPEC; GE; IN_ELIM_THM] THEN - FIRST_X_ASSUM(MP_TAC o SPEC `NN:num`) THEN - ASM_REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN - DISCH_THEN(X_CHOOSE_THEN `kk:num` MP_TAC) THEN - REWRITE_TAC[DE_MORGAN_THM; NOT_FORALL_THM; NOT_IMP; REAL_NOT_LT] THEN - STRIP_TAC THEN - EXISTS_TAC `kk:num` THEN ASM_REWRITE_TAC[] THEN - EXISTS_TAC `n:num` THEN ASM_REWRITE_TAC[real_ge] THEN - ASM_REAL_ARITH_TAC]);; + ASM_CASES_TAC `(x:A) IN A` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `(x:A) IN H` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) INTER H IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) DIFF H IN prob_events p` ASSUME_TAC THENL + [ASM_SIMP_TAC[PROB_DIFF_IN_EVENTS]; ALL_TAC] THEN + (* E_s[g*1_A + eps*1_{A INTER H}] = E_s[g*1_A] + eps*prob(A INTER H) *) + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x. g x * indicator_fn A x)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_rv (p:A prob_space) (\x. eps * indicator_fn (A INTER H) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_CMUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + W(MP_TAC o PART_MATCH (lhand o rand) SIMPLE_EXPECTATION_ADD o lhand o snd) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. eps * indicator_fn (A INTER H) x) = + eps * simple_expectation p (indicator_fn (A INTER H))` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_CMUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR] THEN + (* Split E_s[g*1_A] = E_s[g*1_{A INTER H}] + E_s[g*1_{A DIFF H}] *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. g x * indicator_fn A x) = + simple_expectation p (\x. g x * indicator_fn (A INTER H) x) + + simple_expectation p (\x. g x * indicator_fn (A DIFF H) x)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. g x * indicator_fn A x) = + (\x. g x * indicator_fn (A INTER H) x + + g x * indicator_fn (A DIFF H) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; indicator_fn; IN_INTER; IN_DIFF] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN A` THEN ASM_REWRITE_TAC[] THENL + [ASM_CASES_TAC `(x:A) IN H` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_ADD THEN + CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + (* Split mu(A) = mu(A INTER H) + mu(A DIFF H) *) + SUBGOAL_THEN + `(mu:(A->bool)->real) A = mu (A INTER H) + mu (A DIFF H)` + SUBST1_TAC THENL + [SUBGOAL_THEN `(A:A->bool) = (A INTER H) UNION (A DIFF H)` + (fun th -> CONV_TAC(LAND_CONV(ONCE_REWRITE_CONV[th]))) THENL + [SET_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `p:A prob_space` SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[DISJOINT] THEN SET_TAC[]; + ALL_TAC] THEN + (* From positive set: E_s[g*1_{A INTER H}] + eps*prob(A INTER H) <= mu(A INTER H) *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. g x * indicator_fn (A INTER H) x) + + eps * prob p (A INTER H:A->bool) <= mu (A INTER H)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `mu (A INTER H:A->bool) - + simple_expectation (p:A prob_space) (\x. g x * indicator_fn (A INTER H) x) >= + eps * prob p (A INTER H)` MP_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `A INTER H:A->bool`) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN SET_TAC[]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* From feasibility: E_s[g*1_{A DIFF H}] <= mu(A DIFF H) *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. g x * indicator_fn (A DIFF H) x) <= + mu (A DIFF H:A->bool)` MP_TAC THENL + [ASM_SIMP_TAC[]; ALL_TAC] THEN + UNDISCH_TAC + `simple_expectation (p:A prob_space) (\x. g x * indicator_fn (A INTER H) x) + + eps * prob p (A INTER H:A->bool) <= mu (A INTER H)` THEN + REAL_ARITH_TAC);; + +(* Radon-Nikodym for non-negative measures *) +let RADON_NIKODYM_NONNEG = prove + (`!p:A prob_space mu. + absolutely_continuous p mu /\ + (!A. A IN prob_events p ==> &0 <= mu A) + ==> ?f. integrable p f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!A. A IN prob_events p + ==> expectation p (\x. f x * indicator_fn A x) = mu A)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Extract signed_measure and carrier facts *) + SUBGOAL_THEN `signed_measure (p:A prob_space) mu` ASSUME_TAC THENL + [ASM_MESON_TAC[absolutely_continuous]; ALL_TAC] THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) IN prob_events p` ASSUME_TAC THENL + [REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; ALL_TAC] THEN + (* Define the feasible expectation set *) + ABBREV_TAC + `Fset = {simple_expectation (p:A prob_space) g | g:A->real | + simple_rv p g /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. g x * indicator_fn A x) <= mu A)}` THEN + (* Fset is nonempty *) + SUBGOAL_THEN `~(Fset:real->bool = {})` ASSUME_TAC THENL + [EXPAND_TAC "Fset" THEN REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `(\x:A. &0)` THEN + REWRITE_TAC[SIMPLE_RV_CONST; SIMPLE_EXPECTATION_CONST] THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SIMPLE_EXPECTATION_ZERO_MUL]; + ALL_TAC] THEN + (* Fset bounded above by mu(carrier) *) + SUBGOAL_THEN `!y:real. y IN Fset ==> y <= mu(prob_carrier (p:A prob_space))` + ASSUME_TAC THENL + [EXPAND_TAC "Fset" THEN REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `y:real` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `prob_carrier (p:A prob_space)`) THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS; SIMPLE_EXPECTATION_ON_CARRIER] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + (* Define M = sup Fset *) + ABBREV_TAC `M = sup Fset` THEN + (* M properties *) + SUBGOAL_THEN `!y:real. y IN Fset ==> y <= M` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "M" THEN + MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM] ELEMENT_LE_SUP) THEN + ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!c:real. c < M ==> ?y. y IN Fset /\ c < y` ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "M" THEN + MATCH_MP_TAC SUP_APPROACH THEN ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= M` ASSUME_TAC THENL + [SUBGOAL_THEN `&0 IN Fset` MP_TAC THENL + [EXPAND_TAC "Fset" THEN REWRITE_TAC[IN_ELIM_THM] THEN + EXISTS_TAC `(\x:A. &0)` THEN + REWRITE_TAC[SIMPLE_RV_CONST; SIMPLE_EXPECTATION_CONST] THEN + CONJ_TAC THENL [REAL_ARITH_TAC; ALL_TAC] THEN + REPEAT STRIP_TAC THEN ASM_SIMP_TAC[SIMPLE_EXPECTATION_ZERO_MUL]; + ASM_MESON_TAC[REAL_LE_TRANS]]; ALL_TAC] THEN + (* Get a maximizing sequence gn *) + SUBGOAL_THEN + `?gn:num->A->real. !n. + simple_rv p (gn n) /\ + (!x. x IN prob_carrier p ==> &0 <= gn n x) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. gn n x * indicator_fn A x) <= mu A) /\ + M - inv(&(SUC n)) < simple_expectation p (gn n)` + (X_CHOOSE_TAC `gn:num->A->real`) THENL + [REWRITE_TAC[GSYM SKOLEM_THM] THEN X_GEN_TAC `n:num` THEN + SUBGOAL_THEN `M - inv(&(SUC n)) < M` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `&0 < e ==> M - e < M`) THEN + MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT] THEN + ARITH_TAC; ALL_TAC] THEN + FIRST_ASSUM(fun th -> + MP_TAC(MATCH_MP th (ASSUME `M - inv(&(SUC n)) < M`))) THEN + DISCH_THEN(X_CHOOSE_THEN `yy:real` STRIP_ASSUME_TAC) THEN + UNDISCH_TAC `(yy:real) IN Fset` THEN EXPAND_TAC "Fset" THEN + REWRITE_TAC[IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `g:A->real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `g:A->real` THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Extract individual gn properties *) + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((gn:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n x:A. x IN prob_carrier p ==> &0 <= (gn:num->A->real) n x` + ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!n A. A IN prob_events p ==> + simple_expectation (p:A prob_space) + (\x. (gn:num->A->real) n x * indicator_fn A x) <= mu A` + ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!n. M - inv(&(SUC n)) < simple_expectation (p:A prob_space) ((gn:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Define iterated max hn *) + MP_TAC(prove_recursive_functions_exist num_RECURSION + `((hn:num->A->real) 0 = (gn:num->A->real) 0) /\ + (!n. hn (SUC n) = (\x:A. max (hn n x) (gn (SUC n) x)))`) THEN + DISCH_THEN(X_CHOOSE_THEN `hn:num->A->real` STRIP_ASSUME_TAC) THEN + (* hn is simple for all n *) + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((hn:num->A->real) n)` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_MAX THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* hn is nonneg *) + SUBGOAL_THEN `!n x:A. x IN prob_carrier p ==> &0 <= (hn:num->A->real) n x` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_LE_MAX] THEN DISJ1_TAC THEN ASM_SIMP_TAC[]]; + ALL_TAC] THEN + (* hn is monotone *) + SUBGOAL_THEN + `!n x:A. x IN prob_carrier p ==> + (hn:num->A->real) n x <= hn (SUC n) x` + ASSUME_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN + REAL_ARITH_TAC; ALL_TAC] THEN + (* hn n >= gn n for all n *) + SUBGOAL_THEN + `!n x:A. x IN prob_carrier p ==> + (gn:num->A->real) n x <= (hn:num->A->real) n x` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[] THEN REPEAT STRIP_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* hn is feasible: E_s[hn * 1_A] <= mu(A) *) + SUBGOAL_THEN + `!n A. A IN prob_events p ==> + simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x) <= mu A` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) (SUC n) x * indicator_fn A x) = + simple_expectation p + (\x. max (hn n x) ((gn:num->A->real) (SUC n) x) * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL + [`p:A prob_space`; `mu:(A->bool)->real`; + `(hn:num->A->real) n`; `(gn:num->A->real) (SUC n)`] + MAX_IN_FEASIBLE_SET) THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[]; + DISCH_THEN(MP_TAC o SPEC `A:A->bool`) THEN ASM_SIMP_TAC[]]]]; + ALL_TAC] THEN + (* E_s[hn n] is in Fset *) + SUBGOAL_THEN + `!n. simple_expectation (p:A prob_space) ((hn:num->A->real) n) IN Fset` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "Fset" THEN REWRITE_TAC[IN_ELIM_THM] THEN + EXISTS_TAC `(hn:num->A->real) n` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* E_s[hn n] <= M *) + SUBGOAL_THEN + `!n. simple_expectation (p:A prob_space) ((hn:num->A->real) n) <= M` + ASSUME_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + (* E_s[hn n] >= E_s[gn n] *) + SUBGOAL_THEN + `!n. simple_expectation (p:A prob_space) ((gn:num->A->real) n) <= + simple_expectation p ((hn:num->A->real) n)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* E_s[hn n] -> M *) + SUBGOAL_THEN + `((\n. simple_expectation (p:A prob_space) ((hn:num->A->real) n)) ---> M) + sequentially` + ASSUME_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + MP_TAC(ISPEC `e:real` REAL_ARCH_INV) THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `N:num` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + MATCH_MP_TAC(REAL_ARITH + `M - e < shn /\ shn <= M ==> abs(shn - M) < e`) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((gn:num->A->real) n)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `M - inv(&(SUC n))` THEN CONJ_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `b <= a ==> x - a <= x - b`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `inv(&N)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; ALL_TAC] THEN + (* E_s[hn * 1_A] is simple_rv *) + SUBGOAL_THEN + `!n A:A->bool. A IN prob_events p ==> + simple_rv (p:A prob_space) (\x. (hn:num->A->real) n x * indicator_fn A x)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + CONJ_TAC THEN REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + (* E_s[hn * 1_A] is stepwise monotone *) + SUBGOAL_THEN + `!A n. A IN prob_events p ==> + simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x) <= + simple_expectation p (\x. hn (SUC n) x * indicator_fn A x)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + ASM_SIMP_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_RMUL THEN + CONJ_TAC THENL + [ASM_MESON_TAC[]; + REWRITE_TAC[indicator_fn] THEN REAL_ARITH_TAC]; ALL_TAC] THEN + (* E_s[hn * 1_A] is nonneg *) + SUBGOAL_THEN + `!n A. A IN prob_events p ==> + &0 <= simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_POS THEN + ASM_SIMP_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_MESON_TAC[]; REWRITE_TAC[indicator_fn] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* KEY: For each event A, lim E_s[hn * 1_A] exists *) + SUBGOAL_THEN + `!A. A IN prob_events p ==> + ?L. ((\n. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)) ---> L) + sequentially /\ &0 <= L /\ L <= mu A` + ASSUME_TAC THENL + [X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + MP_TAC(ISPECL + [`\n:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)`; + `(mu:(A->bool)->real) A`] + CONVERGENT_BOUNDED_INCREASING) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN REPEAT CONJ_TAC THENL + [REAL_ARITH_TAC; + REPEAT GEN_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `k:num` THEN BETA_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) k x * indicator_fn A x) <= + simple_expectation p (\x. hn (SUC k) x * indicator_fn A x)` + MP_TAC THENL + [ASM_SIMP_TAC[]; REAL_ARITH_TAC]]; + GEN_TAC THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= y ==> abs x <= y`) THEN + ASM_SIMP_TAC[]]; + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN EXISTS_TAC `L:real` THEN + SUBGOAL_THEN + `((\n:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)) ---> L) + sequentially` + ASSUME_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LBOUND) THEN + EXISTS_TAC `\n:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN ASM_SIMP_TAC[]; + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A x)` THEN + ASM_REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Apply MCT_SIMPLE_NONNEG to get limit function f *) + MP_TAC(ISPECL [`p:A prob_space`; `hn:num->A->real`] MCT_SIMPLE_NONNEG) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `f:A->real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `f:A->real` THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `A0:A->bool` THEN DISCH_TAC THEN + (* E[f*1_A0] = mu(A0): show <= and ~(<) *) + MATCH_MP_TAC(REAL_ARITH `a <= b /\ ~(a < b) ==> a = b`) THEN + CONJ_TAC THENL + [(* Upper bound via REALLIM_UBOUND *) + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC `\n:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn A0 x)` THEN + ASM_SIMP_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN REPEAT STRIP_TAC THEN ASM_SIMP_TAC[]; + ALL_TAC] THEN + (* Contradiction: assume E[f*1_A0] < mu(A0) *) + DISCH_TAC THEN + ABBREV_TAC + `delta = (mu:(A->bool)->real) A0 - + expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn A0 x)` THEN + SUBGOAL_THEN `&0 < delta` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* prob(A0) > 0 from absolute continuity *) + SUBGOAL_THEN `&0 < prob (p:A prob_space) A0` ASSUME_TAC THENL + [REWRITE_TAC[REAL_LT_LE] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + DISCH_TAC THEN + SUBGOAL_THEN `(mu:(A->bool)->real) A0 = &0` ASSUME_TAC THENL + [MP_TAC(ASSUME `absolutely_continuous (p:A prob_space) mu`) THEN + REWRITE_TAC[absolutely_continuous] THEN + DISCH_THEN(MP_TAC o SPEC `A0:A->bool` o CONJUNCT2) THEN + ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `&0 <= expectation (p:A prob_space) + (\x. (f:A->real) x * indicator_fn A0 x)` MP_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + REWRITE_TAC[indicator_fn] THEN REAL_ARITH_TAC]]; + ASM_REAL_ARITH_TAC]]]; + ALL_TAC] THEN + (* Define eps0 = delta / (2 * prob(A0)) *) + ABBREV_TAC `eps0 = delta / (&2 * prob (p:A prob_space) A0)` THEN + SUBGOAL_THEN `&0 < eps0` ASSUME_TAC THENL + [EXPAND_TAC "eps0" THEN MATCH_MP_TAC REAL_LT_DIV THEN + ASM_SIMP_TAC[REAL_LT_MUL; REAL_OF_NUM_LT; ARITH]; + ALL_TAC] THEN + SUBGOAL_THEN `eps0 * prob (p:A prob_space) A0 = delta / &2` + ASSUME_TAC THENL + [EXPAND_TAC "eps0" THEN REWRITE_TAC[real_div; REAL_INV_MUL] THEN + SUBGOAL_THEN `~(prob (p:A prob_space) A0 = &0)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[GSYM REAL_MUL_ASSOC] THEN + ASM_SIMP_TAC[REAL_MUL_LINV] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + (* Define sigma = mu - E[f*.] - eps0*prob, show signed measure *) + ABBREV_TAC `sigma = \A:A->bool. (mu:(A->bool)->real) A - + expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn A x) - + eps0 * prob p A` THEN + SUBGOAL_THEN `signed_measure (p:A prob_space) sigma` ASSUME_TAC THENL + [EXPAND_TAC "sigma" THEN + MATCH_MP_TAC SIGNED_MEASURE_DIFFERENCE THEN CONJ_TAC THENL + [MATCH_MP_TAC SIGNED_MEASURE_DIFFERENCE THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIGNED_MEASURE_FROM_INTEGRAL THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC SIGNED_MEASURE_CMUL THEN + REWRITE_TAC[ETA_AX; PROB_IS_SIGNED_MEASURE]]; + ALL_TAC] THEN + (* sigma(A0) > 0 *) + SUBGOAL_THEN `&0 < (sigma:(A->bool)->real) A0` ASSUME_TAC THENL + [EXPAND_TAC "sigma" THEN BETA_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* Extract positive subset H *) + MP_TAC(ISPECL [`p:A prob_space`; `sigma:(A->bool)->real`; `A0:A->bool`] + EXTRACT_POSITIVE_SUBSET) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `H:A->bool` STRIP_ASSUME_TAC) THEN + (* prob(H) > 0 *) + SUBGOAL_THEN `&0 < prob (p:A prob_space) H` ASSUME_TAC THENL + [REWRITE_TAC[REAL_LT_LE] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + DISCH_TAC THEN + SUBGOAL_THEN `(sigma:(A->bool)->real) H = &0` MP_TAC THENL + [EXPAND_TAC "sigma" THEN BETA_TAC THEN + SUBGOAL_THEN `(mu:(A->bool)->real) H = &0` SUBST1_TAC THENL + [MP_TAC(ASSUME `absolutely_continuous (p:A prob_space) mu`) THEN + REWRITE_TAC[absolutely_continuous] THEN + DISCH_THEN(MP_TAC o SPEC `H:A->bool` o CONJUNCT2) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn H x) = + &0` SUBST1_TAC THENL + [MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(SUBST1_TAC o SYM) THEN + REWRITE_TAC[REAL_MUL_RZERO] THEN REAL_ARITH_TAC]; + ASM_REAL_ARITH_TAC]]; + ALL_TAC] THEN -(* Strong Law of Large Numbers without bounded support *) -let STRONG_LAW_FINITE_VARIANCE = prove - (`!p:A prob_space (X:num->A->real) mu sigma_sq. - (!n. integrable p (X n)) /\ - (!n. integrable p (\x. X n x pow 2)) /\ - (!n. expectation p (X n) = mu) /\ - (!n. variance p (X n) = sigma_sq) /\ - (!i j. ~(i = j) ==> covariance p (X i) (X j) = &0) - ==> almost_surely p - {x | ((\n. inv(&(SUC n)) * sum(0..n) (\i. X i x)) ---> mu) sequentially}`, - REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Step 1: subsequence convergence from SLLN_SUBSEQ *) + (* Positive set gives: for B SUBSET H, mu(B) - E[f*1_B] >= eps0*prob(B) *) SUBGOAL_THEN - `almost_surely (p:A prob_space) - {x | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially}` + `!B:A->bool. B IN prob_events p /\ B SUBSET H + ==> mu B - expectation (p:A prob_space) + (\x. (f:A->real) x * indicator_fn B x) >= eps0 * prob p B` ASSUME_TAC THENL - [MATCH_MP_TAC SLLN_SUBSEQ THEN - EXISTS_TAC `sigma_sq:real` THEN ASM_REWRITE_TAC[]; + [X_GEN_TAC `B:A->bool` THEN DISCH_TAC THEN + MP_TAC(ASSUME `positive_set (p:A prob_space) sigma (H:A->bool)`) THEN + REWRITE_TAC[positive_set] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (MP_TAC o SPEC `B:A->bool`)) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + EXPAND_TAC "sigma" THEN BETA_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - (* Step 2: gap control *) + + (* E_s[hn n * 1_B] <= E[f * 1_B] via REALLIM_LBOUND *) SUBGOAL_THEN - `!m:num. almost_surely (p:A prob_space) - {x:A | ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))}` + `!n (B:A->bool). B IN prob_events p + ==> simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn B x) <= + expectation p (\x. (f:A->real) x * indicator_fn B x)` ASSUME_TAC THENL - [MATCH_MP_TAC SLLN_GAP_CONTROL THEN - EXISTS_TAC `sigma_sq:real` THEN ASM_REWRITE_TAC[]; + [REPEAT GEN_TAC THEN DISCH_TAC THEN + MP_TAC(ISPECL [`sequentially`; `\m:num. simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) m x * indicator_fn B x)`; + `expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn B x)`; + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn B x)`] + REALLIM_LBOUND) THEN + ANTS_TAC THENL + [CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + CONJ_TAC THENL + [ASM_SIMP_TAC[]; + EXISTS_TAC `n:num` THEN + X_GEN_TAC `m:num` THEN DISCH_TAC THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN ASM_SIMP_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [SUBGOAL_THEN + `!i j. i <= j ==> (hn:num->A->real) i (x:A) <= hn j x` + (fun th -> MATCH_MP_TAC th THEN ASM_REWRITE_TAC[]) THEN + MATCH_MP_TAC TRANSITIVE_STEPWISE_LE THEN + REPEAT CONJ_TAC THENL + [REAL_ARITH_TAC; REAL_ARITH_TAC; ASM_MESON_TAC[]]; + REWRITE_TAC[indicator_fn] THEN REAL_ARITH_TAC]]; + REWRITE_TAC[]]; ALL_TAC] THEN - (* Step 3: countable intersection of gap control events *) + + (* Combine: for B SUBSET H, mu(B) - E_s[hn n * 1_B] >= eps0*prob(B) *) SUBGOAL_THEN - `almost_surely (p:A prob_space) - {x:A | !m. ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))}` + `!(n:num) (B:A->bool). B IN prob_events p /\ B SUBSET H + ==> mu B - simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn B x) >= + eps0 * prob p B` ASSUME_TAC THENL - [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN - EXISTS_TAC `INTERS {(\m. {x:A | ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))}) m | m IN (:num)}` THEN - ASM_REWRITE_TAC[] THEN CONJ_TAC THENL - [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]; - REWRITE_TAC[INTERS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN MESON_TAC[]]; + [REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `mu (B:A->bool) - expectation (p:A prob_space) + (\x. (f:A->real) x * indicator_fn B x) >= eps0 * prob p B` + MP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n x * indicator_fn B x) <= + expectation p (\x. (f:A->real) x * indicator_fn B x)` MP_TAC THENL + [ASM_MESON_TAC[]; REAL_ARITH_TAC]; ALL_TAC] THEN - (* Step 4: intersect subsequence and gap control *) + + (* For each n, E_s[hn n] + eps0*prob(H) <= M *) SUBGOAL_THEN - `almost_surely (p:A prob_space) - ({x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially} INTER - {x:A | !m. ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. X i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))})` + `!(n:num). simple_expectation (p:A prob_space) (hn n) + + eps0 * prob p H <= M` ASSUME_TAC THENL - [MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]; - ALL_TAC] THEN - (* Step 5: on the intersection, show full convergence *) - MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN - EXISTS_TAC `{x:A | ((\k. inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x)) ---> mu) sequentially} INTER - {x:A | !m. ?N:num. !k. N <= k ==> - !n. k * k < n /\ n <= (k + 1) * (k + 1) ==> - abs(sum(k * k + 1..n) (\i. X i x - mu)) < - &(SUC(k * k)) * inv(&(SUC m))}` THEN - ASM_REWRITE_TAC[] THEN - X_GEN_TAC `x:A` THEN DISCH_TAC THEN - REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN STRIP_TAC THEN - (* Pointwise proof: use REALLIM_SEQUENTIALLY *) - REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN - X_GEN_TAC `e:real` THEN DISCH_TAC THEN - (* Choose m such that inv(SUC m) < e/2 *) - SUBGOAL_THEN `?m:num. inv(&(SUC m)) < e / &2` STRIP_ASSUME_TAC THENL - [MP_TAC(SPEC `e / &2` REAL_ARCH_INV) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN - EXISTS_TAC `nn - 1` THEN - ASM_CASES_TAC `nn = 0` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN - SUBGOAL_THEN `SUC(nn - 1) = nn` SUBST1_TAC THENL - [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]; - ALL_TAC] THEN - (* Get gap control N for this m *) - FIRST_X_ASSUM(MP_TAC o SPEC `m:num`) THEN - DISCH_THEN(X_CHOOSE_TAC `K_gap:num`) THEN - (* Get subsequence bound for e/2 *) - FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN - DISCH_THEN(MP_TAC o SPEC `e / &2`) THEN - ASM_SIMP_TAC[REAL_LT_DIV; REAL_OF_NUM_LT; ARITH] THEN - DISCH_THEN(X_CHOOSE_TAC `K_subseq:num`) THEN - (* Choose N = (K_gap + K_subseq)^2 *) - EXISTS_TAC `(K_gap + K_subseq) * (K_gap + K_subseq):num` THEN - X_GEN_TAC `n:num` THEN DISCH_TAC THEN - (* Find k with k*k <= n < (k+1)*(k+1) *) - MP_TAC(SPEC `n:num` NUM_SQRT_EXISTS) THEN - DISCH_THEN(X_CHOOSE_THEN `k:num` STRIP_ASSUME_TAC) THEN - (* Show K_gap + K_subseq <= k *) - SUBGOAL_THEN `K_gap + K_subseq <= k:num` ASSUME_TAC THENL - [REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN - SUBGOAL_THEN `(k + 1) * (k + 1) <= (K_gap + K_subseq) * (K_gap + K_subseq):num` MP_TAC THENL - [MATCH_MP_TAC LE_MULT2 THEN ASM_ARITH_TAC; ASM_ARITH_TAC]; - ALL_TAC] THEN - (* Case split: n = k*k or k*k < n *) - ASM_CASES_TAC `n = k * k:num` THENL - [(* Case n = k*k: directly from subsequence convergence *) + [X_GEN_TAC `n0:num` THEN + (* Apply FEASIBLE_IMPROVEMENT_BOUND *) + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `(hn:num->A->real) n0`; `eps0:real`; `H:A->bool`] + FEASIBLE_IMPROVEMENT_BOUND) THEN ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LT_TRANS THEN EXISTS_TAC `e / &2` THEN - CONJ_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o - check (fun th -> free_in `K_subseq:num` (concl th))) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]; - ASM_REAL_ARITH_TAC]; + DISCH_TAC THEN + (* hn n0 + eps0*1_H is simple_rv *) + SUBGOAL_THEN + `simple_rv (p:A prob_space) + (\x. (hn:num->A->real) n0 x + eps0 * indicator_fn H x)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(hn:num->A->real) n0`; + `\x:A. eps0 * indicator_fn (H:A->bool) x`] SIMPLE_RV_ADD) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_CMUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ALL_TAC] THEN + (* hn n0 + eps0*1_H is nonneg *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + &0 <= (hn:num->A->real) n0 x + eps0 * indicator_fn H x` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC REAL_LE_ADD THEN + CONJ_TAC THENL + [ASM_MESON_TAC[]; + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + (* E_s[hn n0 + eps0*1_H] is in Fset *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n0 x + eps0 * indicator_fn H x) IN Fset` + ASSUME_TAC THENL + [UNDISCH_TAC + `{simple_expectation (p:A prob_space) g | g | + simple_rv p g /\ + (!x. x IN prob_carrier p ==> &0 <= g x) /\ + (!A. A IN prob_events p ==> + simple_expectation p (\x. g x * indicator_fn A x) <= mu A)} = + Fset` THEN + DISCH_THEN(SUBST1_TAC o SYM) THEN + REWRITE_TAC[IN_ELIM_THM] THEN + EXISTS_TAC + `\x:A. (hn:num->A->real) n0 x + eps0 * indicator_fn (H:A->bool) x` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* E_s[eps0*1_H] = eps0*prob(H) *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. eps0 * indicator_fn (H:A->bool) x) = eps0 * prob p H` + ASSUME_TAC THENL + [SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. eps0 * indicator_fn (H:A->bool) x) = + eps0 * simple_expectation p (indicator_fn H)` SUBST1_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `indicator_fn (H:A->bool)`] + SIMPLE_EXPECTATION_CMUL) THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + AP_TERM_TAC THEN ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR]]; + ALL_TAC] THEN + (* E_s[hn n0 + eps0*1_H] = E_s[hn n0] + eps0*prob(H) *) + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (hn:num->A->real) n0 x + eps0 * indicator_fn H x) = + simple_expectation p (hn n0) + simple_expectation p + (\x:A. eps0 * indicator_fn H x)` MP_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `(hn:num->A->real) n0`] + SIMPLE_EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_CMUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ASM_REWRITE_TAC[] THEN DISCH_TAC] THEN + ASM_MESON_TAC[]; ALL_TAC] THEN - (* Case k*k < n *) - SUBGOAL_THEN `k * k < n:num` ASSUME_TAC THENL + (* Contradiction: eps0*prob(H) > 0 but < inv(SUC n) for all n *) + SUBGOAL_THEN `&0 < eps0 * prob (p:A prob_space) H` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(ISPEC `eps0 * prob (p:A prob_space) H` REAL_ARCH_INV) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + MP_TAC(SPEC `N - 1` + (ASSUME `!(n:num). simple_expectation (p:A prob_space) (hn n) + + eps0 * prob p H <= M`)) THEN + MP_TAC(SPEC `N - 1` + (ASSUME `!(n:num). M - inv (&(SUC n)) < + simple_expectation (p:A prob_space) (gn n)`)) THEN + MP_TAC(SPEC `N - 1` + (ASSUME `!(n:num). simple_expectation (p:A prob_space) (gn n) <= + simple_expectation p (hn n)`)) THEN + SUBGOAL_THEN `SUC (N - 1) = N` SUBST1_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN - (* Split the sum: sum(0..n) = sum(0..k*k) + sum(k*k+1..n) *) + UNDISCH_TAC `inv (&N) < eps0 * prob (p:A prob_space) H` THEN + REAL_ARITH_TAC);; + +(* General Radon-Nikodym theorem *) +let RADON_NIKODYM = prove + (`!p:A prob_space mu. + absolutely_continuous p mu + ==> ?f. integrable p f /\ + (!A. A IN prob_events p + ==> expectation p (\x. f x * indicator_fn A x) = mu A)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `signed_measure (p:A prob_space) mu` ASSUME_TAC THENL + [ASM_MESON_TAC[absolutely_continuous]; ALL_TAC] THEN + (* Jordan parts are absolutely continuous and nonneg *) SUBGOAL_THEN - `sum(0..n) (\i. (X:num->A->real) i x) = - sum(0..k * k) (\i. X i x) + sum(k * k + 1..n) (\i. X i x)` - ASSUME_TAC THENL - [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_ARITH_TAC; ALL_TAC] THEN - (* Centering identity: inv(SUC n) * S_n - mu = inv(SUC n) * sum(centered) *) + `absolutely_continuous (p:A prob_space) (jordan_pos p mu) /\ + (!A. A IN prob_events p ==> &0 <= jordan_pos p mu A)` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC JORDAN_POS_ABSOLUTELY_CONTINUOUS THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC JORDAN_POS_NONNEG THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN SUBGOAL_THEN - `inv(&(SUC n)) * sum(0..n) (\i. (X:num->A->real) i x) - mu = - inv(&(SUC n)) * sum(0..n) (\i. X i x - mu)` - SUBST1_TAC THENL - [REWRITE_TAC[SUM_SUB_NUMSEG; SUM_CONST_NUMSEG; SUB_0] THEN - SUBGOAL_THEN `&(SUC n) = &(n + 1)` (fun th -> REWRITE_TAC[GSYM th]) THENL - [REWRITE_TAC[REAL_OF_NUM_EQ; ADD1]; ALL_TAC] THEN - SUBGOAL_THEN `~(&(SUC n) = &0)` ASSUME_TAC THENL - [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN - UNDISCH_TAC `~(&(SUC n) = &0)` THEN CONV_TAC REAL_FIELD; + `absolutely_continuous (p:A prob_space) (jordan_neg p mu) /\ + (!A. A IN prob_events p ==> &0 <= jordan_neg p mu A)` + STRIP_ASSUME_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC JORDAN_NEG_ABSOLUTELY_CONTINUOUS THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN MATCH_MP_TAC JORDAN_NEG_NONNEG THEN + ASM_REWRITE_TAC[]]; ALL_TAC] THEN - (* Split the centered sum *) + (* Apply Radon-Nikodym for nonneg case to each Jordan part *) SUBGOAL_THEN - `sum(0..n) (\i. (X:num->A->real) i x - mu) = - sum(0..k * k) (\i. X i x - mu) + sum(k * k + 1..n) (\i. X i x - mu)` - SUBST1_TAC THENL - [MATCH_MP_TAC(GSYM SUM_COMBINE_R) THEN ASM_ARITH_TAC; ALL_TAC] THEN - (* Get the gap bound *) + `?f_pos. integrable (p:A prob_space) f_pos /\ + (!x. x IN prob_carrier p ==> &0 <= f_pos x) /\ + (!A. A IN prob_events p + ==> expectation p (\x. f_pos x * indicator_fn A x) = + jordan_pos p mu A)` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC RADON_NIKODYM_NONNEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN SUBGOAL_THEN - `abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu)) < &(SUC(k * k)) * inv(&(SUC m))` - ASSUME_TAC THENL - [FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o - check (fun th -> free_in `K_gap:num` (concl th))) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN - DISCH_THEN(MP_TAC o SPEC `n:num`) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]; + `?f_neg. integrable (p:A prob_space) f_neg /\ + (!x. x IN prob_carrier p ==> &0 <= f_neg x) /\ + (!A. A IN prob_events p + ==> expectation p (\x. f_neg x * indicator_fn A x) = + jordan_neg p mu A)` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC RADON_NIKODYM_NONNEG THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Witness: f = f_pos - f_neg *) + EXISTS_TAC `\x:A. (f_pos:A->real) x - f_neg x` THEN + BETA_TAC THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - (* Get the centered subsequence bound *) + X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN SUBGOAL_THEN - `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu)) < e / &2` - ASSUME_TAC THENL - [SUBGOAL_THEN `inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu) = - inv(&(SUC(k * k))) * sum(0..k * k) (\i. X i x) - mu` SUBST1_TAC THENL - [REWRITE_TAC[SUM_SUB_NUMSEG; SUM_CONST_NUMSEG; SUB_0] THEN - SUBGOAL_THEN `&(SUC(k * k)) = &(k * k + 1)` (fun th -> REWRITE_TAC[GSYM th]) THENL - [REWRITE_TAC[REAL_OF_NUM_EQ; ADD1]; ALL_TAC] THEN - SUBGOAL_THEN `~(&(SUC(k * k)) = &0)` ASSUME_TAC THENL - [REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; ALL_TAC] THEN - UNDISCH_TAC `~(&(SUC(k * k)) = &0)` THEN CONV_TAC REAL_FIELD; - FIRST_X_ASSUM(MP_TAC o SPEC `k:num` o - check (fun th -> free_in `K_subseq:num` (concl th))) THEN - ANTS_TAC THENL [ASM_ARITH_TAC; DISCH_THEN ACCEPT_TAC]]; + `(\x:A. (f_pos x - f_neg x) * indicator_fn A x) = + (\x. f_pos x * indicator_fn A x - f_neg x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN - (* Triangle inequality *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `abs(inv(&(SUC n)) * sum(0..k * k) (\i. (X:num->A->real) i x - mu)) + - abs(inv(&(SUC n)) * sum(k * k + 1..n) (\i. X i x - mu))` THEN - CONJ_TAC THENL - [REWRITE_TAC[REAL_ABS_MUL; GSYM REAL_ADD_LDISTRIB] THEN - REWRITE_TAC[REAL_ABS_ABS] THEN - MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [REWRITE_TAC[REAL_ABS_POS]; REWRITE_TAC[REAL_ABS_TRIANGLE]]; + W(MP_TAC o PART_MATCH (lhand o rand) EXPECTATION_SUB o lhand o snd) THEN + ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN - MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `e / &2 + e / &2` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LT_ADD2; - ASM_REAL_ARITH_TAC] THEN - CONJ_TAC THENL - [(* First term: |inv(SUC n) * sum(0..k*k)(centered)| < e/2 *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `abs(inv(&(SUC(k * k))) * sum(0..k * k) (\i. (X:num->A->real) i x - mu))` THEN - ASM_REWRITE_TAC[] THEN - REWRITE_TAC[REAL_ABS_MUL] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN - REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN - MATCH_MP_TAC REAL_LE_INV2 THEN - REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; - (* Second term: |inv(SUC n) * gap| < e/2 *) - MATCH_MP_TAC REAL_LET_TRANS THEN - EXISTS_TAC `inv(&(SUC(k * k))) * abs(sum(k * k + 1..n) (\i. (X:num->A->real) i x - mu))` THEN - CONJ_TAC THENL - [REWRITE_TAC[REAL_ABS_MUL] THEN - MATCH_MP_TAC REAL_LE_RMUL THEN REWRITE_TAC[REAL_ABS_POS] THEN - REWRITE_TAC[REAL_ABS_INV; REAL_ABS_NUM] THEN - MATCH_MP_TAC REAL_LE_INV2 THEN - REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN ASM_ARITH_TAC; - ALL_TAC] THEN - MATCH_MP_TAC REAL_LET_TRANS THEN EXISTS_TAC `inv(&(SUC m))` THEN - ASM_REWRITE_TAC[] THEN - MATCH_MP_TAC REAL_LE_TRANS THEN - EXISTS_TAC `inv(&(SUC(k * k))) * (&(SUC(k * k)) * inv(&(SUC m)))` THEN - CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL - [MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]; - MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; - REWRITE_TAC[REAL_MUL_ASSOC] THEN - SUBGOAL_THEN `inv(&(SUC(k * k))) * &(SUC(k * k)) = &1` SUBST1_TAC THENL - [MATCH_MP_TAC REAL_MUL_LINV THEN REWRITE_TAC[REAL_OF_NUM_EQ] THEN ARITH_TAC; - REWRITE_TAC[REAL_MUL_LID; REAL_LE_REFL]]]]);; + DISCH_THEN SUBST1_TAC THEN + ASM_SIMP_TAC[] THEN + MATCH_MP_TAC(GSYM JORDAN_DECOMPOSITION) THEN + ASM_REWRITE_TAC[]);; diff --git a/Probability/make.ml b/Probability/make.ml index 79949644..f618bfa4 100644 --- a/Probability/make.ml +++ b/Probability/make.ml @@ -30,3 +30,6 @@ loadt "Probability/characteristic_functions.ml";; (* Central Limit Theorem for integrable RVs *) loadt "Probability/clt.ml";; + +(* Standard discrete distributions *) +loadt "Probability/distributions.ml";; diff --git a/Probability/martingale_convergence.ml b/Probability/martingale_convergence.ml index 5e9b7470..d9f8140d 100644 --- a/Probability/martingale_convergence.ml +++ b/Probability/martingale_convergence.ml @@ -1,10 +1,11 @@ (* ========================================================================= *) -(* Martingale convergence: upcrossing inequality, convergence theorem, *) -(* sigma-atoms, and conditional expectation. *) +(* Martingale convergence, conditional expectation, and Doob decomposition. *) (* *) -(* Follows Williams "Probability with Martingales" Chapters 11-12. *) -(* Includes Doob's upcrossing inequality, martingale convergence theorem, *) -(* sigma-atom decomposition, and simple conditional expectation. *) +(* Part 1: Upcrossing inequality, simple martingale convergence, *) +(* sigma-atom decomposition, simple conditional expectation. *) +(* Part 2: General conditional expectation via Radon-Nikodym, *) +(* submartingale convergence, optional stopping for UI martingales, *) +(* general Doob decomposition. *) (* ========================================================================= *) needs "Probability/martingales.ml";; @@ -56,6 +57,24 @@ let upcrossing_count = define upcrossing_count f a b k + (if upcrossing_phase f a b k = 1 /\ f (SUC k) >= b then 1 else 0))`;; +(* Downcrossing phase: dual of upcrossing phase. + Phase 1 = above b (waiting to drop to a), Phase 0 = below b (waiting to rise to b). + A downcrossing completes when f goes from >= b down to <= a. *) +let downcrossing_phase = define + `(downcrossing_phase (f:num->real) a b 0 = (if f 0 >= b then 1 else 0)) /\ + (downcrossing_phase f a b (SUC k) = + if downcrossing_phase f a b k = 0 then + (if f (SUC k) >= b then 1 else 0) + else + (if f (SUC k) <= a then 0 else 1))`;; + +(* Downcrossing count: number of completed downcrossings of [a,b] *) +let downcrossing_count = define + `(downcrossing_count (f:num->real) a b 0 = 0) /\ + (downcrossing_count f a b (SUC k) = + downcrossing_count f a b k + + (if downcrossing_phase f a b k = 1 /\ f (SUC k) <= a then 1 else 0))`;; + (* Number of upcrossings of [a,b] by X_0(x), ..., X_n(x) *) let num_upcrossings = new_definition `num_upcrossings (X:num->A->real) a b n (x:A) = @@ -323,18 +342,18 @@ let SIMPLE_RV_POS_PART_SUB = prove REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_RV_POS_PART THEN MATCH_MP_TAC SIMPLE_RV_SUB THEN ASM_SIMP_TAC[SIMPLE_RV_CONST]);; -(* Helper: submartingale property extends to (X - a) * indicator *) -let SUBMARTINGALE_SUB_CONST_STEP = prove +(* Helper: simple_submartingale property extends to (X - a) * indicator *) +let SIMPLE_SUBMARTINGALE_SUB_CONST_STEP = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (c:real). - submartingale p FF X ==> + simple_submartingale p FF X ==> !(n:num) (s:A->bool). s IN FF n ==> simple_expectation p (\x. (X n x - c) * indicator_fn s x) <= simple_expectation p (\x. (X (SUC n) x - c) * indicator_fn s x)`, REPEAT GEN_TAC THEN DISCH_TAC THEN REPEAT GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN `!k. simple_rv (p:A prob_space) ((X:num->A->real) k)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `(s:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. ((X:num->A->real) n x - c) * indicator_fn (s:A->bool) x) = @@ -385,7 +404,7 @@ let SUBMARTINGALE_SUB_CONST_STEP = prove SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. (X:num->A->real) n x * indicator_fn (s:A->bool) x) <= simple_expectation p (\x. X (SUC n) x * indicator_fn s x)` MP_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN REAL_ARITH_TAC);; (* pos_part(y - a) = (y - a) * indicator of {y >= a} *) @@ -398,18 +417,18 @@ let POS_PART_INDICATOR_FORM = prove MATCH_MP_TAC POS_PART_NEG THEN ASM_REAL_ARITH_TAC]);; (* Submartingale pos_part step: the key conditional expectation inequality *) -let SUBMARTINGALE_POS_PART_STEP = prove +let SIMPLE_SUBMARTINGALE_POS_PART_STEP = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) (a:real). - submartingale p FF X ==> + simple_submartingale p FF X ==> !(n:num) (s:A->bool). s IN FF n ==> simple_expectation p (\x. pos_part (X n x - a) * indicator_fn s x) <= simple_expectation p (\x. pos_part (X (SUC n) x - a) * indicator_fn s x)`, REPEAT GEN_TAC THEN DISCH_TAC THEN REPEAT GEN_TAC THEN DISCH_TAC THEN - (* Extract key facts from submartingale *) + (* Extract key facts from simple_submartingale *) SUBGOAL_THEN `!k. simple_rv (p:A prob_space) ((X:num->A->real) k)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL [ASM_MESON_TAC[filtration]; ALL_TAC] THEN SUBGOAL_THEN `sigma_algebra ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL @@ -419,7 +438,7 @@ let SUBMARTINGALE_POS_PART_STEP = prove (* X n is FF n-measurable *) SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) (X n)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted; adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted; adapted]; ALL_TAC] THEN (* Step 7: {X n >= a} IN FF n *) SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (X:num->A->real) n x >= a} IN @@ -483,10 +502,10 @@ let SUBMARTINGALE_POS_PART_STEP = prove (\x. ((X:num->A->real) (SUC n) x - a) * indicator_fn (s_plus:A->bool) x)` THEN CONJ_TAC THENL - [(* Left: SUBMARTINGALE_SUB_CONST_STEP *) + [(* Left: SIMPLE_SUBMARTINGALE_SUB_CONST_STEP *) MP_TAC(SPECL [`a:real`; `n:num`; `s_plus:A->bool`] - (MATCH_MP SUBMARTINGALE_SUB_CONST_STEP - (ASSUME `submartingale (p:A prob_space) + (MATCH_MP SIMPLE_SUBMARTINGALE_SUB_CONST_STEP + (ASSUME `simple_submartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)`))) THEN ASM_REWRITE_TAC[]; (* Right: pointwise (X(n+1)-a)*1_{s+} <= pos_part(X(n+1)-a)*1_s *) @@ -719,19 +738,19 @@ let SIMPLE_RV_NOT_BET_INDICATOR = prove (* Combined: simple_rv and nonneg expectation for not_bet_gain of pos_part *) let NOT_BET_GAIN_POS_PART_NONNEG = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b. - submartingale p FF X /\ a < b ==> + simple_submartingale p FF X /\ a < b ==> !n. simple_rv p (\x. not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n) /\ &0 <= simple_expectation p (\x. not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n)`, REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted; adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted; adapted]; ALL_TAC] THEN SUBGOAL_THEN `!k. simple_rv (p:A prob_space) ((X:num->A->real) k)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN INDUCT_TAC THENL [(* Base case: not_bet_gain ... 0 = &0 *) SUBGOAL_THEN `(\x:A. not_bet_gain (\k. pos_part((X:num->A->real) k x - a)) @@ -970,7 +989,7 @@ let NOT_BET_GAIN_POS_PART_NONNEG = prove REWRITE_TAC[REAL_SUB_LE] THEN MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `a:real`] - SUBMARTINGALE_POS_PART_STEP) THEN + SIMPLE_SUBMARTINGALE_POS_PART_STEP) THEN ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPECL [`n:num`; @@ -1094,20 +1113,20 @@ let UPCROSSING_POINTWISE_SUM_BOUND = prove REWRITE_TAC[num_upcrossings] THEN REAL_ARITH_TAC);; (* Doob's Upcrossing Inequality *) -let DOOB_UPCROSSING_INEQUALITY = prove +let SIMPLE_DOOB_UPCROSSING_INEQUALITY = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n. - submartingale p FF X /\ a < b ==> + simple_submartingale p FF X /\ a < b ==> (b - a) * simple_expectation p (\x. &(num_upcrossings X a b n x)) <= simple_expectation p (\x. pos_part(X n x - a))`, REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Extract submartingale components *) + (* Extract simple_submartingale components *) SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN (* simple_rv of key terms *) SUBGOAL_THEN `simple_rv p (\x:A. &(num_upcrossings (X:num->A->real) a b n x))` ASSUME_TAC THENL @@ -1197,21 +1216,21 @@ let POS_PART_BOUND = prove REPEAT STRIP_TAC THEN REWRITE_TAC[pos_part; real_max] THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC);; -(* Expected upcrossings bounded for bounded submartingale *) -let UPCROSSING_EXPECTATION_BOUND = prove +(* Expected upcrossings bounded for bounded simple_submartingale *) +let SIMPLE_UPCROSSING_EXPECTATION_BOUND = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n M. - submartingale p FF X /\ a < b /\ + simple_submartingale p FF X /\ a < b /\ (!m x. x IN prob_carrier p ==> abs(X m x) <= M) ==> (b - a) * simple_expectation p (\x. &(num_upcrossings X a b n x)) <= M + abs(a)`, REPEAT STRIP_TAC THEN MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `a:real`; `b:real`; `n:num`] - DOOB_UPCROSSING_INEQUALITY) THEN + SIMPLE_DOOB_UPCROSSING_INEQUALITY) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. pos_part((X:num->A->real) n x - a)) <= M + abs(a)` ASSUME_TAC THENL @@ -1238,7 +1257,7 @@ let NUM_UPCROSSINGS_MONO = prove MATCH_MP_TAC UPCROSSING_COUNT_INCREASING THEN ASM_REWRITE_TAC[]);; (* The set {x | num_upcrossings >= k} is an event *) -let NUM_UPCROSSINGS_GE_EVENT = prove +let SIMPLE_NUM_UPCROSSINGS_GE_EVENT = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n k. filtration p FF /\ adapted p FF X /\ (!m. simple_rv p (X m)) ==> {x | x IN prob_carrier p /\ @@ -1258,9 +1277,9 @@ let NUM_UPCROSSINGS_GE_EVENT = prove ASM_MESON_TAC[simple_rv]);; (* Key MCT lemma: P(U_n >= k) <= (M + |a|) / ((b-a)*k) *) -let UPCROSSING_PROB_BOUND = prove +let SIMPLE_UPCROSSING_PROB_BOUND = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n M k. - submartingale p FF X /\ a < b /\ + simple_submartingale p FF X /\ a < b /\ (!m x. x IN prob_carrier p ==> abs(X m x) <= M) /\ 0 < k ==> prob p {x | x IN prob_carrier p /\ @@ -1268,12 +1287,12 @@ let UPCROSSING_PROB_BOUND = prove <= (M + abs(a)) / ((b - a) * &k)`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN SUBGOAL_THEN `simple_rv p (\x:A. &(num_upcrossings (X:num->A->real) a b n x))` ASSUME_TAC THENL [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; @@ -1304,7 +1323,7 @@ let UPCROSSING_PROB_BOUND = prove ASSUME_TAC THENL [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `a:real`; `b:real`; `n:num`; `M:real`] - UPCROSSING_EXPECTATION_BOUND) THEN + SIMPLE_UPCROSSING_EXPECTATION_BOUND) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; REAL_ARITH_TAC]; ALL_TAC] THEN (* E[U] <= (M + |a|) / (b-a) *) @@ -1346,9 +1365,9 @@ let PROB_UNIONS_INCREASING_BOUND = prove EXISTS_TAC `0` THEN ASM_SIMP_TAC[]);; (* Key lemma: infinite upcrossings have probability zero *) -let INFINITE_UPCROSSINGS_NULL = prove +let SIMPLE_INFINITE_UPCROSSINGS_NULL = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b M. - submartingale p FF X /\ a < b /\ + simple_submartingale p FF X /\ a < b /\ (!m x. x IN prob_carrier p ==> abs(X m x) <= M) ==> !k. 0 < k ==> prob p (UNIONS { @@ -1357,14 +1376,14 @@ let INFINITE_UPCROSSINGS_NULL = prove REPEAT STRIP_TAC THEN MATCH_MP_TAC PROB_UNIONS_INCREASING_BOUND THEN SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN REPEAT CONJ_TAC THENL [(* A n IN events *) - GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; (* A n SUBSET A (SUC n) *) X_GEN_TAC `nn:num` THEN REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge; @@ -1376,7 +1395,7 @@ let INFINITE_UPCROSSINGS_NULL = prove X_GEN_TAC `m:num` THEN MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `a:real`; `b:real`; `m:num`; - `M:real`; `k:num`] UPCROSSING_PROB_BOUND) THEN + `M:real`; `k:num`] SIMPLE_UPCROSSING_PROB_BOUND) THEN DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; @@ -1408,20 +1427,20 @@ let REAL_EQ_0_FROM_INV_BOUND = prove ARITH_RULE `~(n = 0) ==> 0 < n`] THEN REAL_ARITH_TAC);; -(* Finite upcrossings a.s. for bounded submartingale, fixed a < b *) -let FINITE_UPCROSSINGS_AS = prove +(* Finite upcrossings a.s. for bounded simple_submartingale, fixed a < b *) +let SIMPLE_FINITE_UPCROSSINGS_AS = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b M. - submartingale p FF X /\ a < b /\ + simple_submartingale p FF X /\ a < b /\ (!m x. x IN prob_carrier p ==> abs(X m x) <= M) ==> almost_surely p {x | ?B:num. !n. num_upcrossings X a b n x <= B}`, REPEAT STRIP_TAC THEN REWRITE_TAC[almost_surely] THEN SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN (* Take N = INTERS of UNIONS over n of {U_n >= SUC k} *) EXISTS_TAC `INTERS {UNIONS { @@ -1434,7 +1453,7 @@ let FINITE_UPCROSSINGS_AS = prove [(* In events: countable intersection of countable unions of events *) MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN - GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; (* P = 0 *) MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN @@ -1442,7 +1461,7 @@ let FINITE_UPCROSSINGS_AS = prove [MATCH_MP_TAC PROB_POSITIVE THEN MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN - GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; (* P(N) <= C/SUC k for all k *) X_GEN_TAC `j:num` THEN @@ -1456,10 +1475,10 @@ let FINITE_UPCROSSINGS_AS = prove MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN - GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN - GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; SET_TAC[]]; (* P(UNIONS) <= C / SUC j *) @@ -1469,7 +1488,7 @@ let FINITE_UPCROSSINGS_AS = prove [REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC]; ALL_TAC] THEN MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `a:real`; `b:real`; `M:real`] - INFINITE_UPCROSSINGS_NULL) THEN + SIMPLE_INFINITE_UPCROSSINGS_NULL) THEN ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN REWRITE_TAC[LT_0]]]]; @@ -1792,8 +1811,10 @@ let BOUNDED_FINITE_UPCROSSINGS_IMP_CONVERGENT = prove DISCH_THEN(X_CHOOSE_THEN `n:num` MP_TAC) THEN FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN ARITH_TAC);; +(* ALMOST_SURELY_COUNTABLE_INTER: defined in expectation.ml *) + (* ========================================================================= *) -(* MARTINGALE CONVERGENCE THEOREM (bounded submartingale version) *) +(* SIMPLE_MARTINGALE CONVERGENCE THEOREM (bounded simple_submartingale version) *) (* ========================================================================= *) (* Rational numbers can be enumerated *) @@ -1812,10 +1833,10 @@ let ALMOST_SURELY_UNIV = prove REWRITE_TAC[NULL_EVENT_EMPTY] THEN SET_TAC[]);; -(* Main theorem: bounded submartingale converges almost surely *) -let MARTINGALE_CONVERGENCE_BOUNDED = prove +(* Main theorem: bounded simple_submartingale converges almost surely *) +let SIMPLE_MARTINGALE_CONVERGENCE_BOUNDED = prove (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) M. - submartingale p FF X /\ + simple_submartingale p FF X /\ (!m x. x IN prob_carrier p ==> abs(X m x) <= M) ==> almost_surely p {x | ?L. ((\n. X n x) ---> L) sequentially}`, @@ -1831,12 +1852,12 @@ let MARTINGALE_CONVERGENCE_BOUNDED = prove ASSUME_TAC THENL [X_GEN_TAC `k:num` THEN ASM_CASES_TAC `(g:num->real)(NUMFST k) < g(NUMSND k)` THENL - [(* Case a < b: use FINITE_UPCROSSINGS_AS + ALMOST_SURELY_SUBSET *) + [(* Case a < b: use SIMPLE_FINITE_UPCROSSINGS_AS + ALMOST_SURELY_SUBSET *) MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN EXISTS_TAC `{x:A | ?B. !n. num_upcrossings (X:num->A->real) ((g:num->real)(NUMFST k)) (g(NUMSND k)) n x <= B}` THEN CONJ_TAC THENL - [MATCH_MP_TAC FINITE_UPCROSSINGS_AS THEN + [MATCH_MP_TAC SIMPLE_FINITE_UPCROSSINGS_AS THEN MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `M:real`] THEN ASM_REWRITE_TAC[]; @@ -2059,7 +2080,7 @@ let SIMPLE_COND_EXP_CONSTANT_ON_ATOM = prove MATCH_MP_TAC SIGMA_ATOM_SAME THEN ASM_REWRITE_TAC[]);; (* E[X * 1_A] = 0 when P(A) = 0 *) -let EXPECTATION_MUL_INDICATOR_ZERO_PROB = prove +let SIMPLE_EXPECTATION_MUL_INDICATOR_ZERO_PROB = prove (`!p:A prob_space (X:A->real) (S:A->bool). simple_rv p X /\ S IN prob_events p /\ prob p S = &0 ==> simple_expectation p (\x. X x * indicator_fn S x) = &0`, @@ -2226,10 +2247,10 @@ let SIMPLE_COND_EXP_ATOM_COND = prove ALL_TAC] THEN (* Now show both sides equal 0 *) MP_TAC(ISPECL [`p:A prob_space`; `simple_cond_exp p G (X:A->real)`; - `sigma_atom G (x:A)`] EXPECTATION_MUL_INDICATOR_ZERO_PROB) THEN + `sigma_atom G (x:A)`] SIMPLE_EXPECTATION_MUL_INDICATOR_ZERO_PROB) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `X:A->real`; - `sigma_atom G (x:A)`] EXPECTATION_MUL_INDICATOR_ZERO_PROB) THEN + `sigma_atom G (x:A)`] SIMPLE_EXPECTATION_MUL_INDICATOR_ZERO_PROB) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; (* Case: P(atom) > 0 *) @@ -2605,8 +2626,8301 @@ let MEASURABLE_WRT_CONSTANT_ON_ATOM = prove SIMP_TAC[]]]);; +(* ========================================================================= *) +(* CONDITIONAL EXPECTATION FOR FINITE SUB-SIGMA-ALGEBRAS *) +(* ========================================================================= *) + +(* Like simple_cond_exp but uses expectation (not simple_expectation), + so it works for integrable (not just simple) random variables. *) +let cond_exp = new_definition + `cond_exp (p:A prob_space) (G:(A->bool)->bool) (X:A->real) (x:A) = + if prob p (sigma_atom G x) = &0 then &0 + else expectation p (\y. X y * indicator_fn (sigma_atom G x) y) / + prob p (sigma_atom G x)`;; + +(* General conditional expectation is constant on atoms *) +let COND_EXP_CONSTANT_ON_ATOM = prove + (`!p:A prob_space G (X:A->real) (x:A) (y:A). + sigma_algebra G /\ x IN UNIONS G /\ y IN sigma_atom G x + ==> cond_exp p G X y = cond_exp p G X x`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[cond_exp] THEN + SUBGOAL_THEN `sigma_atom G (y:A) = sigma_atom G (x:A)` + (fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC SIGMA_ATOM_SAME THEN ASM_REWRITE_TAC[]);; + +(* The range of cond_exp is finite on the carrier *) +let COND_EXP_RANGE_FINITE = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ FINITE G + ==> FINITE {cond_exp p G X x | x | x IN prob_carrier p}`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (\(a:A->bool). + if prob (p:A prob_space) a = &0 then &0 + else expectation p (\y. (X:A->real) y * indicator_fn a y) / + prob p a) {sigma_atom G (x:A) | x | x IN UNIONS G}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_IMAGE THEN MATCH_MP_TAC FINITE_SIGMA_ATOMS THEN + ASM_MESON_TAC[sub_sigma_algebra]; + ALL_TAC] THEN + REWRITE_TAC[SUBSET; IN_IMAGE; IN_ELIM_THM] THEN + X_GEN_TAC `v:real` THEN + DISCH_THEN(X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `sigma_atom G (w:A)` THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[cond_exp]; ALL_TAC] THEN + EXISTS_TAC `w:A` THEN ASM_MESON_TAC[]);; + +(* cond_exp is G-measurable *) +let COND_EXP_MEASURABLE_WRT = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ FINITE G + ==> measurable_wrt p G (cond_exp p G X)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + REWRITE_TAC[measurable_wrt] THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ cond_exp p G (X:A->real) x <= v} = + UNIONS {sigma_atom G (x:A) | x | + x IN prob_carrier p /\ cond_exp p G X x <= v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNIONS; IN_ELIM_THM] THEN + X_GEN_TAC `z:A` THEN EQ_TAC THENL + [STRIP_TAC THEN EXISTS_TAC `sigma_atom G (z:A)` THEN + CONJ_TAC THENL + [EXISTS_TAC `z:A` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIGMA_ATOM_CONTAINS THEN ASM_MESON_TAC[]]; + DISCH_THEN(X_CHOOSE_THEN `t:A->bool` + (CONJUNCTS_THEN2 (X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) + ASSUME_TAC)) THEN + CONJ_TAC THENL + [SUBGOAL_THEN `sigma_atom G (w:A) SUBSET UNIONS G` MP_TAC THENL + [MATCH_MP_TAC SIGMA_ATOM_SUBSET_CARRIER THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + ASM_MESON_TAC[SUBSET]]; + SUBGOAL_THEN `cond_exp p G (X:A->real) z = + cond_exp p G X w` SUBST1_TAC THENL + [MATCH_MP_TAC COND_EXP_CONSTANT_ON_ATOM THEN + ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]]]; + ALL_TAC] THEN + MATCH_MP_TAC SIGMA_ALGEBRA_UNIONS_FINITE THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `t:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIGMA_ATOM_IN_G THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `{sigma_atom G (x:A) | x | x IN UNIONS G}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_SIGMA_ATOMS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN ASM_MESON_TAC[]]]);; + +(* cond_exp is a simple random variable *) +let COND_EXP_SIMPLE_RV = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ FINITE G + ==> simple_rv p (cond_exp p G X)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_rv] THEN CONJ_TAC THENL + [MATCH_MP_TAC MEASURABLE_WRT_IMP_RV THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC COND_EXP_RANGE_FINITE THEN ASM_REWRITE_TAC[]]);; + +(* cond_exp is integrable *) +let COND_EXP_INTEGRABLE = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ FINITE G + ==> integrable p (cond_exp p G X)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN + MATCH_MP_TAC COND_EXP_SIMPLE_RV THEN ASM_REWRITE_TAC[]);; + +(* E[X * 1_S] = 0 when P(S) = 0 and X is integrable *) +let EXPECTATION_MUL_INDICATOR_ZERO_PROB = prove + (`!p:A prob_space (X:A->real) (S:A->bool). + integrable p X /\ S IN prob_events p /\ prob p S = &0 + ==> expectation p (\x. X x * indicator_fn S x) = &0`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN ASM_REWRITE_TAC[]);; + +(* Conditioning property for individual atoms *) +let COND_EXP_ATOM_COND = prove + (`!p:A prob_space G (X:A->real) (x:A). + sub_sigma_algebra p G /\ FINITE G /\ integrable p X /\ + x IN prob_carrier p + ==> expectation p + (\y. cond_exp p G X y * + indicator_fn (sigma_atom G x) y) = + expectation p + (\y. X y * indicator_fn (sigma_atom G x) y)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `(x:A) IN UNIONS G` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom G (x:A) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[SIGMA_ATOM_IN_G; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + ASM_CASES_TAC `prob p (sigma_atom G (x:A)) = &0` THENL + [(* Case: P(atom) = 0 -- both sides are 0 *) + SUBGOAL_THEN `simple_rv p (cond_exp p G (X:A->real))` ASSUME_TAC THENL + [MATCH_MP_TAC COND_EXP_SIMPLE_RV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `a = &0 /\ b = &0 ==> a = b`) THEN CONJ_TAC THENL + [SUBGOAL_THEN `expectation p (\y:A. cond_exp p G (X:A->real) y * + indicator_fn (sigma_atom G x) y) = + simple_expectation p (\y. cond_exp p G X y * + indicator_fn (sigma_atom G x) y)` SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[ETA_AX]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC SIMPLE_EXPECTATION_MUL_INDICATOR_ZERO_PROB THEN + ASM_REWRITE_TAC[ETA_AX]]; + MATCH_MP_TAC EXPECTATION_MUL_INDICATOR_ZERO_PROB THEN + ASM_REWRITE_TAC[]]; + (* Case: P(atom) > 0 *) + ABBREV_TAC `c = cond_exp p G (X:A->real) x` THEN + (* LHS: cond_exp is constant c on atom *) + SUBGOAL_THEN + `expectation p (\y:A. cond_exp p G (X:A->real) y * + indicator_fn (sigma_atom G x) y) = + c * prob p (sigma_atom G x)` SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation p (\y:A. cond_exp p G (X:A->real) y * + indicator_fn (sigma_atom G x) y) = + expectation p (\y. c * indicator_fn (sigma_atom G x) y)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `z:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RZERO] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + EXPAND_TAC "c" THEN + MATCH_MP_TAC COND_EXP_CONSTANT_ON_ATOM THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (sigma_atom G (x:A))`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + AP_TERM_TAC THEN + MATCH_MP_TAC EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* c = E[X * 1_atom] / P(atom), so c * P(atom) = E[X * 1_atom] *) + EXPAND_TAC "c" THEN REWRITE_TAC[cond_exp] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_DIV_RMUL THEN ASM_REWRITE_TAC[]]);; + +(* Conditioning property extended to arbitrary G-sets *) +let COND_EXP_CONDITIONING = prove + (`!p:A prob_space G (X:A->real) (a:A->bool). + sub_sigma_algebra p G /\ FINITE G /\ integrable p X /\ a IN G + ==> expectation p + (\x. cond_exp p G X x * indicator_fn a x) = + expectation p (\x. X x * indicator_fn a x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p (cond_exp p G (X:A->real))` ASSUME_TAC THENL + [MATCH_MP_TAC COND_EXP_SIMPLE_RV THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + (* Decompose a into atoms *) + ABBREV_TAC + `atoms = {sigma_atom G (x:A) | x | x IN prob_carrier (p:A prob_space)}` THEN + ABBREV_TAC + `atoms_a = {(A:A->bool) | A IN atoms /\ A SUBSET a}` THEN + SUBGOAL_THEN `FINITE (atoms:((A->bool)->bool))` ASSUME_TAC THENL + [EXPAND_TAC "atoms" THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) = UNIONS G` SUBST1_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC FINITE_SIGMA_ATOMS THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `FINITE (atoms_a:((A->bool)->bool))` ASSUME_TAC THENL + [EXPAND_TAC "atoms_a" THEN MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `atoms:((A->bool)->bool)` THEN + ASM_REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!A1 A2:A->bool. A1 IN atoms_a /\ A2 IN atoms_a /\ ~(A1 = A2) + ==> DISJOINT A1 A2` (LABEL_TAC "pd") THENL + [EXPAND_TAC "atoms_a" THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT GEN_TAC THEN DISCH_TAC THEN + ASM_MESON_TAC[SIGMA_ATOM_EQUAL_OR_DISJOINT]; + ALL_TAC] THEN + SUBGOAL_THEN `!A:A->bool. A IN atoms_a ==> A IN prob_events p` + (LABEL_TAC "ev") THENL + [EXPAND_TAC "atoms_a" THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[SIGMA_ATOM_IN_G; sub_sigma_algebra; SUBSET]; + ALL_TAC] THEN + SUBGOAL_THEN `!A:A->bool. A IN atoms_a ==> A IN G` + (LABEL_TAC "in_G") THENL + [EXPAND_TAC "atoms_a" THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIGMA_ATOM_IN_G THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!B:A->bool. B IN atoms_a + ==> ?w:A. w IN prob_carrier p /\ sigma_atom G w = B` + (LABEL_TAC "is_atom") THENL + [EXPAND_TAC "atoms_a" THEN EXPAND_TAC "atoms" THEN + REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + (* a = UNIONS atoms_a *) + SUBGOAL_THEN `(a:A->bool) = UNIONS atoms_a` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNIONS] THEN X_GEN_TAC `z:A` THEN EQ_TAC THENL + [DISCH_TAC THEN EXISTS_TAC `sigma_atom G (z:A)` THEN CONJ_TAC THENL + [EXPAND_TAC "atoms_a" THEN REWRITE_TAC[IN_ELIM_THM] THEN CONJ_TAC THENL + [EXPAND_TAC "atoms" THEN REWRITE_TAC[IN_ELIM_THM] THEN + EXISTS_TAC `z:A` THEN + ASM_MESON_TAC[PROB_EVENT_SUBSET; sub_sigma_algebra; SUBSET]; + MATCH_MP_TAC SIGMA_ATOM_SUBSET THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC SIGMA_ATOM_CONTAINS THEN + ASM_MESON_TAC[PROB_EVENT_SUBSET; sub_sigma_algebra; SUBSET]]; + DISCH_THEN(X_CHOOSE_THEN `B:A->bool` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(B:A->bool) SUBSET a` MP_TAC THENL + [UNDISCH_TAC `(B:A->bool) IN atoms_a` THEN + EXPAND_TAC "atoms_a" THEN REWRITE_TAC[IN_ELIM_THM] THEN MESON_TAC[]; + ASM SET_TAC[]]]; + ALL_TAC] THEN + (* Prove by finite induction on atom subsets *) + SUBGOAL_THEN + `!S:(A->bool)->bool. FINITE S /\ S SUBSET atoms_a + ==> expectation p (\x. cond_exp p G (X:A->real) x * + indicator_fn (UNIONS S) x) = + expectation p (\x. X x * indicator_fn (UNIONS S) x)` + (fun th -> MP_TAC(SPEC `atoms_a:((A->bool)->bool)` th) THEN + ASM_REWRITE_TAC[SUBSET_REFL]) THEN + REWRITE_TAC[IMP_CONJ] THEN + MATCH_MP_TAC FINITE_INDUCT_STRONG THEN + CONJ_TAC THENL + [(* Base case: UNIONS {} = {} *) + DISCH_TAC THEN REWRITE_TAC[UNIONS_0] THEN + MATCH_MP_TAC(REAL_ARITH `a = &0 /\ b = &0 ==> a = b`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_SIMPLE THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC COND_EXP_SIMPLE_RV THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[PROB_EMPTY_IN_EVENTS; PROB_EMPTY]]; + MATCH_MP_TAC SET_INTEGRAL_ZERO_ON_NULL THEN + ASM_REWRITE_TAC[PROB_EMPTY_IN_EVENTS; PROB_EMPTY]]; + ALL_TAC] THEN + (* Inductive step: INSERT B S' *) + MAP_EVERY X_GEN_TAC [`B:A->bool`; `S':(A->bool)->bool`] THEN + STRIP_TAC THEN DISCH_TAC THEN + REWRITE_TAC[UNIONS_INSERT] THEN + (* Unpack: B IN atoms_a, S' SUBSET atoms_a *) + SUBGOAL_THEN `(B:A->bool) IN atoms_a` ASSUME_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(S':(A->bool)->bool) SUBSET atoms_a` ASSUME_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + (* B is an event *) + SUBGOAL_THEN `(B:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + (* UNIONS S' is an event *) + SUBGOAL_THEN `UNIONS S' IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [SUBGOAL_THEN `UNIONS S' IN (G:(A->bool)->bool)` MP_TAC THENL + [MATCH_MP_TAC SIGMA_ALGEBRA_UNIONS_FINITE THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[SUBSET] THEN X_GEN_TAC `C:A->bool` THEN DISCH_TAC THEN + USE_THEN "in_G" MATCH_MP_TAC THEN ASM SET_TAC[]; + ASM_MESON_TAC[sub_sigma_algebra; SUBSET]]; + ALL_TAC] THEN + (* B and UNIONS S' are disjoint *) + SUBGOAL_THEN `DISJOINT B (UNIONS S':A->bool)` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER; IN_UNIONS] THEN + X_GEN_TAC `z:A` THEN + REWRITE_TAC[TAUT `~(p /\ q) <=> p ==> ~q`] THEN + DISCH_TAC THEN + REWRITE_TAC[NOT_EXISTS_THM; TAUT `~(p /\ q) <=> p ==> ~q`] THEN + X_GEN_TAC `C:A->bool` THEN DISCH_TAC THEN + SUBGOAL_THEN `DISJOINT (B:A->bool) C` MP_TAC THENL + [USE_THEN "pd" MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM_MESON_TAC[SUBSET]; ASM_MESON_TAC[]]; + REWRITE_TAC[DISJOINT; EXTENSION; NOT_IN_EMPTY; IN_INTER] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Apply IH *) + SUBGOAL_THEN + `expectation p (\x. cond_exp p G (X:A->real) x * + indicator_fn (UNIONS S') x) = + expectation p (\x. X x * indicator_fn (UNIONS S') x)` + (LABEL_TAC "ih_eq") THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Get witness for B as atom *) + USE_THEN "is_atom" (MP_TAC o SPEC `B:A->bool`) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `w:A` STRIP_ASSUME_TAC) THEN + (* Per-atom: E[cond_exp * 1_B] = E[X * 1_B] *) + SUBGOAL_THEN + `expectation p (\x. cond_exp p G (X:A->real) x * + indicator_fn B x) = + expectation p (\x. X x * indicator_fn B x)` + (LABEL_TAC "atom_eq") THENL + [SUBGOAL_THEN `B = sigma_atom G (w:A):A->bool` SUBST1_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC COND_EXP_ATOM_COND THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Key: indicator decomposes additively on disjoint sets *) + SUBGOAL_THEN `!f:A->real. integrable p f ==> + expectation p (\x. f x * indicator_fn (B UNION UNIONS S') x) = + expectation p (\x. f x * indicator_fn B x) + + expectation p (\x. f x * indicator_fn (UNIONS S':A->bool) x)` + (LABEL_TAC "decomp") THENL + [X_GEN_TAC `f:A->real` THEN DISCH_TAC THEN + SUBGOAL_THEN + `(\x:A. f x * indicator_fn (B UNION UNIONS S') x) = + (\x. f x * indicator_fn B x + + f x * indicator_fn (UNIONS S':A->bool) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN X_GEN_TAC `z:A` THEN + REWRITE_TAC[indicator_fn; IN_UNION] THEN + UNDISCH_TAC `DISJOINT B (UNIONS S':A->bool)` THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY] THEN + DISCH_THEN(MP_TAC o SPEC `z:A`) THEN + MAP_EVERY ASM_CASES_TAC [`(z:A) IN B`; `(z:A) IN UNIONS S'`] THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Decompose both sides and combine *) + USE_THEN "decomp" (MP_TAC o SPEC `cond_exp p G (X:A->real)`) THEN + ANTS_TAC THENL + [MATCH_MP_TAC COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + USE_THEN "decomp" (MP_TAC o SPEC `X:A->real`) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + REMOVE_THEN "atom_eq" SUBST1_TAC THEN + REMOVE_THEN "ih_eq" SUBST1_TAC THEN + REFL_TAC);; + +(* Tower property: E[E[X|G]] = E[X] *) +let COND_EXP_TOWER = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ FINITE G /\ integrable p X + ==> expectation p (cond_exp p G X) = expectation p X`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + (* E[cond_exp] = E[cond_exp * 1_carrier] *) + SUBGOAL_THEN + `expectation p (cond_exp p G (X:A->real)) = + expectation p (\x. cond_exp p G X x * indicator_fn (UNIONS G) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN + DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL [REWRITE_TAC[REAL_MUL_RID]; ALL_TAC] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (X:A->real) = + expectation p (\x. X x * indicator_fn (UNIONS G) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `z:A` THEN + DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL [REWRITE_TAC[REAL_MUL_RID]; ALL_TAC] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC COND_EXP_CONDITIONING THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[SIGMA_ALGEBRA_CARRIER]);; + +(* cond_exp agrees with simple_cond_exp for simple RVs *) +let COND_EXP_AGREES_SIMPLE = prove + (`!p:A prob_space G (X:A->real) x. + sub_sigma_algebra p G /\ FINITE G /\ simple_rv p X /\ + x IN prob_carrier p + ==> cond_exp p G X x = simple_cond_exp p G X x`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[cond_exp; simple_cond_exp] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN + SUBGOAL_THEN `UNIONS G = prob_carrier (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_atom G (x:A) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[SIGMA_ATOM_IN_G; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]);; + (* ========================================================================= *) -(* HELPER LEMMAS FOR DOOB DECOMPOSITION *) +(* DOOB SIMPLE_MARTINGALE *) +(* ========================================================================= *) + +(* The Doob simple_martingale: cond_exp applied to a filtration *) +let DOOB_MARTINGALE = prove + (`!p:A prob_space FF (X:A->real). + filtration p FF /\ (!n. FINITE (FF n)) /\ integrable p X + ==> martingale p FF (\n. cond_exp p (FF n) X)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[martingale] THEN + SUBGOAL_THEN `!n. sub_sigma_algebra p ((FF:num->(A->bool)->bool) n)` + ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [(* filtration *) + ASM_REWRITE_TAC[]; + (* adapted *) + REWRITE_TAC[adapted] THEN GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + (* integrable *) + GEN_TAC THEN BETA_TAC THEN + MATCH_MP_TAC COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + (* conditioning *) + REPEAT STRIP_TAC THEN BETA_TAC THEN + (* E[cond_exp(FF(SUC n)) * 1_a] = E[X * 1_a] + = E[cond_exp(FF n) * 1_a] *) + SUBGOAL_THEN + `expectation p (\x:A. cond_exp p (FF (SUC n)) (X:A->real) x * + indicator_fn a x) = + expectation p (\x. X x * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC COND_EXP_CONDITIONING THEN + ASM_REWRITE_TAC[] THEN + (* a IN FF n ==> a IN FF(SUC n) by filtration monotonicity *) + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `SUC n`]) THEN + REWRITE_TAC[LE_REFL; ARITH_RULE `n <= SUC n`] THEN + ASM SET_TAC[]; + ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC COND_EXP_CONDITIONING THEN + ASM_REWRITE_TAC[]]);; + + (* ========================================================================= *) +(* L1-BOUNDED SIMPLE_MARTINGALE CONVERGENCE THEOREM *) +(* ========================================================================= *) + +(* Bound on pos_part for arbitrary functions (L1 version) *) +let POS_PART_SUB_LE_ABS = prove + (`!x a. pos_part(x - a) <= abs(x) + abs(a)`, + REPEAT GEN_TAC THEN REWRITE_TAC[pos_part; real_max] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC);; +(* Expected upcrossings bounded for L1-bounded simple_submartingale *) +let SIMPLE_UPCROSSING_EXPECTATION_BOUND_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n C. + simple_submartingale p FF X /\ a < b /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> (b - a) * simple_expectation p (\x. &(num_upcrossings X a b n x)) + <= C + abs(a)`, + REPEAT STRIP_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`] + SIMPLE_DOOB_UPCROSSING_INEQUALITY) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x:A. pos_part((X:num->A->real) n x - a))` THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x) + abs(a))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_POS_PART_SUB THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SIMPLE_RV_CONST]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[POS_PART_SUB_LE_ABS]]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x) + abs(a)) = + simple_expectation p (\x. abs(X n x)) + abs(a)` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. abs((X:num->A->real) n x)`; + `\x:A. abs(a:real)`] SIMPLE_EXPECTATION_ADD) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SIMPLE_RV_CONST]]; + REWRITE_TAC[SIMPLE_EXPECTATION_CONST] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th])]; + UNDISCH_TAC `!n. simple_expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x)) <= C` THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REAL_ARITH_TAC]);; + +(* L1 Markov bound: P(U_n >= k) <= (C + |a|) / ((b-a)*k) *) +let SIMPLE_UPCROSSING_PROB_BOUND_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n C k. + simple_submartingale p FF X /\ a < b /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) /\ + 0 < k + ==> prob p {x | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} + <= (C + abs(a)) / ((b - a) * &k)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv p (\x:A. &(num_upcrossings (X:num->A->real) a b n x))` + ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + SIMPLE_RV_NUM_UPCROSSINGS) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THEN ASM_REWRITE_TAC[]; + DISCH_THEN(ACCEPT_TAC o SPEC `n:num`)]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < &k` ASSUME_TAC THENL + [ASM_REWRITE_TAC[REAL_OF_NUM_LT]; ALL_TAC] THEN + SUBGOAL_THEN + `prob p {x | x IN prob_carrier (p:A prob_space) /\ + &(num_upcrossings (X:num->A->real) a b n x) >= &k} + <= simple_expectation p (\x. &(num_upcrossings X a b n x)) / &k` + ASSUME_TAC THENL + [MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN REWRITE_TAC[REAL_POS]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < b - a` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(b - a) * simple_expectation (p:A prob_space) + (\x:A. &(num_upcrossings (X:num->A->real) a b n x)) <= C + abs(a:real)` + ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`; `C:real`] + SIMPLE_UPCROSSING_EXPECTATION_BOUND_L1) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. &(num_upcrossings (X:num->A->real) a b n x)) + <= (C + abs(a:real)) / (b - a)` ASSUME_TAC THENL + [ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x:A. &(num_upcrossings (X:num->A->real) a b n x)) / &k + <= (C + abs(a:real)) / ((b - a) * &k)` ASSUME_TAC THENL + [REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[GSYM real_div]; + MATCH_MP_TAC REAL_LE_INV THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + ASM_MESON_TAC[REAL_LE_TRANS]);; + +(* L1 version: infinite upcrossings have probability zero *) +let SIMPLE_INFINITE_UPCROSSINGS_NULL_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b C. + simple_submartingale p FF X /\ a < b /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> !k. 0 < k ==> + prob p (UNIONS { + {x | x IN prob_carrier p /\ &(num_upcrossings X a b n x) >= &k} + | n IN (:num)}) <= (C + abs(a)) / ((b - a) * &k)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_UNIONS_INCREASING_BOUND THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `nn:num` THEN REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge; + REAL_OF_NUM_LE] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[NUM_UPCROSSINGS_MONO; LE_TRANS; + ARITH_RULE `nn <= SUC nn`]; + X_GEN_TAC `m:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `m:num`; + `C:real`; `k:num`] SIMPLE_UPCROSSING_PROB_BOUND_L1) THEN + DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]);; + +(* L1 version: finite upcrossings a.s. for fixed a < b *) +let SIMPLE_FINITE_UPCROSSINGS_AS_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b C. + simple_submartingale p FF X /\ a < b /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?B:num. !n. num_upcrossings X a b n x <= B}`, + REPEAT STRIP_TAC THEN REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN + EXISTS_TAC + `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_upcrossings (X:num->A->real) a b n x) >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `(C + abs(a:real)) / (b - a)` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_upcrossings (X:num->A->real) a b n x) >= &(SUC j)} + | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + SET_TAC[]]; + SUBGOAL_THEN `(C + abs(a:real)) / (b - a) / &(SUC j) = + (C + abs a) / ((b - a) * &(SUC j))` + SUBST1_TAC THENL + [REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `C:real`] + SIMPLE_INFINITE_UPCROSSINGS_NULL_L1) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN + REWRITE_TAC[LT_0]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS] THEN + REWRITE_TAC[EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM; + real_ge; REAL_OF_NUM_LE] THEN + FIRST_X_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_LE] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]);; + +(* Positive part of a simple_submartingale is a simple_submartingale *) +let SIMPLE_SUBMARTINGALE_POS_PART = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real). + simple_submartingale p FF X + ==> simple_submartingale p FF (\n x. pos_part(X n x))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `simple_adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + REWRITE_TAC[simple_submartingale] THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + REWRITE_TAC[simple_adapted] THEN CONJ_TAC THENL + [REWRITE_TAC[adapted] THEN GEN_TAC THEN + REWRITE_TAC[measurable_wrt] THEN X_GEN_TAC `v:real` THEN + REWRITE_TAC[pos_part] THEN + ASM_CASES_TAC `v < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ real_max ((X:num->A->real) n x) (&0) <= v} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) MP_TAC) THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC SIGMA_ALGEBRA_EMPTY THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ real_max ((X:num->A->real) n x) (&0) <= v} = + {x | x IN prob_carrier p /\ X n x <= v}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THENL + [POP_ASSUM MP_TAC THEN REWRITE_TAC[real_max] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[real_max] THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC]; + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_adapted]) THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + DISCH_THEN(MP_TAC o SPEC `v:real`) THEN REWRITE_TAC[]]]; + GEN_TAC THEN + SUBGOAL_THEN `{pos_part ((X:num->A->real) n x) | x IN prob_carrier (p:A prob_space)} = + IMAGE (\y. pos_part y) {X n x | x IN prob_carrier p}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_IMAGE; IN_ELIM_THM] THEN + GEN_TAC THEN EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `xx:A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(X:num->A->real) n xx` THEN ASM_REWRITE_TAC[] THEN + EXISTS_TAC `xx:A` THEN ASM_REWRITE_TAC[]; + DISCH_THEN(X_CHOOSE_THEN `y:real` (CONJUNCTS_THEN2 SUBST1_TAC MP_TAC)) THEN + DISCH_THEN(X_CHOOSE_THEN `xx:A` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `xx:A` THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC FINITE_IMAGE THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_adapted]) THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN(ACCEPT_TAC o SPEC `n:num`)]]; + GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_POS_PART THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&0`] SIMPLE_SUBMARTINGALE_POS_PART_STEP) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `a:A->bool`]) THEN + ASM_REWRITE_TAC[REAL_SUB_RZERO]]);; + +(* Doob maximal inequality for positive parts of a simple_submartingale *) +let SIMPLE_DOOB_MAXIMAL_POS_PART = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n C. + simple_submartingale p FF X /\ &0 < c /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) n x >= c} + <= C`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `(\n x. pos_part((X:num->A->real) n x)):num->A->real`; + `c:real`; `n:num`] + DOOB_MAXIMAL_INEQUALITY) THEN + DISCH_TAC THEN + SUBGOAL_THEN `c * prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + running_max (\n x. pos_part ((X:num->A->real) n x)) n x >= c} <= + simple_expectation p ((\n x. pos_part (X n x)) n)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_SUBMARTINGALE_POS_PART THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + BETA_TAC THEN REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[pos_part; real_max] THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) ((\n x. pos_part ((X:num->A->real) n x)) n)` THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) (\x:A. abs((X:num->A->real) n x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_POS_PART THEN REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[pos_part; real_max] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]);; + +(* Helper: finite prefix of a sequence has a lower bound *) +let FINITE_PREFIX_LOWER_BOUND = prove + (`!f:num->real. !N. ?L. !n. n < N ==> f n >= L`, + GEN_TAC THEN INDUCT_TAC THENL + [EXISTS_TAC `&0` THEN ARITH_TAC; + FIRST_X_ASSUM(X_CHOOSE_TAC `L:real`) THEN + EXISTS_TAC `min L ((f:num->real) N)` THEN + X_GEN_TAC `n:num` THEN REWRITE_TAC[LT] THEN + DISCH_THEN(DISJ_CASES_THEN2 SUBST1_TAC ASSUME_TAC) THENL + [REAL_ARITH_TAC; + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]);; + +(* Bounded above + finite upcrossings => convergent or -> -infty *) +let FINITE_UPCROSSINGS_CONVERGENT_OR_MINUS_INF = prove + (`!f M. (!n. (f:num->real) n <= M) /\ + (!a b. rational a /\ rational b /\ a < b + ==> ?B. !n. upcrossing_count f a b n <= B) + ==> (?L. (f ---> L) sequentially) \/ + (!K:num. ?N. !n. N <= n ==> f n <= --(&K))`, + REPEAT STRIP_TAC THEN + ASM_CASES_TAC `!K:num. ?N:num. !n. N <= n ==> (f:num->real) n <= --(&K)` THENL + [ASM_REWRITE_TAC[]; + DISJ1_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_FORALL_THM]) THEN + DISCH_THEN(X_CHOOSE_TAC `K0:num`) THEN + POP_ASSUM(MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_IMP] THEN DISCH_TAC THEN + SUBGOAL_THEN `!N:num. ?n. N <= n /\ (f:num->real) n >= --(&K0)` + ASSUME_TAC THENL + [X_GEN_TAC `N:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `~(!N:num. ?n. N <= n /\ (f:num->real) n <= --(&(K0 + 1)))` + MP_TAC THENL + [DISCH_TAC THEN + UNDISCH_TAC `!a b. rational a /\ rational b /\ a < b + ==> (?B. !n. upcrossing_count (f:num->real) a b n <= B)` THEN + DISCH_THEN(MP_TAC o SPECL [`--(&(K0 + 1))`; `--(&K0):real`]) THEN + ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RATIONAL_NEG THEN REWRITE_TAC[RATIONAL_NUM]; + MATCH_MP_TAC RATIONAL_NEG THEN REWRITE_TAC[RATIONAL_NUM]; + REWRITE_TAC[REAL_ARITH `--a < --b <=> b < a`; REAL_OF_NUM_LT] THEN + ARITH_TAC]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `B:num`) THEN + MP_TAC(ISPECL [`f:num->real`; `--(&(K0 + 1))`; `--(&K0):real`; `SUC B`] + UPCROSSING_COUNT_ITERATE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_ARITH `--a < --b <=> b < a`; REAL_OF_NUM_LT] THEN + ARITH_TAC; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` MP_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `nn:num`) THEN ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_EXISTS_THM; + TAUT `~(a /\ b) <=> a ==> ~b`] THEN + DISCH_THEN(X_CHOOSE_TAC `N0:num`) THEN + MP_TAC(ISPECL [`f:num->real`; `N0:num`] FINITE_PREFIX_LOWER_BOUND) THEN + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + SUBGOAL_THEN + `!n:num. abs((f:num->real) n) <= max (abs M) (max (&(K0 + 1)) (abs L))` + ASSUME_TAC THENL + [X_GEN_TAC `nn:num` THEN + ASM_CASES_TAC `N0:num <= nn` THENL + [REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `--(&(K0 + 1))` THEN + CONJ_TAC THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC(REAL_ARITH `~(y <= --x) ==> --x <= y`) THEN + UNDISCH_TAC `!n. N0 <= n ==> ~((f:num->real) n <= --(&(K0 + 1)))` THEN + DISCH_THEN(MP_TAC o SPEC `nn:num`) THEN + ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `M:real` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `nn < N0:num` ASSUME_TAC THENL + [REWRITE_TAC[GSYM NOT_LE] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_ABS_BOUNDS] THEN CONJ_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `L:real` THEN + CONJ_TAC THENL + [REAL_ARITH_TAC; + UNDISCH_TAC `!n. n < N0 ==> (f:num->real) n >= L` THEN + DISCH_THEN(MP_TAC o SPEC `nn:num`) THEN + ASM_REWRITE_TAC[real_ge] THEN REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `M:real` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]]]; + ALL_TAC] THEN + MATCH_MP_TAC(ISPECL [`f:num->real`; + `max (abs M) (max (&(K0 + 1)) (abs (L:real)))`] + BOUNDED_FINITE_UPCROSSINGS_IMP_CONVERGENT) THEN + ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* L1-BOUNDED SIMPLE_MARTINGALE CONVERGENCE THEOREM (main result) *) +(* ========================================================================= *) + +(* Helper: running_max of pos_part event is in prob_events *) +let SIMPLE_RUNNING_MAX_POS_PART_EVENT = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n. + simple_submartingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) n x >= c} + IN prob_events p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (\m x. pos_part((X:num->A->real) m x))` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`] SIMPLE_SUBMARTINGALE_POS_PART) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> MP_TAC(REWRITE_RULE[simple_submartingale] th)) THEN + DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN + REWRITE_TAC[simple_adapted] THEN DISCH_THEN(ACCEPT_TAC o CONJUNCT1); + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `(\m x. pos_part((X:num->A->real) m x)):num->A->real`; `c:real`; `n:num`] + RUNNING_MAX_EXCEEDS_IN_FILTRATION) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN + DISCH_THEN(MP_TAC o SPEC `n:num` o CONJUNCT1) THEN + REWRITE_TAC[sub_sigma_algebra] THEN + DISCH_THEN(MP_TAC o CONJUNCT1 o CONJUNCT2) THEN + REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]);; + +(* Helper: running_max monotone in n *) +let RUNNING_MAX_MONO_SUC = prove + (`!X:num->A->real. !n x. + running_max X n x <= running_max X (SUC n) x`, + REPEAT GEN_TAC THEN REWRITE_TAC[running_max] THEN + REWRITE_TAC[REAL_ARITH `a <= max a b`]);; + +(* Helper: running_max >= X m for m <= n *) +let RUNNING_MAX_GE = prove + (`!X:num->A->real. !n m x. m <= n ==> X m x <= running_max X n x`, + GEN_TAC THEN INDUCT_TAC THENL + [REPEAT GEN_TAC THEN REWRITE_TAC[CONJUNCT1 LE; running_max] THEN + DISCH_THEN SUBST1_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `m:num` THEN GEN_TAC THEN DISCH_TAC THEN + ASM_CASES_TAC `m = SUC n` THENL + [ASM_REWRITE_TAC[running_max] THEN REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (X:num->A->real) n x` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[running_max] THEN REAL_ARITH_TAC]]]);; + +(* Helper: X_n event in prob_events from simple_rv *) +let SIMPLE_RV_LE_EVENT = prove + (`!p:A prob_space (X:A->real) v. + simple_rv p X + ==> {x | x IN prob_carrier p /\ X x <= v} IN prob_events p`, + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [simple_rv]) THEN + DISCH_THEN(MP_TAC o CONJUNCT1) THEN + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `v:real`) THEN REWRITE_TAC[]);; + +let INTERS_UNIONS_IN_EVENTS = prove + (`!p (A:num->num->(A->bool)). + (!k:num n:num. A k n IN prob_events p) + ==> INTERS {UNIONS {A k n | n IN (:num)} | k IN (:num)} + IN prob_events p`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + ASM_REWRITE_TAC[]);; + +(* Helper: running_max of neg part event in prob_events *) +let SIMPLE_RUNNING_MAX_NEG_PART_EVENT = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n. + simple_submartingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. max (--X m x) (&0)) n x >= c} + IN prob_events p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SPEC_TAC(`n:num`, `n:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[running_max] THEN + ASM_CASES_TAC `c <= &0` THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ max (--((X:num->A->real) 0 x)) (&0) >= c} = + prob_carrier p` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THENL + [SIMP_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ max (--((X:num->A->real) 0 x)) (&0) >= c} = + {x | x IN prob_carrier p /\ X 0 x <= --c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN UNDISCH_TAC `~(c <= &0)` THEN REAL_ARITH_TAC; + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[simple_submartingale]]]; + REWRITE_TAC[running_max] THEN + ASM_CASES_TAC `c <= &0` THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x) + (max (--X (SUC n) x) (&0)) >= c} = + prob_carrier p` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THENL + [SIMP_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `&0` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x) + (max (--X (SUC n) x) (&0)) >= c} = + {x | x IN prob_carrier p /\ + running_max (\m x. max (--X m x) (&0)) n x >= c} UNION + {x | x IN prob_carrier p /\ X (SUC n) x <= --c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM; REAL_MAX_GE] THEN + GEN_TAC THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + EQ_TAC THENL + [DISCH_THEN DISJ_CASES_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISJ2_TAC THEN POP_ASSUM MP_TAC THEN + UNDISCH_TAC `~(c <= &0)` THEN REAL_ARITH_TAC; + DISCH_THEN DISJ_CASES_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISJ2_TAC THEN POP_ASSUM MP_TAC THEN + UNDISCH_TAC `~(c <= &0)` THEN REAL_ARITH_TAC]; + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[simple_submartingale]]]]]);; + +(* Helper: decompose expectation over carrier as sum over A and B = carrier\A *) +let SIMPLE_EXPECTATION_PARTITION = prove + (`!p:A prob_space (X:A->real) (a:A->bool). + simple_rv p X /\ a IN prob_events p + ==> simple_expectation p X = + simple_expectation p (\x. X x * indicator_fn a x) + + simple_expectation p (\x. X x * indicator_fn (prob_carrier p DIFF a) x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (X:A->real) = + simple_expectation p (\x. X x * indicator_fn a x + + X x * indicator_fn (prob_carrier p DIFF a) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN + ASM_CASES_TAC `(y:A) IN a` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SIMPLE_EXPECTATION_ADD THEN + CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]);; + +(* Neg part maximal inequality for submartingales *) +let SIMPLE_SUBMARTINGALE_NEG_PART_MAXIMAL = prove + (`!p:A prob_space FF X c (n:num) C. + simple_submartingale p FF X /\ &0 < c /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. max (--(X m x)) (&0)) n x >= c} + <= &2 * C`, + REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF X` ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN + SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN + `!n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c} + IN (FF:num->(A->bool)->bool) n` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [REWRITE_TAC[running_max] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ max (--((X:num->A->real) 0 x)) (&0) >= c} = + {x | x IN prob_carrier p /\ X 0 x <= --c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [adapted]) THEN + REWRITE_TAC[measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `0`) THEN + DISCH_THEN(MP_TAC o SPEC `--c:real`) THEN REWRITE_TAC[]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) (SUC n) x >= c} = + {x | x IN prob_carrier p /\ + running_max (\m x. max (--X m x) (&0)) n x >= c} UNION + {x | x IN prob_carrier p /\ X (SUC n) x <= --c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_ELIM_THM; running_max; REAL_MAX_GE] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + EQ_TAC THENL + [DISCH_THEN DISJ_CASES_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISJ2_TAC THEN POP_ASSUM MP_TAC THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + DISCH_THEN DISJ_CASES_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISJ2_TAC THEN POP_ASSUM MP_TAC THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC]; + MATCH_MP_TAC SIGMA_ALGEBRA_UNION THEN + CONJ_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra]; ALL_TAC] THEN + CONJ_TAC THENL + [SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` MP_TAC THENL + [ASM_MESON_TAC[filtration; LE; LE_REFL]; ALL_TAC] THEN + ASM SET_TAC[]; + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [adapted]) THEN + REWRITE_TAC[measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `SUC n`) THEN + DISCH_THEN(MP_TAC o SPEC `--c:real`) THEN REWRITE_TAC[]]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c} + IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; + ALL_TAC] THEN + ABBREV_TAC + `A = \n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c}` THEN + ABBREV_TAC `B = \n. prob_carrier (p:A prob_space) DIFF (A:num->(A->bool)) n` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c} = + (A:num->(A->bool)) n` + SUBST1_TAC THENL + [EXPAND_TAC "A" THEN REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!m. (B:num->(A->bool)) m IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "B" THEN + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS] THEN + EXPAND_TAC "A" THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!m. (A:num->(A->bool)) m IN (FF:num->(A->bool)->bool) m` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "A" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!m. (A:num->(A->bool)) m IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "A" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `!m. simple_rv (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `!m. simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= C` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= + simple_expectation p (\x. abs(X m x))` + MP_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO] THENL + [REAL_ARITH_TAC; REWRITE_TAC[REAL_ABS_POS]]; + MP_TAC(SPEC `m:num` + (ASSUME `!n. simple_expectation (p:A prob_space) (\x. abs ((X:num->A->real) n x)) <= C`)) THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN + `!m. simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) + >= --C + c * prob p ((A:num->(A->bool)) m)` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`; + `(A:num->(A->bool)) 0`] + SIMPLE_EXPECTATION_PARTITION) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF (A:num->(A->bool)) 0 = B 0` + SUBST1_TAC THENL + [EXPAND_TAC "B" THEN REWRITE_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. (X:num->A->real) 0 x * indicator_fn ((A:num->(A->bool)) 0) x) + <= --c * prob p (A 0)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `simple_rv (p:A prob_space) (\x. --c * indicator_fn ((A:num->(A->bool)) 0) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + REWRITE_TAC[SIMPLE_RV_CONST] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `--c * prob (p:A prob_space) ((A:num->(A->bool)) 0) = + simple_expectation p (\x. --c * indicator_fn (A 0) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. --c * indicator_fn ((A:num->(A->bool)) 0) x) = + --c * simple_expectation p (indicator_fn (A 0))` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_CMUL THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + AP_TERM_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL] THEN + UNDISCH_TAC `(y:A) IN (A:num->(A->bool)) 0` THEN + EXPAND_TAC "A" THEN REWRITE_TAC[IN_ELIM_THM; running_max] THEN + STRIP_TAC THEN POP_ASSUM MP_TAC THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) ((X:num->A->real) 0) >= --C` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) 0`] + SIMPLE_EXPECTATION_ABS_LE) THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(SPEC `0` (ASSUME `!n. simple_expectation (p:A prob_space) + (\x. abs((X:num->A->real) n x)) <= C`)) THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN + POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; + ABBREV_TAC + `D = (B:num->(A->bool)) m INTER + {x:A | x IN prob_carrier p /\ (X:num->A->real) (SUC m) x <= --c}` THEN + SUBGOAL_THEN `(B:num->(A->bool)) (SUC m) = B m DIFF D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[EXTENSION; IN_DIFF; IN_INTER; IN_ELIM_THM; + running_max; REAL_MAX_GE] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `D:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT ((A:num->(A->bool)) m) D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(A:num->(A->bool)) (SUC m) = A m UNION D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_DIFF; IN_ELIM_THM; + running_max; REAL_MAX_GE] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((A:num->(A->bool)) (SUC m)) = + prob p (A m) + prob p D` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC PROB_ADDITIVE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(B:num->(A->bool)) m IN (FF:num->(A->bool)->bool) m` + ASSUME_TAC THENL + [EXPAND_TAC "B" THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF (A:num->(A->bool)) m = + UNIONS ((FF:num->(A->bool)->bool) m) DIFF A m` SUBST1_TAC THENL + [AP_THM_TAC THEN AP_TERM_TAC THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]; + MATCH_MP_TAC SIGMA_ALGEBRA_COMPL THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= + simple_expectation p + (\x. X (SUC m) x * indicator_fn (B m) x)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `m:num`; `SUC m`; + `(B:num->(A->bool)) m`] + SIMPLE_SUBMARTINGALE_LOCALIZED_INCREASING) THEN + ASM_REWRITE_TAC[ARITH_RULE `m <= SUC m`]; + ALL_TAC] THEN + SUBGOAL_THEN `(B:num->(A->bool)) m = B (SUC m) UNION D` ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN EXPAND_TAC "D" THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT ((B:num->(A->bool)) (SUC m)) D` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT] THEN + UNDISCH_TAC `(B:num->(A->bool)) (SUC m) = B m DIFF D` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * indicator_fn ((B:num->(A->bool)) m) x) = + simple_expectation p + (\x. X (SUC m) x * indicator_fn (B (SUC m)) x) + + simple_expectation p + (\x. X (SUC m) x * indicator_fn D x)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * indicator_fn ((B:num->(A->bool)) m) x) = + simple_expectation p + (\x. X (SUC m) x * indicator_fn (B (SUC m)) x + + X (SUC m) x * indicator_fn D x)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN AP_TERM_TAC THEN + UNDISCH_TAC `(B:num->(A->bool)) m = B (SUC m) UNION D` THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC INDICATOR_FN_DISJOINT_UNION THEN + FIRST_ASSUM ACCEPT_TAC; + MATCH_MP_TAC SIMPLE_EXPECTATION_ADD THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * indicator_fn D x) <= + --c * prob p D` + ASSUME_TAC THENL + [SUBGOAL_THEN + `--c * prob (p:A prob_space) D = + simple_expectation p (\x. --c * indicator_fn D x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `simple_expectation (p:A prob_space) (\x. --c * indicator_fn D x) = + --c * simple_expectation p (indicator_fn D)` + SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_CMUL THEN + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + AP_TERM_TAC THEN MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN + CONJ_TAC THENL + [REWRITE_TAC[SIMPLE_RV_CONST]; + MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO; REAL_LE_REFL] THEN + UNDISCH_TAC `(y:A) IN D` THEN EXPAND_TAC "D" THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + POP_ASSUM MP_TAC THEN + POP_ASSUM MP_TAC THEN + POP_ASSUM (K ALL_TAC) THEN + POP_ASSUM (K ALL_TAC) THEN + POP_ASSUM MP_TAC THEN + POP_ASSUM (K ALL_TAC) THEN + POP_ASSUM(fun th -> + REWRITE_TAC[th; REAL_ADD_LDISTRIB; REAL_MUL_LNEG]) THEN + UNDISCH_TAC + `simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) >= + --C + c * prob p ((A:num->(A->bool)) m)` THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(SPEC `n:num` + (ASSUME `!m. simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) >= + --C + c * prob p ((A:num->(A->bool)) m)`)) THEN + MP_TAC(SPEC `n:num` + (ASSUME `!m. simple_expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= C`)) THEN + REAL_ARITH_TAC);; + +(* Main theorem: L1-bounded simple_submartingale converges almost surely *) +let SIMPLE_MARTINGALE_CONVERGENCE_L1_BOUNDED = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) C. + simple_submartingale p FF X /\ + (!n. simple_expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN + MP_TAC RATIONAL_ENUMERATION THEN + DISCH_THEN(X_CHOOSE_TAC `g:num->real`) THEN + (* Part 1: a.s. for each k, upcrossings of (g(fst k), g(snd k)) finite *) + SUBGOAL_THEN + `!k. almost_surely (p:A prob_space) + {x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN + ASM_CASES_TAC `(g:num->real)(NUMFST k) < g(NUMSND k)` THENL + [MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ?B. !n. num_upcrossings (X:num->A->real) + ((g:num->real)(NUMFST k)) (g(NUMSND k)) n x <= B}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_FINITE_UPCROSSINGS_AS_L1 THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `C:real`] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + SUBGOAL_THEN + `{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} = (:A)` + (fun th -> REWRITE_TAC[th; ALMOST_SURELY_UNIV]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNIV] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `almost_surely (p:A prob_space) + (INTERS {{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} + | k IN (:num)})` + ASSUME_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Part 2: a.s. sup pos_part(X_n) is finite *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | ?M. !n. pos_part((X:num->A->real) n x) <= M}` + ASSUME_TAC THENL + [REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `C:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + REWRITE_TAC[]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)}`; + `C / &(SUC j)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. pos_part ((X:num->A->real) m x)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC j)`; `nn:num`; `C:real`] + SIMPLE_DOOB_MAXIMAL_POS_PART) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LE] THEN DISCH_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&(SUC k)`) THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(\m x. pos_part ((X:num->A->real) m x)) nn x` THEN + CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]; + ALL_TAC] THEN + (* Part 3: a.s. X doesn't go to -infty *) + (* Use Markov: P(X_n <= -K) <= C/K for each n *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | ?K:num. !N:num. ?n. N <= n /\ + (X:num->A->real) n x > --(&K)}` + ASSUME_TAC THENL + [REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS + {UNIONS {{x:A | x IN prob_carrier p /\ + (X:num->A->real) n x <= --(&(SUC k))} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + (X:num->A->real) n x <= --(&(SUC k))}`] + INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `&2 * C` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + (X:num->A->real) n x <= --(&(SUC k))}`] + INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x + >= &(SUC k)} + | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + (X:num->A->real) n x <= --(&(SUC k))}`] + INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RV_LE_EVENT THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(\m x. max (--((X:num->A->real) m x)) (&0)) nn (x:A)` THEN + CONJ_TAC THENL + [BETA_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `--((X:num->A->real) nn x)` THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; REAL_ARITH_TAC]; + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x + >= &(SUC k)}`; + `(&2 * C) / &(SUC k)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. max (--((X:num->A->real) m x)) (&0)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC k)`; `nn:num`; `C:real`] + SIMPLE_SUBMARTINGALE_NEG_PART_MAXIMAL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + GEN_REWRITE_TAC (LAND_CONV) [REAL_MUL_SYM] THEN + ASM_REWRITE_TAC[]]]]]; + (* Containment *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_EXISTS_THM; + TAUT `~(a /\ b) <=> a ==> ~b`; real_gt; REAL_NOT_LT] THEN + DISCH_TAC THEN GEN_TAC THEN + REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `SUC k`) THEN + DISCH_THEN(X_CHOOSE_THEN `N0:num` (MP_TAC o SPEC `N0:num`)) THEN + REWRITE_TAC[LE_REFL] THEN DISCH_TAC THEN + EXISTS_TAC `N0:num` THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Combine and apply analytic lemma *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `(INTERS {{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} + | k IN (:num)}) INTER + {x:A | ?M. !n. pos_part((X:num->A->real) n x) <= M} INTER + {x:A | ?K:num. !N:num. ?n. N <= n /\ X n x > --(&K)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC ALMOST_SURELY_INTER THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[IN_ELIM_THM; IN_INTER; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 (X_CHOOSE_TAC `M0:real`) + (X_CHOOSE_TAC `K0:num`))) THEN + SUBGOAL_THEN + `!k. (g:num->real)(NUMFST k) < g(NUMSND k) + ==> ?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | (g:num->real)(NUMFST (k:num)) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}`) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `k:num` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. (X:num->A->real) n x <= M0` ASSUME_TAC THENL + [X_GEN_TAC `nn:num` THEN + UNDISCH_TAC `!n:num. pos_part ((X:num->A->real) n x) <= M0` THEN + DISCH_THEN(MP_TAC o SPEC `nn:num`) THEN + REWRITE_TAC[pos_part; real_max] THEN COND_CASES_TAC THEN + ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(ISPECL [`\n:num. (X:num->A->real) n x`; `M0:real`] + FINITE_UPCROSSINGS_CONVERGENT_OR_MINUS_INF) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN + SUBGOAL_THEN `?i:num. (g:num->real) i = a` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `a:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `?j:num. (g:num->real) j = b` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `b:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `!k:num. (g:num->real)(NUMFST k) < g(NUMSND k) + ==> (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)` THEN + DISCH_THEN(MP_TAC o SPEC `NUMPAIR (i:num) (j:num)`) THEN + REWRITE_TAC[NUMPAIR_DEST] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:num`) THEN + EXISTS_TAC `B:num` THEN X_GEN_TAC `n:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[num_upcrossings]; ALL_TAC] THEN + DISCH_THEN(DISJ_CASES_THEN2 ACCEPT_TAC MP_TAC) THEN + DISCH_TAC THEN + SUBGOAL_THEN `F` CONTR_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `K0:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `N0:num` ASSUME_TAC) THEN + UNDISCH_TAC `!N:num. ?n:num. N <= n /\ (X:num->A->real) n x > --(&K0)` THEN + DISCH_THEN(MP_TAC o SPEC `N0:num`) THEN + DISCH_THEN(X_CHOOSE_THEN `n0:num` STRIP_ASSUME_TAC) THEN + UNDISCH_TAC `!n:num. N0 <= n ==> (X:num->A->real) n x <= --(&K0)` THEN + DISCH_THEN(MP_TAC o SPEC `n0:num`) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `(X:num->A->real) n0 x > --(&K0)` THEN + REWRITE_TAC[real_gt] THEN REAL_ARITH_TAC]);; + +(* ========================================================================= *) +(* UI SIMPLE_SUBMARTINGALE CONVERGENCE *) +(* Uniformly integrable submartingales converge almost surely. *) +(* Combines UI_IMP_L1_BOUNDED with SIMPLE_MARTINGALE_CONVERGENCE_L1_BOUNDED. *) +(* ========================================================================= *) + +let SIMPLE_UI_SUBMARTINGALE_CONVERGENCE_AS = prove + (`!p:A prob_space FF X. + uniformly_integrable p X /\ simple_submartingale p FF X + ==> almost_surely p {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP UI_IMP_L1_BOUNDED) THEN + DISCH_THEN(X_CHOOSE_TAC `C:real`) THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `C:real`] + SIMPLE_MARTINGALE_CONVERGENCE_L1_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `n:num` THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL + [UNDISCH_TAC `simple_submartingale (p:A prob_space) FF (X:num->A->real)` THEN + SIMP_TAC[simple_submartingale]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x:A. abs((X:num->A->real) n x)) = + expectation p (\x. abs(X n x))` SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN + MATCH_MP_TAC SIMPLE_RV_ABS THEN + ASM_REWRITE_TAC[ETA_AX]; + ASM_REWRITE_TAC[]]);; + +(* Expectation of simple_rv restricted to a null event is zero. *) +(* Useful for bridging a.s. and L1 convergence. *) +let SIMPLE_EXPECTATION_NULL_EVENT = prove + (`!p:A prob_space f a. + simple_rv p f /\ a IN prob_events p /\ prob p a = &0 + ==> simple_expectation p (\x. f x * indicator_fn a x) = &0`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. (f:A->real) x * indicator_fn a x)` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (\x:A. abs((f:A->real) x))` + (fun th -> MP_TAC(MATCH_MP SIMPLE_RV_BOUNDED th)) THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + REWRITE_TAC[BETA_THM] THEN DISCH_THEN(X_CHOOSE_TAC `M:real`) THEN + MATCH_MP_TAC(REAL_ARITH `abs(x) <= &0 ==> x = &0`) THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x:A. abs((f:A->real) x * indicator_fn a x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_ABS_LE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x:A. M * indicator_fn (a:A->bool) x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_ABS THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_MUL THEN CONJ_TAC THENL + [REWRITE_TAC[SIMPLE_RV_CONST]; + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; REAL_ABS_MUL] THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_ABS_1; REAL_MUL_RID] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `x:A`) THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[BETA_THM]; + REWRITE_TAC[REAL_ABS_NUM; REAL_MUL_RZERO] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) (indicator_fn (a:A->bool))` + ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_CMUL; ETA_AX] THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_INDICATOR] THEN + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]);; + +(* ========================================================================= *) +(* BACKWARD SIMPLE_MARTINGALE CONVERGENCE *) +(* Reversed (backward) martingales converge a.s. using the forward *) +(* upcrossing inequality applied to the reversed simple_submartingale, combined *) +(* with the combinatorial DC_LE_REV_UC inequality. *) +(* ========================================================================= *) + +(* --- Downcrossing continuation infrastructure --- *) + +let UP_PHASE_WHEN_LE_A = prove( + `!g:num->real a b m. g m <= a /\ a < b ==> upcrossing_phase g a b m = 1`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[upcrossing_phase] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[upcrossing_phase] THEN STRIP_TAC THEN + COND_CASES_TAC THENL [ASM_REWRITE_TAC[]; + COND_CASES_TAC THENL [ + SUBGOAL_THEN `F` (fun th -> REWRITE_TAC[th]) THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[]]]]);; + +let UP_PHASE_1_NOT_GE_B = prove( + `!g:num->real a b n. a < b ==> ~(upcrossing_phase g a b n = 1 /\ g n >= b)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[upcrossing_phase] THEN COND_CASES_TAC THEN REWRITE_TAC[] THEN + TRY ARITH_TAC THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[upcrossing_phase] THEN REPEAT COND_CASES_TAC THEN REWRITE_TAC[] THEN + TRY ARITH_TAC THEN ASM_REAL_ARITH_TAC]);; + +let DC_PHASE_STAYS_1 = prove( + `!f:num->real a b k. downcrossing_phase f a b 0 = 1 /\ + (!j. j <= k ==> f j > a) ==> + downcrossing_phase f a b k = 1 /\ downcrossing_count f a b k = 0`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[downcrossing_phase; downcrossing_count] THEN MESON_TAC[]; + STRIP_TAC THEN + SUBGOAL_THEN `downcrossing_phase f a b k = 1 /\ downcrossing_count f a b k = 0` + STRIP_ASSUME_TAC THENL [ + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[downcrossing_phase; downcrossing_count] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `~((f:num->real)(SUC k) <= a)` (fun th -> REWRITE_TAC[th]) THENL [ + FIRST_X_ASSUM(MP_TAC o SPEC `SUC k`) THEN + REWRITE_TAC[LE_REFL] THEN REAL_ARITH_TAC; + ARITH_TAC]]]);; + +let DC_RESTART = prove( + `!f:num->real a b u. downcrossing_phase f a b 0 = 1 /\ + (!j. j < u ==> f j > a) /\ 1 <= u /\ f u <= a ==> + downcrossing_phase f a b u = 0 /\ downcrossing_count f a b u = 1`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `?v. u = SUC v` (CHOOSE_THEN SUBST_ALL_TAC) THENL [ + EXISTS_TAC `u - 1` THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `downcrossing_phase f a b v = 1 /\ downcrossing_count f a b v = 0` + STRIP_ASSUME_TAC THENL [ + MATCH_MP_TAC DC_PHASE_STAYS_1 THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + REWRITE_TAC[downcrossing_phase; downcrossing_count] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(f:num->real)(SUC v) <= a` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_REWRITE_TAC[]; ARITH_TAC]]);; + +let DC_CONTINUATION = prove( + `!k f:num->real a b u. downcrossing_phase f a b u = 0 /\ ~(f u >= b) ==> + downcrossing_phase f a b (u + SUC k) = + downcrossing_phase (\n. f(u + n)) a b (SUC k) /\ + downcrossing_count f a b (u + SUC k) = + downcrossing_count f a b u + downcrossing_count (\n. f(u + n)) a b (SUC k)`, + INDUCT_TAC THENL [ + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[ARITH_RULE `u + SUC 0 = SUC u`] THEN + ONCE_REWRITE_TAC[downcrossing_phase] THEN + ONCE_REWRITE_TAC[downcrossing_count] THEN + ONCE_REWRITE_TAC[downcrossing_phase; downcrossing_count] THEN + REWRITE_TAC[BETA_THM; ADD_0] THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`f:num->real`; `a:real`; `b:real`; `u:num`]) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + REWRITE_TAC[ARITH_RULE `u + SUC(SUC k) = SUC(u + SUC k)`] THEN + ONCE_REWRITE_TAC[downcrossing_phase] THEN + ONCE_REWRITE_TAC[downcrossing_count] THEN + REWRITE_TAC[BETA_THM] THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ARITH_RULE `SUC(u + SUC k) = u + SUC(SUC k)`] THEN + ARITH_TAC]);; + +let DC_PHASE_SHIFT = prove( + `!f:num->real a b k. downcrossing_phase f a b 0 = 0 ==> + downcrossing_phase f a b (SUC k) = downcrossing_phase (\n. f(SUC n)) a b k /\ + downcrossing_count f a b (SUC k) = downcrossing_count (\n. f(SUC n)) a b k`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + DISCH_TAC THEN + ONCE_REWRITE_TAC[downcrossing_phase] THEN ONCE_REWRITE_TAC[downcrossing_count] THEN + REWRITE_TAC[BETA_THM; downcrossing_count] THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; + DISCH_TAC THEN FIRST_X_ASSUM(MP_TAC o check (is_imp o concl)) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + ONCE_REWRITE_TAC[downcrossing_phase] THEN ONCE_REWRITE_TAC[downcrossing_count] THEN + REWRITE_TAC[BETA_THM] THEN ASM_REWRITE_TAC[] THEN ARITH_TAC]);; + +let UP_PHASE_01 = prove( + `!g:num->real a b n. upcrossing_phase g a b n = 0 \/ upcrossing_phase g a b n = 1`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[upcrossing_phase] THEN COND_CASES_TAC THEN REWRITE_TAC[]; + ONCE_REWRITE_TAC[upcrossing_phase] THEN + FIRST_X_ASSUM DISJ_CASES_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT(COND_CASES_TAC THEN REWRITE_TAC[])]);; + +let UC_PREFIX = prove( + `!n f g:num->real a b. (!k. k <= n ==> f k = g k) ==> + upcrossing_phase f a b n = upcrossing_phase g a b n /\ + upcrossing_count f a b n = upcrossing_count g a b n`, + INDUCT_TAC THENL [ + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[upcrossing_phase; upcrossing_count] THEN + SUBGOAL_THEN `(f:num->real) 0 = g 0` (fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC; + REPEAT GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`f:num->real`; `g:num->real`; `a:real`; `b:real`]) THEN + ANTS_TAC THENL [ + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC; + STRIP_TAC] THEN + ONCE_REWRITE_TAC[upcrossing_phase] THEN + ONCE_REWRITE_TAC[upcrossing_count] THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(f:num->real)(SUC n) = g(SUC n)` (fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC]);; + +let UC_INCREMENT_PHASE_CHANGE = prove( + `!n g:num->real a b m. upcrossing_phase g a b m = 1 /\ + upcrossing_phase g a b n = 0 /\ m < n ==> + upcrossing_count g a b n >= upcrossing_count g a b m + 1`, + INDUCT_TAC THENL [ARITH_TAC; ALL_TAC] THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[upcrossing_count] THEN + MP_TAC(SPECL [`g:num->real`; `a:real`; `b:real`; `n:num`] UP_PHASE_01) THEN + STRIP_TAC THENL [ + ASM_CASES_TAC `m < n:num` THENL [ + FIRST_X_ASSUM(MP_TAC o SPECL [`g:num->real`; `a:real`; `b:real`; `m:num`]) THEN + ASM_REWRITE_TAC[] THEN ARITH_TAC; + SUBGOAL_THEN `m = n:num` (fun th -> ASM_MESON_TAC[th; ARITH_RULE `~(1 = 0)`]) THEN + ASM_ARITH_TAC]; + SUBGOAL_THEN `(g:num->real)(SUC n) >= b` ASSUME_TAC THENL [ + UNDISCH_TAC `upcrossing_phase g a b (SUC n) = 0` THEN + ONCE_REWRITE_TAC[upcrossing_phase] THEN + ASM_REWRITE_TAC[ARITH_RULE `~(1 = 0)`] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN ARITH_TAC; + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `upcrossing_count g a b m <= upcrossing_count g a b n` MP_TAC THENL [ + MATCH_MP_TAC UPCROSSING_COUNT_INCREASING THEN ASM_ARITH_TAC; ARITH_TAC]]]);; + +let UC_COMPLETES = prove( + `!g:num->real a b m n. + g m <= a /\ g n >= b /\ a < b /\ m < n + ==> upcrossing_count g a b n >= upcrossing_count g a b m + 1`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `upcrossing_phase g a b m = 1` ASSUME_TAC THENL [ + MATCH_MP_TAC UP_PHASE_WHEN_LE_A THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MP_TAC(SPECL [`g:num->real`; `a:real`; `b:real`; `n:num`] UP_PHASE_01) THEN + STRIP_TAC THENL [ + MP_TAC(SPECL [`n:num`; `g:num->real`; `a:real`; `b:real`; `m:num`] + UC_INCREMENT_PHASE_CHANGE) THEN ASM_REWRITE_TAC[]; + MP_TAC(SPECL [`g:num->real`; `a:real`; `b:real`; `n:num`] UP_PHASE_1_NOT_GE_B) THEN + ASM_REWRITE_TAC[]]);; + +(* --- DC_LE_REV_UC: the combinatorial inequality dc(f,N) <= uc(rev f,N) + 1 --- *) + +let DC_LE_REV_UC_CASE_LT = prove( + `!N f:num->real a b. + (!m. m < N ==> !f a b. a < b ==> downcrossing_count f a b m <= + upcrossing_count (\k. f (m - k)) a b m + 1) ==> + a < b ==> ~(N = 0) ==> ~(f 0 >= b) ==> + downcrossing_count f a b N <= upcrossing_count (\k. f(N - k)) a b N + 1`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `downcrossing_phase (f:num->real) a b 0 = 0` ASSUME_TAC THENL [ + REWRITE_TAC[downcrossing_phase] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `?M. N = SUC M` (CHOOSE_THEN SUBST_ALL_TAC) THENL [ + EXISTS_TAC `N - 1` THEN ASM_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`f:num->real`; `a:real`; `b:real`; `M:num`] DC_PHASE_SHIFT) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `M:num`) THEN + ANTS_TAC THENL [ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPECL [`\n. (f:num->real)(SUC n)`; `a:real`; `b:real`]) THEN + ASM_REWRITE_TAC[BETA_THM] THEN + DISCH_TAC THEN + MATCH_MP_TAC LE_TRANS THEN + EXISTS_TAC `upcrossing_count (\k. (f:num->real)(SUC(M - k))) a b M + 1` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `!k:num. k <= M ==> SUC(M - k) = SUC M - k` ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN ASM_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC(ARITH_RULE `a <= b ==> a + 1 <= b + 1`) THEN + MP_TAC(SPECL [`M:num`; `\k. (f:num->real)(SUC(M - k))`; + `\k. (f:num->real)(SUC M - k)`; `a:real`; `b:real`] UC_PREFIX) THEN + REWRITE_TAC[BETA_THM] THEN + ANTS_TAC THENL [ + REPEAT STRIP_TAC THEN AP_TERM_TAC THEN ASM_ARITH_TAC; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN MATCH_MP_TAC UPCROSSING_COUNT_INCREASING THEN ARITH_TAC]);; + +let DC_LE_REV_UC_CASE_GE = prove( + `!N f:num->real a b. + (!m. m < N ==> !f a b. a < b ==> downcrossing_count f a b m <= + upcrossing_count (\k. f (m - k)) a b m + 1) ==> + a < b ==> ~(N = 0) ==> f 0 >= b ==> + downcrossing_count f a b N <= upcrossing_count (\k. f(N - k)) a b N + 1`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `downcrossing_phase (f:num->real) a b 0 = 1` ASSUME_TAC THENL [ + REWRITE_TAC[downcrossing_phase] THEN + UNDISCH_TAC `(f:num->real) 0 >= b` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + ASM_CASES_TAC `?u:num. 1 <= u /\ u <= N /\ (f:num->real) u <= a` THENL [ + (* Crossing below a exists: find first such crossing *) + SUBGOAL_THEN + `?u:num. (1 <= u /\ u <= N /\ (f:num->real) u <= a) /\ + (!j:num. j < u ==> ~(1 <= j /\ j <= N /\ f j <= a))` MP_TAC THENL [ + REWRITE_TAC[GSYM num_WOP] THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + STRIP_TAC THEN + (* Derive !j. j < u ==> f j > a *) + SUBGOAL_THEN `!j:num. j < u ==> (f:num->real) j > a` ASSUME_TAC THENL [ + X_GEN_TAC `j:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `j:num`) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + ASM_CASES_TAC `j = 0` THENL [ + ASM_REWRITE_TAC[] THEN REWRITE_TAC[real_gt] THEN + UNDISCH_TAC `(f:num->real) 0 >= b` THEN UNDISCH_TAC `a < b` THEN + REWRITE_TAC[real_ge] THEN REAL_ARITH_TAC; + REWRITE_TAC[real_gt] THEN + SUBGOAL_THEN `~((f:num->real) j <= a)` (fun th -> MESON_TAC[th; REAL_NOT_LE]) THEN + FIRST_X_ASSUM(MP_TAC o check (is_neg o concl)) THEN + ASM_ARITH_TAC]; + ALL_TAC] THEN + (* Apply DC_RESTART *) + MP_TAC(SPECL [`f:num->real`; `a:real`; `b:real`; `u:num`] DC_RESTART) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; STRIP_TAC] THEN + ASM_CASES_TAC `u = N:num` THENL [ + (* u = N: dc_count = 1 <= uc + 1 *) + SUBGOAL_THEN `downcrossing_count (f:num->real) a b N = 1` SUBST1_TAC THENL [ + ASM_MESON_TAC[]; + ARITH_TAC]; + (* u < N: use DC_CONTINUATION + IH + UC_COMPLETES *) + SUBGOAL_THEN `u < N:num` ASSUME_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `~((f:num->real) u >= b)` ASSUME_TAC THENL [ + UNDISCH_TAC `(f:num->real) u <= a` THEN UNDISCH_TAC `a < b` THEN + REWRITE_TAC[real_ge] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MP_TAC(SPECL [`N - u - 1`; `f:num->real`; `a:real`; `b:real`; `u:num`] + DC_CONTINUATION) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `u + SUC(N - u - 1) = N` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `SUC(N - u - 1) = N - u` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_ARITH_TAC; ALL_TAC] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + (* Now goal: 1 + dc(f', N-u) <= uc(g, N) + 1 *) + SUBGOAL_THEN + `downcrossing_count (\n. (f:num->real)(u + n)) a b (N - u) <= + upcrossing_count (\k. f(u + (N - u) - k)) a b (N - u) + 1` MP_TAC THENL [ + UNDISCH_TAC `!m:num. m < N ==> (!f:num->real. !a b. a < b ==> + downcrossing_count f a b m <= upcrossing_count (\k. f(m - k)) a b m + 1)` THEN + DISCH_THEN(MP_TAC o SPEC `N - u:num`) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPECL [`\n. (f:num->real)(u + n)`; `a:real`; `b:real`]) THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[BETA_THM]; + ALL_TAC] THEN + DISCH_TAC THEN + (* Relate uc(\k. f(u+(N-u)-k), N-u) to uc(\k. f(N-k), N-u) via UC_PREFIX *) + SUBGOAL_THEN + `upcrossing_count (\k. (f:num->real)(u + (N - u) - k)) a b (N - u) = + upcrossing_count (\k. f(N - k)) a b (N - u)` SUBST_ALL_TAC THENL [ + MP_TAC(REWRITE_RULE[BETA_THM] + (INST [`N - u:num`, `n:num`] + (SPECL [`\k:num. (f:num->real)(u + n - k)`; + `\k:num. (f:num->real)(N - k)`; `a:real`; `b:real`] + (SPEC `n:num` UC_PREFIX)))) THEN + ANTS_TAC THENL [ + X_GEN_TAC `k:num` THEN DISCH_TAC THEN AP_TERM_TAC THEN ASM_ARITH_TAC; + SIMP_TAC[]]; + ALL_TAC] THEN + (* Now use UC_COMPLETES *) + SUBGOAL_THEN `upcrossing_count (\k. (f:num->real)(N - k)) a b N >= + upcrossing_count (\k. f(N - k)) a b (N - u) + 1` MP_TAC THENL [ + MATCH_MP_TAC UC_COMPLETES THEN + REWRITE_TAC[BETA_THM] THEN + SUBGOAL_THEN `N - (N - u:num) = u` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `N - N:num = 0` (fun th -> REWRITE_TAC[th]) THENL [ + ARITH_TAC; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC; + ASM_ARITH_TAC]]; + (* No crossing below a: dc_count = 0 *) + SUBGOAL_THEN `!j:num. j <= N ==> (f:num->real) j > a` ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN ASM_CASES_TAC `j = 0` THENL [ + ASM_REWRITE_TAC[real_gt] THEN + UNDISCH_TAC `(f:num->real) 0 >= b` THEN UNDISCH_TAC `a < b` THEN + REWRITE_TAC[real_ge] THEN REAL_ARITH_TAC; + SUBGOAL_THEN `~((f:num->real) j <= a)` (fun th -> REWRITE_TAC[real_gt] THEN + MESON_TAC[th; REAL_NOT_LE]) THEN + UNDISCH_TAC `~(?u:num. 1 <= u /\ u <= N /\ (f:num->real) u <= a)` THEN + REWRITE_TAC[NOT_EXISTS_THM] THEN + DISCH_THEN(MP_TAC o SPEC `j:num`) THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + MP_TAC(SPECL [`f:num->real`; `a:real`; `b:real`; `N:num`] DC_PHASE_STAYS_1) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ARITH_TAC]]);; + +let DC_LE_REV_UC = prove( + `!N (f:num->real) a b. a < b ==> + downcrossing_count f a b N <= upcrossing_count (\k. f(N - k)) a b N + 1`, + MATCH_MP_TAC num_WF THEN + X_GEN_TAC `N:num` THEN DISCH_TAC THEN + REPEAT GEN_TAC THEN DISCH_TAC THEN + ASM_CASES_TAC `N = 0` THENL [ + ASM_REWRITE_TAC[downcrossing_count; SUB_0] THEN ARITH_TAC; + ALL_TAC] THEN + ASM_CASES_TAC `(f:num->real) 0 >= b` THENL [ + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] DC_LE_REV_UC_CASE_GE) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] DC_LE_REV_UC_CASE_LT) THEN + ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]]);; + +(* --- Reversed simple_submartingale --- *) + +let SIMPLE_REVERSED_IS_SUBMARTINGALE = prove( + `!p FF (X:num->A->real) N. simple_backward_martingale p FF X + ==> simple_submartingale p (\k. FF(N - k)) (\k. X(N - k))`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_backward_martingale; simple_submartingale] THEN + STRIP_TAC THEN + REPEAT CONJ_TAC THENL [ + REWRITE_TAC[filtration] THEN CONJ_TAC THENL [ + GEN_TAC THEN UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration] THEN MESON_TAC[]; + REPEAT STRIP_TAC THEN UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC + ]; + REWRITE_TAC[simple_adapted; adapted] THEN CONJ_TAC THENL [ + GEN_TAC THEN UNDISCH_TAC `simple_adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_adapted; adapted] THEN MESON_TAC[]; + GEN_TAC THEN UNDISCH_TAC `simple_adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_adapted] THEN MESON_TAC[] + ]; + ASM_MESON_TAC[]; + X_GEN_TAC `k:num` THEN X_GEN_TAC `a:A->bool` THEN DISCH_TAC THEN + ASM_CASES_TAC `k < N:num` THENL [ + SUBGOAL_THEN + `simple_expectation p (\x. (X:num->A->real)(N - k) x * indicator_fn a x) = + simple_expectation p (\x. X(N - SUC k) x * indicator_fn a x)` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + SUBGOAL_THEN `N - k = SUC(N - SUC k)` ASSUME_TAC THENL [ + ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `!n (a:A->bool). a IN FF (SUC n) ==> + simple_expectation p (\x. (X:num->A->real) n x * indicator_fn a x) = + simple_expectation p (\x. X (SUC n) x * indicator_fn a x)` THEN + DISCH_THEN(MP_TAC o SPECL [`N - SUC k`; `a:A->bool`]) THEN + SUBGOAL_THEN `SUC(N - SUC k) = N - k` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_ARITH_TAC; + UNDISCH_TAC `(a:A->bool) IN FF(N - k:num)` THEN + SIMP_TAC[] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `N - k = 0 /\ N - SUC k = 0` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + ASM_ARITH_TAC + ] + ]);; + +(* --- Downcrossing-to-upcrossing negation identities --- *) + +let num_downcrossings = new_definition + `num_downcrossings (X:num->A->real) a b n x = + downcrossing_count (\k. X k x) a b n`;; + +let DOWNCROSSING_PHASE_EQ_NEG = prove( + `!f a b n. downcrossing_phase f a b n = + upcrossing_phase (\k. --(f k)) (--b) (--a) n`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[downcrossing_phase; upcrossing_phase] THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[downcrossing_phase; upcrossing_phase] THEN + COND_CASES_TAC THEN REAL_ARITH_TAC]);; + +let DOWNCROSSING_COUNT_EQ_NEG = prove( + `!f a b n. downcrossing_count f a b n = + upcrossing_count (\k. --(f k)) (--b) (--a) n`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL [ + REWRITE_TAC[downcrossing_count; upcrossing_count; DOWNCROSSING_PHASE_EQ_NEG]; + ASM_REWRITE_TAC[downcrossing_count; upcrossing_count; + DOWNCROSSING_PHASE_EQ_NEG] THEN + AP_TERM_TAC THEN + SUBGOAL_THEN `(f:num->real)(SUC n) <= a <=> --(f(SUC n)) >= --a` + (fun th -> REWRITE_TAC[th]) THEN + REAL_ARITH_TAC]);; + +let NUM_DOWNCROSSINGS_MONO = prove( + `!X a b (m:num) n (x:A). m <= n ==> + num_downcrossings X a b m x <= num_downcrossings X a b n x`, + REPEAT GEN_TAC THEN REWRITE_TAC[num_downcrossings; DOWNCROSSING_COUNT_EQ_NEG] THEN + MATCH_ACCEPT_TAC UPCROSSING_COUNT_INCREASING);; + +(* --- Auxiliary measurability lemmas --- *) + +let SUB_SIGMA_ALGEBRA_SELF = prove( + `!p:A prob_space. sub_sigma_algebra p (prob_events p)`, + GEN_TAC THEN REWRITE_TAC[sub_sigma_algebra; SUBSET_REFL] THEN + REWRITE_TAC[prob_carrier; PROB_SPACE_SIGMA_ALGEBRA]);; + +(* --- Simple RV for downcrossing counts --- *) + +let SIMPLE_RV_NUM_DOWNCROSSINGS = prove( + `!(p:A prob_space) (X:num->A->real) a b n. + (!n. simple_rv p (X n)) + ==> simple_rv p (\x. &(num_downcrossings X a b n x))`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[num_downcrossings; DOWNCROSSING_COUNT_EQ_NEG] THEN + SUBGOAL_THEN + `(\x:A. &(upcrossing_count (\k. --((X:num->A->real) k x)) (--b) (--a) n)) = + (\x. &(num_upcrossings (\k. \x. --(X k x)) (--b) (--a) n x))` + SUBST1_TAC THENL [ + REWRITE_TAC[FUN_EQ_THM; num_upcrossings]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\n:num. prob_events (p:A prob_space)`; + `\k:num. \x:A. --((X:num->A->real) k x)`; + `--b:real`; `--a:real`] + SIMPLE_RV_NUM_UPCROSSINGS) THEN + ANTS_TAC THENL [ + CONJ_TAC THENL [ + REWRITE_TAC[filtration; SUB_SIGMA_ALGEBRA_SELF; SUBSET_REFL]; ALL_TAC] THEN + CONJ_TAC THENL [ + REWRITE_TAC[adapted] THEN X_GEN_TAC `m:num` THEN + MP_TAC(MATCH_MP SIMPLE_RV_NEG + (SPEC `m:num` + (ASSUME `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)`))) THEN + REWRITE_TAC[simple_rv; random_variable; measurable_wrt] THEN MESON_TAC[]; + GEN_TAC THEN REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_RV_NEG THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]]; + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[]]);; + +let SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT = prove( + `!(p:A prob_space) (X:num->A->real) a b n k. + (!m. simple_rv p (X m)) + ==> {x | x IN prob_carrier p /\ &(num_downcrossings X a b n x) >= &k} + IN prob_events p`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC SIMPLE_RV_GE_EVENT THEN + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] SIMPLE_RV_NUM_DOWNCROSSINGS) THEN + ASM_REWRITE_TAC[]);; + +(* --- Backward downcrossing bounds --- *) + +let BACKWARD_DOWNCROSSING_EXPECTATION_BOUND = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b N M. + simple_backward_martingale p FF X /\ a < b /\ + (!m x. x IN prob_carrier p ==> abs(X m x) <= M) + ==> (b - a) * simple_expectation p (\x. &(num_downcrossings X a b N x)) + <= M + abs a + (b - a)`, + REPEAT STRIP_TAC THEN + (* Pointwise bound: dc <= uc_rev + 1 *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + &(num_downcrossings (X:num->A->real) a b N x) <= + &(num_upcrossings (\k. X(N - k)) a b N x) + &1` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN REWRITE_TAC[num_downcrossings; num_upcrossings] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE] THEN + MATCH_MP_TAC DC_LE_REV_UC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Get reversed simple_submartingale *) + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `N:num`] SIMPLE_REVERSED_IS_SUBMARTINGALE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN DISCH_TAC THEN + (* Upcrossing expectation bound for reversed *) + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N - k)`; + `\k:num. (X:num->A->real)(N - k)`; `a:real`; `b:real`; + `N:num`; `M:real`] + SIMPLE_UPCROSSING_EXPECTATION_BOUND) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN + (* simple_rv for dc *) + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. &(num_downcrossings (X:num->A->real) a b N x))` + ASSUME_TAC THENL [ + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] SIMPLE_RV_NUM_DOWNCROSSINGS) THEN + UNDISCH_TAC `simple_backward_martingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_backward_martingale] THEN MESON_TAC[]; + ALL_TAC] THEN + (* simple_rv for uc_rev *) + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x))` + ASSUME_TAC THENL [ + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N - k)`; + `\k:num. (X:num->A->real)(N - k)`; `a:real`; `b:real`] + SIMPLE_RV_NUM_UPCROSSINGS) THEN + REWRITE_TAC[BETA_THM] THEN + ANTS_TAC THENL [ + UNDISCH_TAC `simple_submartingale (p:A prob_space) (\k. FF (N - k)) (\k. X (N - k))` THEN + REWRITE_TAC[simple_submartingale; simple_adapted] THEN MESON_TAC[]; + DISCH_THEN(MP_TAC o SPEC `N:num`) THEN REWRITE_TAC[]]; + ALL_TAC] THEN + (* simple_rv for uc_rev + 1 *) + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x) + &1)` + ASSUME_TAC THENL [ + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] SIMPLE_RV_ADD) THEN + ASM_REWRITE_TAC[SIMPLE_RV_CONST]; + ALL_TAC] THEN + (* Main chain: (b-a)*E[dc] <= (b-a)*(E[uc_rev] + 1) <= (M+|a|) + (b-a) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(b - a) * (simple_expectation (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x)) + &1)` THEN + CONJ_TAC THENL [ + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* E[dc] <= E[uc_rev] + 1 via monotonicity and linearity *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x) + &1)` THEN + CONJ_TAC THENL [ + (* E[dc] <= E[uc_rev + 1] by SIMPLE_EXPECTATION_MONO *) + MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN ASM_REWRITE_TAC[]; + (* E[uc_rev + 1] = E[uc_rev] + 1 >= E[uc_rev] + 1 *) + MP_TAC(CONV_RULE(DEPTH_CONV BETA_CONV) + (ISPECL [`p:A prob_space`; + `\x:A. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x)`; + `\x:A. &1`] SIMPLE_EXPECTATION_ADD)) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[SIMPLE_RV_CONST]; ALL_TAC] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th; SIMPLE_EXPECTATION_CONST]) THEN + REAL_ARITH_TAC]; + (* (b-a)*(E[uc_rev] + 1) <= M + |a| + (b-a) *) + REWRITE_TAC[REAL_ADD_RDISTRIB; REAL_MUL_RID] THEN ASM_REAL_ARITH_TAC]);; + +let DOWNCROSSING_PROB_BOUND = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) + a b n M (k:num). + simple_backward_martingale p FF X /\ a < b /\ + (!m x. x IN prob_carrier p ==> abs(X m x) <= M) /\ 0 < k + ==> prob p {x | x IN prob_carrier p /\ + &(num_downcrossings X a b n x) >= &k} + <= (M + abs a + (b - a)) / ((b - a) * &k)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `simple_expectation (p:A prob_space) + (\x. &(num_downcrossings (X:num->A->real) a b n x)) / &k` THEN + CONJ_TAC THENL [ + (* Markov inequality *) + MATCH_MP_TAC MARKOV_INEQUALITY_SIMPLE THEN + CONJ_TAC THENL [ + MATCH_MP_TAC(REWRITE_RULE[IMP_IMP] SIMPLE_RV_NUM_DOWNCROSSINGS) THEN + UNDISCH_TAC `simple_backward_martingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_backward_martingale] THEN MESON_TAC[]; + CONJ_TAC THENL [ + REWRITE_TAC[num_downcrossings] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_POS]; + ASM_REWRITE_TAC[REAL_OF_NUM_LT]]]; + (* E[dc]/k <= (M + |a| + (b-a)) / ((b-a) * k) *) + REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN + CONJ_TAC THENL [ + ALL_TAC; + MATCH_MP_TAC REAL_LE_INV THEN REWRITE_TAC[REAL_POS]] THEN + (* E[dc] <= (M + |a| + (b-a)) * inv(b-a) *) + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`; `M:real`] + BACKWARD_DOWNCROSSING_EXPECTATION_BOUND) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < b - a` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[GSYM real_div; GSYM REAL_LE_LDIV_EQ] THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]]);; + +let INFINITE_DOWNCROSSINGS_NULL = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b M. + simple_backward_martingale p FF X /\ a < b /\ + (!m x. x IN prob_carrier p ==> abs(X m x) <= M) + ==> !k. 0 < k ==> + prob p (UNIONS { + {x | x IN prob_carrier p /\ &(num_downcrossings X a b n x) >= &k} + | n IN (:num)}) <= (M + abs a + (b - a)) / ((b - a) * &k)`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_UNIONS_INCREASING_BOUND THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ + UNDISCH_TAC `simple_backward_martingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_backward_martingale] THEN MESON_TAC[]; + ALL_TAC] THEN + REPEAT CONJ_TAC THENL [ + (* A n IN events *) + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT THEN + ASM_REWRITE_TAC[]; + (* A n SUBSET A (SUC n) *) + X_GEN_TAC `nn:num` THEN REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge; + REAL_OF_NUM_LE] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[NUM_DOWNCROSSINGS_MONO; LE_TRANS; + ARITH_RULE `nn <= SUC nn`]; + (* P(A n) <= c *) + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `nn:num`; + `M:real`; `k:num`] DOWNCROSSING_PROB_BOUND) THEN + DISCH_TAC THEN FIRST_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]);; + +(* --- Backward simple_martingale convergence --- *) + +let FINITE_DOWNCROSSINGS_AS = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b M. + simple_backward_martingale p FF X /\ a < b /\ + (!m x. x IN prob_carrier p ==> abs(X m x) <= M) + ==> almost_surely p + {x | ?B:num. !n. num_downcrossings X a b n x <= B}`, + REPEAT STRIP_TAC THEN REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN `!m:num. simple_rv (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL [ + UNDISCH_TAC `simple_backward_martingale (p:A prob_space) FF X` THEN + REWRITE_TAC[simple_backward_martingale] THEN MESON_TAC[]; + ALL_TAC] THEN + EXISTS_TAC + `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `(M + abs(a:real) + (b - a)) / (b - a)` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT THEN + ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &(SUC j)} + | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC SIMPLE_NUM_DOWNCROSSINGS_GE_EVENT THEN + ASM_REWRITE_TAC[]; + SET_TAC[]]; + SUBGOAL_THEN `(M + abs(a:real) + (b - a)) / (b - a) / &(SUC j) = + (M + abs a + (b - a)) / ((b - a) * &(SUC j))` + SUBST1_TAC THENL + [REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `M:real`] + INFINITE_DOWNCROSSINGS_NULL) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `SUC j`) THEN + REWRITE_TAC[LT_0]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS] THEN + REWRITE_TAC[EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM; + real_ge; REAL_OF_NUM_LE] THEN + FIRST_X_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_LE] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]);; + +(* Deterministic convergence from finite downcrossings *) + +let BOUNDED_FINITE_DOWNCROSSINGS_IMP_CONVERGENT = prove( + `!f M. (!n. abs(f n) <= M) /\ + (!a b. rational a /\ rational b /\ a < b + ==> ?B. !n. downcrossing_count f a b n <= B) + ==> ?L. (f ---> L) sequentially`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`\n:num. --(f n:real)`; `M:real`] + BOUNDED_FINITE_UPCROSSINGS_IMP_CONVERGENT) THEN + ANTS_TAC THENL [ + CONJ_TAC THENL [ + GEN_TAC THEN REWRITE_TAC[REAL_ABS_NEG] THEN ASM_REWRITE_TAC[]; + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`--b:real`; `--a:real`]) THEN + ANTS_TAC THENL [ + ASM_SIMP_TAC[RATIONAL_NEG] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[DOWNCROSSING_COUNT_EQ_NEG; REAL_NEG_NEG]]]; + DISCH_THEN(X_CHOOSE_TAC `L:real`) THEN + EXISTS_TAC `--L:real` THEN + MP_TAC(CONV_RULE(DEPTH_CONV BETA_CONV) + (ISPECL [`sequentially`; `\n:num. --(f n:real)`; `L:real`] + REALLIM_NEG)) THEN + ASM_REWRITE_TAC[REAL_NEG_NEG; ETA_AX]]);; + +let SIMPLE_BACKWARD_MARTINGALE_CONVERGENCE_BOUNDED = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) M. + simple_backward_martingale p FF X /\ + (!m x. x IN prob_carrier p ==> abs(X m x) <= M) + ==> almost_surely p + {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT STRIP_TAC THEN + MP_TAC RATIONAL_ENUMERATION THEN + DISCH_THEN(X_CHOOSE_TAC `g:num->real`) THEN + (* Step 1: For each k, the downcrossing bound property is a.s. *) + SUBGOAL_THEN + `!k. almost_surely (p:A prob_space) + {x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN + ASM_CASES_TAC `(g:num->real)(NUMFST k) < g(NUMSND k)` THENL + [(* Case a < b: use FINITE_DOWNCROSSINGS_AS *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ?B. !n. num_downcrossings (X:num->A->real) + ((g:num->real)(NUMFST k)) (g(NUMSND k)) n x <= B}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_DOWNCROSSINGS_AS THEN + MAP_EVERY EXISTS_TAC + [`FF:num->(A->bool)->bool`; `M:real`] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + (* Case a >= b: S_k = UNIV, trivially a.s. *) + SUBGOAL_THEN + `{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} = (:A)` + (fun th -> REWRITE_TAC[th; ALMOST_SURELY_UNIV]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNIV] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Step 2+3: a.s. of intersection => convergence *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `INTERS {{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} + | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]; + (* Containment: INTERS membership => convergence *) + REWRITE_TAC[IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTERS] THEN DISCH_TAC THEN + (* Extract: for all k, the downcrossing bound property holds *) + SUBGOAL_THEN + `!k. (g:num->real)(NUMFST k) < g(NUMSND k) + ==> ?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | (g:num->real)(NUMFST (k:num)) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}`) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `k:num` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Apply BOUNDED_FINITE_DOWNCROSSINGS_IMP_CONVERGENT *) + MP_TAC(ISPECL [`\n:num. (X:num->A->real) n x`; `M:real`] + BOUNDED_FINITE_DOWNCROSSINGS_IMP_CONVERGENT) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN + (* Find i,j with g(i) = a, g(j) = b *) + SUBGOAL_THEN `?i:num. (g:num->real) i = a` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `a:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `?j:num. (g:num->real) j = b` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `b:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + (* Use k = NUMPAIR i j *) + FIRST_X_ASSUM(MP_TAC o SPEC `NUMPAIR i j`) THEN + REWRITE_TAC[NUMPAIR_DEST] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:num`) THEN + EXISTS_TAC `B:num` THEN X_GEN_TAC `n:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[num_downcrossings]; + ALL_TAC] THEN + REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* BACKWARD MARTINGALE CONVERGENCE: L^1-BOUNDED (GENERAL) CASE *) +(* ========================================================================= *) + +(* Generalize SIMPLE_REVERSED_IS_SUBMARTINGALE to backward_martingale => submartingale *) + +let REVERSED_IS_SUBMARTINGALE = prove( + `!p FF (X:num->A->real) N. backward_martingale p FF X + ==> submartingale p (\k. FF(N - k)) (\k. X(N - k))`, + REPEAT GEN_TAC THEN REWRITE_TAC[backward_martingale; submartingale] THEN + STRIP_TAC THEN + REPEAT CONJ_TAC THENL [ + REWRITE_TAC[filtration] THEN CONJ_TAC THENL [ + GEN_TAC THEN UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration] THEN MESON_TAC[]; + REPEAT STRIP_TAC THEN + UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]; + REWRITE_TAC[adapted] THEN GEN_TAC THEN + UNDISCH_TAC `adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[adapted] THEN MESON_TAC[]; + ASM_MESON_TAC[]; + X_GEN_TAC `k:num` THEN X_GEN_TAC `a:A->bool` THEN DISCH_TAC THEN + ASM_CASES_TAC `k < N:num` THENL [ + SUBGOAL_THEN `N - k = SUC(N - SUC k)` ASSUME_TAC THENL [ + ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x. (X:num->A->real)(N - k) x * indicator_fn a x) = + expectation p (\x. X(N - SUC k) x * indicator_fn a x)` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`N - SUC k`; `a:A->bool`]) THEN + SUBGOAL_THEN `SUC(N - SUC k) = N - k` (fun th -> REWRITE_TAC[th]) THENL [ + ASM_ARITH_TAC; + ASM_SIMP_TAC[] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `N - k = 0 /\ N - SUC k = 0` + (fun th -> REWRITE_TAC[th; REAL_LE_REFL]) THEN + ASM_ARITH_TAC]]);; + +(* Constant filtration is a filtration *) +let FILTRATION_CONST_EVENTS = prove( + `!p:A prob_space. filtration p (\n:num. prob_events p)`, + REWRITE_TAC[filtration; SUB_SIGMA_ALGEBRA_SELF; SUBSET_REFL]);; + +(* Negation is adapted to prob_events for backward martingale *) +let ADAPTED_NEG_BACKWARD = prove( + `!p:A prob_space FF (X:num->A->real). + backward_martingale p FF X + ==> adapted p (\n:num. prob_events p) (\n. \x. --(X n x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[backward_martingale] THEN STRIP_TAC THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + X_GEN_TAC `n:num` THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ --((X:num->A->real) n x) <= v} = + {x | x IN prob_carrier p /\ X n x >= --v}` SUBST1_TAC THENL [ + REWRITE_TAC[EXTENSION; IN_ELIM_THM; real_ge] THEN + GEN_TAC THEN AP_TERM_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + REWRITE_TAC[random_variable] THEN GEN_TAC THEN + UNDISCH_TAC `adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN + UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration; sub_sigma_algebra; SUBSET] THEN + MESON_TAC[]);; + +(* ========================================================================= *) +(* HELPER LEMMAS FOR DOOB DECOMPOSITION *) +(* ========================================================================= *) + + +(* ========================================================================= *) +(* GENERAL CONDITIONAL EXPECTATION VIA RADON-NIKODYM *) +(* ========================================================================= *) + +(* The current atom-based cond_exp requires FINITE G. This section defines + gen_cond_exp for arbitrary sub-sigma-algebras using the Radon-Nikodym + theorem applied to a restricted probability space. *) + +(* --- Step 1: Restricted probability space construction --- *) + +(* Verify the prob_space predicate for (G, prob p) *) +let SUB_SIGMA_ALGEBRA_PRED = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + sigma_algebra G /\ + (!a. a IN G ==> &0 <= prob p a) /\ + prob p (UNIONS G) = &1 /\ + prob p {} = &0 /\ + (!A. (!n. A n IN G) /\ (!i j. ~(i = j) ==> DISJOINT (A i) (A j)) + ==> ((\n. prob p (A n)) real_sums + prob p (UNIONS {A n | n IN (:num)})) (from 0))`, + REPEAT GEN_TAC THEN REWRITE_TAC[sub_sigma_algebra] THEN STRIP_TAC THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_POSITIVE THEN ASM SET_TAC[]; + ASM_REWRITE_TAC[GSYM prob_carrier; PROB_SPACE]; + REWRITE_TAC[PROB_EMPTY]; + REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_COUNTABLY_ADDITIVE THEN + CONJ_TAC THENL + [GEN_TAC THEN ASM SET_TAC[]; + ASM_REWRITE_TAC[]]]);; + +(* Restricted probability space: replace events with sub-sigma-algebra G, + keeping the same probability measure *) +let restrict_prob_space = new_definition + `restrict_prob_space (p:A prob_space) (G:(A->bool)->bool) = + prob_space(G:(A->bool)->bool, prob p)`;; + +(* The type bijection gives us that prob_space_operations inverts *) +let RESTRICT_PROB_SPACE_OPS = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + prob_space_operations (restrict_prob_space p G) = (G, prob p)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[restrict_prob_space] THEN + MP_TAC(ISPEC `(G:(A->bool)->bool, prob (p:A prob_space))` + (CONJUNCT2 prob_space_tybij)) THEN + REWRITE_TAC[FST; SND] THEN + DISCH_THEN(fun th -> REWRITE_TAC[GSYM th]) THEN + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_PRED THEN ASM_REWRITE_TAC[]);; + +(* Extract individual properties *) +let RESTRICT_PROB_SPACE_EVENTS = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + prob_events (restrict_prob_space p G) = G`, + REPEAT STRIP_TAC THEN REWRITE_TAC[prob_events] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_OPS; FST]);; + +let RESTRICT_PROB_SPACE_PROB = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + prob (restrict_prob_space p G) = prob p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[prob] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_OPS; SND] THEN + REWRITE_TAC[GSYM prob]);; + +let RESTRICT_PROB_SPACE_CARRIER = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + prob_carrier (restrict_prob_space p G) = prob_carrier p`, + REPEAT STRIP_TAC THEN REWRITE_TAC[prob_carrier] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [sub_sigma_algebra]) THEN + REWRITE_TAC[prob_carrier] THEN SIMP_TAC[]);; + +(* --- Step 2: Simple function transfer --- *) + +(* simple_expectation depends only on prob_carrier and prob, so it agrees *) +let SIMPLE_EXPECTATION_RESTRICT = prove + (`!p:A prob_space G (g:A->real). sub_sigma_algebra p G ==> + simple_expectation (restrict_prob_space p G) g = simple_expectation p g`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_expectation] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER; RESTRICT_PROB_SPACE_PROB]);; + +(* Helper: if s IN G and G SUBSET H then s IN H *) +let IN_SUBSET_TRANSFER = MESON[SUBSET] + `!s:A->bool G H. s IN G /\ G SUBSET H ==> s IN H`;; + +(* Helper: G SUBSET prob_events p from sub_sigma_algebra *) +let SUB_SIGMA_ALGEBRA_SUBSET = prove + (`!p:A prob_space G. sub_sigma_algebra p G ==> + G SUBSET prob_events p`, + REWRITE_TAC[sub_sigma_algebra] THEN MESON_TAC[]);; + +(* simple_rv on restricted space implies simple_rv on original space *) +let SIMPLE_RV_RESTRICT_FORWARD = prove + (`!p:A prob_space G (g:A->real). + sub_sigma_algebra p G /\ simple_rv (restrict_prob_space p G) g + ==> simple_rv p g`, + REPEAT GEN_TAC THEN REWRITE_TAC[simple_rv; random_variable] THEN + STRIP_TAC THEN + SUBGOAL_THEN `prob_carrier (restrict_prob_space (p:A prob_space) G) = + prob_carrier p` ASSUME_TAC THENL + [ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN `prob_events (restrict_prob_space (p:A prob_space) G) = G` + ASSUME_TAC THENL + [ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN `(G:(A->bool)->bool) SUBSET prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC IN_SUBSET_TRANSFER THEN + EXISTS_TAC `G:(A->bool)->bool` THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `a:real`) THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + SUBGOAL_THEN `{(g:A->real) x | x IN prob_carrier p} = + {g x | x IN prob_carrier (restrict_prob_space (p:A prob_space) G)}` + (fun th -> REWRITE_TAC[th]) THENL + [ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]; ASM_REWRITE_TAC[]]]);; + +(* random_variable on restricted space implies random_variable on original *) +let RANDOM_VARIABLE_RESTRICT_FORWARD = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ random_variable (restrict_prob_space p G) f + ==> random_variable p f`, + REPEAT GEN_TAC THEN REWRITE_TAC[random_variable] THEN + STRIP_TAC THEN GEN_TAC THEN + SUBGOAL_THEN `prob_carrier (restrict_prob_space (p:A prob_space) G) = + prob_carrier p` ASSUME_TAC THENL + [ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]; ALL_TAC] THEN + SUBGOAL_THEN `prob_events (restrict_prob_space (p:A prob_space) G) = G` + ASSUME_TAC THENL + [ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN `(G:(A->bool)->bool) SUBSET prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_SUBSET THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC IN_SUBSET_TRANSFER THEN + EXISTS_TAC `G:(A->bool)->bool` THEN CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `a:real`) THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]);; + +(* nonneg_simple_fn_approx is the same on both spaces *) +let NONNEG_SIMPLE_FN_APPROX_RESTRICT = prove + (`!p:A prob_space G f n x. sub_sigma_algebra p G ==> + nonneg_simple_fn_approx (restrict_prob_space p G) f n x = + nonneg_simple_fn_approx p f n x`, + REPEAT STRIP_TAC THEN REWRITE_TAC[nonneg_simple_fn_approx] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]);; + +(* --- Step 3: nn_expectation transfer (bounded case) --- *) + +(* Key lemma: nn_expectation agrees for bounded nonneg G-measurable functions *) +let NN_EXPECTATION_RESTRICT_BOUNDED = prove + (`!p:A prob_space G (f:A->real) M. + sub_sigma_algebra p G /\ + random_variable (restrict_prob_space p G) f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!x. x IN prob_carrier p ==> f x <= M) /\ + &0 <= M + ==> nn_expectation (restrict_prob_space p G) f = nn_expectation p f`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REAL_ARITH `a <= b /\ b <= a ==> a = b`) THEN CONJ_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_LE_FROM_SIMPLE THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_RESTRICT] THEN + MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_RESTRICT_FORWARD THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UBOUND) THEN + EXISTS_TAC + `\n. simple_expectation p + (nonneg_simple_fn_approx p (f:A->real) n)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY] THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_MCT_NN_EXPECTATION THEN + SUBGOAL_THEN `random_variable p (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_RESTRICT_FORWARD THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; + REPEAT STRIP_TAC THEN MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_MONO THEN + ASM_SIMP_TAC[ARITH_RULE `n <= SUC n`]; + ASM_SIMP_TAC[NONNEG_SIMPLE_FN_APPROX_CONVERGES]; + EXISTS_TAC `M:real` THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `0` THEN X_GEN_TAC `n:num` THEN DISCH_TAC THEN + REWRITE_TAC[] THEN + ASM_SIMP_TAC[GSYM SIMPLE_EXPECTATION_RESTRICT] THEN + SUBGOAL_THEN + `nonneg_simple_fn_approx p (f:A->real) n = + nonneg_simple_fn_approx (restrict_prob_space p G) f n` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN + GEN_TAC THEN MATCH_MP_TAC(GSYM NONNEG_SIMPLE_FN_APPROX_RESTRICT) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_SIMPLE_RV THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]; + REWRITE_TAC[NONNEG_SIMPLE_FN_APPROX_NONNEG]; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC NONNEG_SIMPLE_FN_APPROX_LE THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]; + EXISTS_TAC `M:real` THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER]]]]);; + +(* --- Step 4: Integrability and expectation transfer --- *) + +(* Integrability transfers from restricted to original space *) +let INTEGRABLE_RESTRICT_IMP = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ + integrable (restrict_prob_space p G) f + ==> integrable p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[integrable] THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_RESTRICT_FORWARD THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[integrable]) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER; SIMPLE_EXPECTATION_RESTRICT] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC MP_TAC) THEN + DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN EXISTS_TAC `B:real` THEN + X_GEN_TAC `g:A->real` THEN STRIP_TAC THEN + SUBGOAL_THEN `?Bg. !x:A. x IN prob_carrier p ==> (g:A->real) x <= Bg` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_BOUNDED THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation (restrict_prob_space (p:A prob_space) G) + (\x:A. min (abs ((f:A->real) x)) (max (Bg:real) (&0)))` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `nn_expectation (restrict_prob_space (p:A prob_space) G) + (\x:A. min (abs ((f:A->real) x)) (max Bg (&0))) = + nn_expectation p (\x. min (abs (f x)) (max Bg (&0)))` + SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_RESTRICT_BOUNDED THEN + EXISTS_TAC `max Bg (&0)` THEN + ASM_REWRITE_TAC[REAL_ARITH `&0 <= max x (&0)`] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_ABS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(g:A->real) y <= abs((f:A->real) y)` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(g:A->real) y <= Bg` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + EXISTS_TAC `max Bg (&0)` THEN X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REAL_ARITH_TAC]; + MATCH_MP_TAC(ISPEC `restrict_prob_space (p:A prob_space) G` + NN_EXPECTATION_LE_FROM_SIMPLE) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN CONJ_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_RESTRICT] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(h:A->real) y <= min (abs((f:A->real) y)) (max Bg (&0))` + MP_TAC THENL + [ASM_MESON_TAC[]; REAL_ARITH_TAC]]]);; + +(* nn_expectation agrees for general nonneg G-measurable integrable functions *) +let NN_EXPECTATION_RESTRICT = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ + random_variable (restrict_prob_space p G) f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + integrable (restrict_prob_space p G) f + ==> nn_expectation (restrict_prob_space p G) f = nn_expectation p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `integrable p (f:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_RESTRICT_IMP THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `a <= b /\ b <= a ==> a = b`) THEN CONJ_TAC THENL + [(* Direction 1: restrict <= original *) + MATCH_MP_TAC(ISPEC `restrict_prob_space (p:A prob_space) G` + NN_EXPECTATION_LE_FROM_SIMPLE) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + ASM_SIMP_TAC[SIMPLE_EXPECTATION_RESTRICT] THEN + SUBGOAL_THEN `simple_rv p (h:A->real)` ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_RESTRICT_FORWARD THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `?K. !x:A. x IN prob_carrier p ==> (h:A->real) x <= K` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_BOUNDED THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation (p:A prob_space) + (\x:A. min ((f:A->real) x) (max K (&0)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(h:A->real) y <= (f:A->real) y` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(h:A->real) y <= K` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + EXISTS_TAC `max K (&0)` THEN X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REAL_ARITH_TAC]; + MATCH_MP_TAC NN_EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= (f:A->real) y` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ASM_REAL_ARITH_TAC]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN REAL_ARITH_TAC]]; + (* Direction 2: original <= restrict *) + MATCH_MP_TAC NN_EXPECTATION_LE_FROM_SIMPLE THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + SUBGOAL_THEN `?K. !x:A. x IN prob_carrier p ==> (h:A->real) x <= K` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_BOUNDED THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `nn_expectation (p:A prob_space) + (\x:A. min ((f:A->real) x) (max K (&0)))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC BOUNDED_NN_EXPECTATION_GE_SIMPLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(h:A->real) y <= (f:A->real) y` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(h:A->real) y <= K` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REAL_ARITH_TAC; + EXISTS_TAC `max K (&0)` THEN X_GEN_TAC `y:A` THEN DISCH_TAC THEN + REAL_ARITH_TAC]; + SUBGOAL_THEN + `nn_expectation (p:A prob_space) (\x:A. min ((f:A->real) x) (max K (&0))) = + nn_expectation (restrict_prob_space p G) (\x. min (f x) (max K (&0)))` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM NN_EXPECTATION_RESTRICT_BOUNDED) THEN + EXISTS_TAC `max K (&0)` THEN + ASM_REWRITE_TAC[REAL_ARITH `&0 <= max x (&0)`] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MIN THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= (f:A->real) y` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ASM_REAL_ARITH_TAC]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN REAL_ARITH_TAC]; + MATCH_MP_TAC(ISPEC `restrict_prob_space (p:A prob_space) G` + NN_EXPECTATION_MONO) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + REPEAT CONJ_TAC THENL + [X_GEN_TAC `y:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= (f:A->real) y` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ASM_REAL_ARITH_TAC]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN REAL_ARITH_TAC]]]]);; + +(* Expectation agrees for integrable G-measurable functions *) +let EXPECTATION_RESTRICT = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ + integrable (restrict_prob_space p G) f + ==> expectation (restrict_prob_space p G) f = expectation p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[expectation] THEN + SUBGOAL_THEN + `random_variable (restrict_prob_space (p:A prob_space) G) (f:A->real)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `nn_expectation (restrict_prob_space (p:A prob_space) G) + (\x:A. max ((f:A->real) x) (&0)) = + nn_expectation p (\x. max (f x) (&0))` + SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_RESTRICT THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_POS_PART THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN + `nn_expectation (restrict_prob_space (p:A prob_space) G) + (\x:A. max (--((f:A->real) x)) (&0)) = + nn_expectation p (\x. max (--f x) (&0))` + SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_RESTRICT THEN ASM_REWRITE_TAC[] THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_MAX THEN CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_NEG THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER] THEN + GEN_TAC THEN DISCH_TAC THEN REAL_ARITH_TAC; + MATCH_MP_TAC INTEGRABLE_NEG_PART THEN ASM_REWRITE_TAC[]]; + REWRITE_TAC[]]);; + +(* --- Step 5: General conditional expectation definition --- *) + +let gen_cond_exp = new_definition + `gen_cond_exp (p:A prob_space) (G:(A->bool)->bool) (X:A->real) = + @f. measurable_wrt p G f /\ integrable p f /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. X x * indicator_fn A x))`;; + +(* --- Step 6: Existence of gen_cond_exp --- *) + +(* Helper: absolutely_continuous transfers from p to restricted space *) +let ABSOLUTELY_CONTINUOUS_RESTRICT = prove + (`!p:A prob_space G mu. + sub_sigma_algebra p G /\ absolutely_continuous p mu + ==> absolutely_continuous (restrict_prob_space p G) mu`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[absolutely_continuous] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS; RESTRICT_PROB_SPACE_PROB] THEN + CONJ_TAC THENL + [REWRITE_TAC[signed_measure] THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS] THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[absolutely_continuous]) THEN + DISCH_THEN(CONJUNCTS_THEN2 MP_TAC (K ALL_TAC)) THEN + REWRITE_TAC[signed_measure] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `A:num->A->bool`) THEN + SUBGOAL_THEN `(G:(A->bool)->bool) SUBSET prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_SUBSET THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ANTS_TAC THENL + [CONJ_TAC THENL [ASM_MESON_TAC[SUBSET]; ASM_REWRITE_TAC[]]; + REWRITE_TAC[]]; + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[absolutely_continuous]) THEN + STRIP_TAC THEN + REPEAT STRIP_TAC THEN FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(G:(A->bool)->bool) SUBSET prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_SUBSET THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[SUBSET]]]);; + +(* Existence of gen_cond_exp via Radon-Nikodym on restricted space *) +let GEN_COND_EXP_EXISTS = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X + ==> ?f. measurable_wrt p G f /\ integrable p f /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. X x * indicator_fn A x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `absolutely_continuous (restrict_prob_space (p:A prob_space) G) + (\A. expectation p (\x. (X:A->real) x * indicator_fn A x))` + ASSUME_TAC THENL + [MATCH_MP_TAC ABSOLUTELY_CONTINUOUS_RESTRICT THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC ABSOLUTELY_CONTINUOUS_FROM_INTEGRAL THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL + [`restrict_prob_space (p:A prob_space) G`; + `\A. expectation (p:A prob_space) (\x. (X:A->real) x * indicator_fn A x)`] + RADON_NIKODYM) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `f:A->real` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `f:A->real` THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS] THEN + REPEAT CONJ_TAC THENL + [(* measurable_wrt p G f *) + REWRITE_TAC[measurable_wrt] THEN GEN_TAC THEN + SUBGOAL_THEN + `random_variable (restrict_prob_space (p:A prob_space) G) (f:A->real)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[random_variable]) THEN + DISCH_THEN(MP_TAC o SPEC `v:real`) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_CARRIER; RESTRICT_PROB_SPACE_EVENTS]; + (* integrable p f *) + MATCH_MP_TAC INTEGRABLE_RESTRICT_IMP THEN + EXISTS_TAC `G:(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + (* conditioning property *) + X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. (f:A->real) x * indicator_fn A x) = + expectation (restrict_prob_space p G) (\x. f x * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_RESTRICT) THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(ISPEC `restrict_prob_space (p:A prob_space) G` + INTEGRABLE_MUL_INDICATOR_FN) THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS]; + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_SIMP_TAC[RESTRICT_PROB_SPACE_EVENTS]]]);; + +(* --- Step 7: Key properties --- *) + +let GEN_COND_EXP_CONDITIONING = prove + (`!p:A prob_space G (X:A->real) (A:A->bool). + sub_sigma_algebra p G /\ integrable p X /\ A IN G + ==> expectation p (\x. gen_cond_exp p G X x * indicator_fn A x) = + expectation p (\x. X x * indicator_fn A x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `?f:A->real. measurable_wrt p G f /\ integrable p f /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. (X:A->real) x * indicator_fn A x))` + MP_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_EXISTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> + MP_TAC(REWRITE_RULE[GSYM gen_cond_exp] (SELECT_RULE th))) THEN + STRIP_TAC THEN ASM_SIMP_TAC[]);; + +let GEN_COND_EXP_MEASURABLE_WRT = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X + ==> measurable_wrt p G (gen_cond_exp p G X)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `?f:A->real. measurable_wrt p G f /\ integrable p f /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. (X:A->real) x * indicator_fn A x))` + MP_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_EXISTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> + MP_TAC(REWRITE_RULE[GSYM gen_cond_exp] (SELECT_RULE th))) THEN + SIMP_TAC[]);; + +let GEN_COND_EXP_INTEGRABLE = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X + ==> integrable p (gen_cond_exp p G X)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `?f:A->real. measurable_wrt p G f /\ integrable p f /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. (X:A->real) x * indicator_fn A x))` + MP_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_EXISTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(fun th -> + MP_TAC(REWRITE_RULE[GSYM gen_cond_exp] (SELECT_RULE th))) THEN + SIMP_TAC[]);; + +let GEN_COND_EXP_TOWER = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X + ==> expectation p (gen_cond_exp p G X) = expectation p X`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) IN G` ASSUME_TAC THENL + [SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` MP_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + REWRITE_TAC[sigma_algebra] THEN STRIP_TAC THEN + SUBGOAL_THEN `UNIONS (G:(A->bool)->bool) = prob_carrier (p:A prob_space)` + MP_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + DISCH_THEN(SUBST1_TAC o GSYM) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (gen_cond_exp p G X) = + expectation p (\x. gen_cond_exp p G X x * + indicator_fn (prob_carrier p) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_EXT) THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (X:A->real) = + expectation p (\x. X x * indicator_fn (prob_carrier p) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_EXT) THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]);; + +(* --- Step 8: Additional gen_cond_exp properties --- *) + +(* Doob martingale: conditional expectations form a martingale *) +let GEN_DOOB_MARTINGALE = prove + (`!p:A prob_space FF (X:A->real). + filtration p FF /\ integrable p X + ==> martingale p FF (\n. gen_cond_exp p (FF n) X)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[martingale; adapted] THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [(* measurable_wrt *) + GEN_TAC THEN MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; + (* integrable *) + GEN_TAC THEN MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; + (* martingale property *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p (FF (SUC n)) (X:A->real) x * + indicator_fn a x) = + expectation p (\x. X x * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC; + ASM_MESON_TAC[SUBSET]]]; + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]]]);; + +(* {x | carrier /\ X x < v} IN G for G-measurable X *) +let MEASURABLE_WRT_STRICT_LT = prove + (`!p:A prob_space G (X:A->real) v. + sub_sigma_algebra p G /\ measurable_wrt p G X + ==> {x | x IN prob_carrier p /\ X x < v} IN G`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[ISPECL [`X:A->real`; `v:real`; `prob_carrier (p:A prob_space)`] + OPEN_HALFLINE_AS_UNION] THEN + MATCH_MP_TAC SIGMA_ALGEBRA_UNION_COUNTABLE THEN + CONJ_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `s:A->bool` THEN DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `measurable_wrt (p:A prob_space) G X` THEN + REWRITE_TAC[measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `v - inv(&n + &1)`) THEN + MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM]; + REWRITE_TAC[SIMPLE_IMAGE] THEN + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]]);; + +(* --- Measurability helpers for general (non-simple) functions --- *) + +(* Negation preserves G-measurability *) +let MEASURABLE_WRT_NEG = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ measurable_wrt p G f + ==> measurable_wrt p G (\x. --f x)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[measurable_wrt] THEN + X_GEN_TAC `v:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ --f x <= v} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ f x < --v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_STRICT_LT THEN ASM_REWRITE_TAC[]]);; + +(* Scalar multiplication preserves G-measurability *) +let MEASURABLE_WRT_CMUL = prove + (`!p:A prob_space G (f:A->real) c. + sub_sigma_algebra p G /\ measurable_wrt p G f + ==> measurable_wrt p G (\x. c * f x)`, + REPEAT STRIP_TAC THEN + ASM_CASES_TAC `c = &0` THENL + [ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_CASES_TAC `c > &0` THENL + [REWRITE_TAC[measurable_wrt] THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ c * f x <= v} = + {x | x IN prob_carrier p /\ f x <= v / c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + AP_TERM_TAC THEN + SUBGOAL_THEN `&0 < c` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`(f:A->real) w`; `v:real`; `c:real`] REAL_LE_RDIV_EQ) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_MUL_SYM]; + UNDISCH_TAC `measurable_wrt (p:A prob_space) G f` THEN + REWRITE_TAC[measurable_wrt] THEN MESON_TAC[]]; + (* c < 0: c * f = --(--c * f) where --c > 0 *) + SUBGOAL_THEN `c < &0` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. c * (f:A->real) x = --(--c * f x)` + (fun th -> REWRITE_TAC[FUN_EQ_THM; th]) THENL + [GEN_TAC THEN REWRITE_TAC[REAL_MUL_LNEG; REAL_NEG_NEG]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_NEG THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[measurable_wrt] THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN `&0 < --c` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ --c * f x <= v} = + {x | x IN prob_carrier p /\ f x <= v / --c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `w:A` THEN + AP_TERM_TAC THEN + MP_TAC(SPECL [`(f:A->real) w`; `v:real`; `--c:real`] REAL_LE_RDIV_EQ) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_REWRITE_TAC[REAL_MUL_SYM]; + UNDISCH_TAC `measurable_wrt (p:A prob_space) G f` THEN + REWRITE_TAC[measurable_wrt] THEN MESON_TAC[]]]);; + +(* Density of nonneg rationals: any interval (a,b) with 0 <= a contains + a nonneg rational &n * inv(&(SUC m)) *) +let NONNEG_RATIONALS_DENSE = prove + (`!a b. &0 <= a /\ a < b + ==> ?n m. a < &n * inv(&(SUC m)) /\ &n * inv(&(SUC m)) < b`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `&0 < b - a` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPEC `b - a:real` REAL_ARCH_INV) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `K:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `?m0. K = SUC m0` (X_CHOOSE_TAC `m0:num`) THENL + [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&(SUC m0))` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `inv(&(SUC m0)) < b - a` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `?n0. a < &n0 * inv(&(SUC m0)) /\ + !k. k < n0 ==> &k * inv(&(SUC m0)) <= a` + STRIP_ASSUME_TAC THENL + [MP_TAC(ISPEC `\n. a < &n * inv(&(SUC m0))` num_WOP) THEN + REWRITE_TAC[] THEN + MATCH_MP_TAC(TAUT `a /\ (b ==> c) ==> (a <=> b) ==> c`) THEN + CONJ_TAC THENL + [MP_TAC(SPEC `inv(&(SUC m0))` REAL_ARCH) THEN + ASM_REWRITE_TAC[] THEN MESON_TAC[]; + ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[GSYM REAL_NOT_LT] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `?p. n0 = SUC p` (X_CHOOSE_TAC `p:num`) THENL + [DISJ_CASES_TAC(SPEC `n0:num` num_CASES) THENL + [UNDISCH_TAC `a < &n0 * inv(&(SUC m0))` THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC; + ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `&p * inv(&(SUC m0)) <= a` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `p:num`) THEN + UNDISCH_TAC `n0 = SUC p` THEN ARITH_TAC; + ALL_TAC] THEN + MAP_EVERY EXISTS_TAC [`n0:num`; `m0:num`] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC `a + inv(&(SUC m0))` THEN + CONJ_TAC THENL + [REWRITE_TAC[GSYM REAL_OF_NUM_SUC; REAL_ADD_RDISTRIB; REAL_MUL_LID] THEN + REWRITE_TAC[REAL_OF_NUM_SUC] THEN + ASM_REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]);; + +(* Key lemma: {f - g < c} is in G when f, g are G-measurable *) +let MEASURABLE_WRT_DIFF_LT = prove + (`!p:A prob_space G (f:A->real) (g:A->real) c. + sub_sigma_algebra p G /\ measurable_wrt p G f /\ measurable_wrt p G g + ==> {x | x IN prob_carrier p /\ f x - g x < c} IN G`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN + `!q. {x:A | x IN prob_carrier p /\ f x < q} INTER + {x | x IN prob_carrier p /\ g x > q - c} IN G` + ASSUME_TAC THENL + [GEN_TAC THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `G:(A->bool)->bool`] + SUB_SIGMA_ALGEBRA_INTER) THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MATCH_MP_TAC MEASURABLE_WRT_STRICT_LT THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ g x > q - c} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ g x <= q - c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `measurable_wrt (p:A prob_space) G g` THEN + REWRITE_TAC[measurable_wrt] THEN MESON_TAC[]]]; + ALL_TAC] THEN + SUBGOAL_THEN `sigma_algebra (G:(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + ABBREV_TAC + `S_all = + UNIONS (IMAGE (\i. + {x:A | x IN prob_carrier p /\ + f x < &(NUMFST i) * inv(&(SUC(NUMSND i)))} INTER + {x | x IN prob_carrier p /\ + g x > &(NUMFST i) * inv(&(SUC(NUMSND i))) - c}) + (:num)) + UNION + UNIONS (IMAGE (\i. + {x:A | x IN prob_carrier p /\ + f x < --(&(NUMFST i) * inv(&(SUC(NUMSND i))))} INTER + {x | x IN prob_carrier p /\ + g x > --(&(NUMFST i) * inv(&(SUC(NUMSND i)))) - c}) + (:num))` THEN + SUBGOAL_THEN `S_all:A->bool IN G` ASSUME_TAC THENL + [EXPAND_TAC "S_all" THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `G:(A->bool)->bool`] + SUB_SIGMA_ALGEBRA_UNION) THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THEN + MATCH_MP_TAC SIGMA_ALGEBRA_UNION_COUNTABLE THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]; + REWRITE_TAC[SUBSET; FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]]; + ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ f x - g x < c} = S_all` + (fun th -> ASM_REWRITE_TAC[th]) THEN + MATCH_MP_TAC SUBSET_ANTISYM THEN CONJ_TAC THENL + [(* Forward: {f - g < c} SUBSET S_all *) + EXPAND_TAC "S_all" THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNION; + IN_UNIONS; IN_IMAGE; IN_UNIV; IN_INTER] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + ASM_CASES_TAC `(g:A->real) w + c > &0` THENL + [ASM_CASES_TAC `&0 <= (f:A->real) w` THENL + [MP_TAC(SPECL [`(f:A->real) w`; `(g:A->real) w + c`] + NONNEG_RATIONALS_DENSE) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` + (X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC)) THEN + DISJ1_TAC THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + f x < &(NUMFST(NUMPAIR n m)) * inv(&(SUC(NUMSND(NUMPAIR n m))))} + INTER + {x | x IN prob_carrier p /\ + g x > &(NUMFST(NUMPAIR n m)) * + inv(&(SUC(NUMSND(NUMPAIR n m)))) - c}` THEN + CONJ_TAC THENL + [EXISTS_TAC `NUMPAIR n m` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[NUMPAIR_DEST; IN_INTER; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + (* f(w) < 0, g(w)+c > 0: use q = 0 *) + DISJ1_TAC THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + f x < &(NUMFST(NUMPAIR 0 0)) * + inv(&(SUC(NUMSND(NUMPAIR 0 0))))} INTER + {x | x IN prob_carrier p /\ + g x > &(NUMFST(NUMPAIR 0 0)) * + inv(&(SUC(NUMSND(NUMPAIR 0 0)))) - c}` THEN + CONJ_TAC THENL + [EXISTS_TAC `NUMPAIR 0 0` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[NUMPAIR_DEST; IN_INTER; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[REAL_MUL_LZERO] THEN ASM_REAL_ARITH_TAC]; + (* g(w)+c <= 0: use negative family *) + MP_TAC(SPECL [`--((g:A->real) w + c)`; `--((f:A->real) w)`] + NONNEG_RATIONALS_DENSE) THEN + ANTS_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` + (X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC)) THEN + DISJ2_TAC THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + f x < --(&(NUMFST(NUMPAIR n m)) * + inv(&(SUC(NUMSND(NUMPAIR n m)))))} INTER + {x | x IN prob_carrier p /\ + g x > --(&(NUMFST(NUMPAIR n m)) * + inv(&(SUC(NUMSND(NUMPAIR n m))))) - c}` THEN + CONJ_TAC THENL + [EXISTS_TAC `NUMPAIR n m` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[NUMPAIR_DEST; IN_INTER; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + (* Backward: S_all SUBSET {f - g < c} *) + EXPAND_TAC "S_all" THEN + REWRITE_TAC[UNION_SUBSET] THEN CONJ_TAC THEN + REWRITE_TAC[SUBSET; IN_UNIONS; IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + UNDISCH_TAC `(w:A) IN t` THEN + ASM_REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]);; + +(* Difference of G-measurable functions is G-measurable *) +let MEASURABLE_WRT_SUB = prove + (`!p:A prob_space G (f:A->real) (g:A->real). + sub_sigma_algebra p G /\ measurable_wrt p G f /\ measurable_wrt p G g + ==> measurable_wrt p G (\x. f x - g x)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[measurable_wrt] THEN + X_GEN_TAC `v:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ f x - g x <= v} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ g x - f x < --v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_DIFF_LT THEN ASM_REWRITE_TAC[]]);; + +(* Sum of G-measurable functions is G-measurable *) +let MEASURABLE_WRT_ADD = prove + (`!p:A prob_space G (f:A->real) (g:A->real). + sub_sigma_algebra p G /\ measurable_wrt p G f /\ measurable_wrt p G g + ==> measurable_wrt p G (\x. f x + g x)`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. (f:A->real) x + g x) = (\x. f x - --(g x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; real_sub; REAL_NEG_NEG]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_SUB THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_NEG THEN ASM_REWRITE_TAC[]);; + +(* --- Almost-sure uniqueness for conditional expectation --- *) + +(* If f is nonneg, G-measurable, integrable, and E[f * 1_A] = 0 for all *) +(* A in G, then f = 0 a.s. *) +let NONNEG_MEASURABLE_WRT_ZERO_INTEGRALS_AE_ZERO = prove + (`!p:A prob_space G (f:A->real). + sub_sigma_algebra p G /\ integrable p f /\ + measurable_wrt p G f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + (!A. A IN G ==> expectation p (\x. f x * indicator_fn A x) = &0) + ==> almost_surely p {x | f x = &0}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ ~(x IN {x | f x = &0})} = + {x | x IN prob_carrier p /\ ~(f x = &0)}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM]; ALL_TAC] THEN + ABBREV_TAC + `A_k = \k:num. {x:A | x IN prob_carrier p /\ + f x >= inv(&(SUC k))}` THEN + EXISTS_TAC + `UNIONS {(A_k:num->A->bool) n | n IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NULL_EVENT_COUNTABLE_UNION THEN X_GEN_TAC `k:num` THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN G` ASSUME_TAC THENL + [EXPAND_TAC "A_k" THEN BETA_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ f x >= inv(&(SUC k))} = + prob_carrier p DIFF {x | x IN prob_carrier p /\ f x < inv(&(SUC k))}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN + X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_STRICT_LT THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&(SUC k))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((A_k:num->A->bool) k) <= &0 <=> + inv(&(SUC k)) * prob p (A_k k) <= inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO]] THEN + SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((A_k:num->A->bool) k) <= + expectation p (\x. (f:A->real) x * indicator_fn (A_k k) x)` MP_TAC THENL + [SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((A_k:num->A->bool) k) = + expectation p (\x:A. inv(&(SUC k)) * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[EXPECTATION_INDICATOR]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (A_k:num->A->bool) k` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN MESON_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + FIRST_X_ASSUM(MP_TAC o SPEC `(A_k:num->A->bool) k`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + + (* Subset *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIONS] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + SUBGOAL_THEN `&0 < (f:A->real) w` MP_TAC THENL + [ASM_MESON_TAC[REAL_LT_LE]; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(A_k:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]]);; + +(* If f, g are G-measurable, integrable, and have equal integrals *) +(* against all G-sets, then f = g a.s. *) +let GEN_COND_EXP_AE_UNIQUE = prove + (`!p:A prob_space G (f:A->real) (g:A->real). + sub_sigma_algebra p G /\ + measurable_wrt p G f /\ integrable p f /\ + measurable_wrt p G g /\ integrable p g /\ + (!A. A IN G ==> + expectation p (\x. f x * indicator_fn A x) = + expectation p (\x. g x * indicator_fn A x)) + ==> almost_surely p {x | f x = g x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ ~(x IN {x | (f:A->real) x = g x})} = + {x | x IN prob_carrier p /\ ~(f x = g x)}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM]; ALL_TAC] THEN + ABBREV_TAC + `A_n = \n:num. {x:A | x IN prob_carrier p /\ + (f:A->real) x - g x >= inv(&(SUC n))}` THEN + ABBREV_TAC + `B_n = \n:num. {x:A | x IN prob_carrier p /\ + (g:A->real) x - f x >= inv(&(SUC n))}` THEN + EXISTS_TAC `UNIONS {(A_n:num->A->bool) n | n IN (:num)} UNION + UNIONS {(B_n:num->A->bool) n | n IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NULL_EVENT_UNION THEN CONJ_TAC THEN + MATCH_MP_TAC NULL_EVENT_COUNTABLE_UNION THEN X_GEN_TAC `k:num` THEN + (SUBGOAL_THEN `(&0 < inv(&(SUC k)))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC]) THENL + [(* A_n k *) + SUBGOAL_THEN `(A_n:num->A->bool) k IN G` ASSUME_TAC THENL + [EXPAND_TAC "A_n" THEN BETA_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ f x - g x >= inv(&(SUC k))} = + prob_carrier p DIFF + {x | x IN prob_carrier p /\ f x - g x < inv(&(SUC k))}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_DIFF_LT THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(A_n:num->A->bool) k IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((A_n:num->A->bool) k) <= &0 <=> + inv(&(SUC k)) * prob p (A_n k) <= inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO]] THEN + SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((A_n:num->A->bool) k) <= + expectation p (\x. ((f:A->real) x - g x) * + indicator_fn (A_n k) x)` MP_TAC THENL + [SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((A_n:num->A->bool) k) = + expectation p (\x:A. inv(&(SUC k)) * indicator_fn (A_n k) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_n:num->A->bool) k):A->real`] EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[EXPECTATION_INDICATOR]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_n:num->A->bool) k):A->real`] + INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. ((f:A->real) x - g x) * + indicator_fn ((A_n:num->A->bool) k) x) = + (\x. f x * indicator_fn (A_n k) x + + --(g x * indicator_fn (A_n k) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_NEG THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (A_n:num->A->bool) k` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "A_n" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN MESON_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. ((f:A->real) x - g x) * + indicator_fn ((A_n:num->A->bool) k) x) = + (\x. f x * indicator_fn (A_n k) x - + g x * indicator_fn (A_n k) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; + `\x:A. (f:A->real) x * indicator_fn ((A_n:num->A->bool) k) x`; + `\x:A. (g:A->real) x * indicator_fn ((A_n:num->A->bool) k) x`] + EXPECTATION_SUB) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(A_n:num->A->bool) k`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + + (* B_n k - symmetric *) + SUBGOAL_THEN `(B_n:num->A->bool) k IN G` ASSUME_TAC THENL + [EXPAND_TAC "B_n" THEN BETA_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ g x - f x >= inv(&(SUC k))} = + prob_carrier p DIFF + {x | x IN prob_carrier p /\ g x - f x < inv(&(SUC k))}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN X_GEN_TAC `w:A` THEN + ASM_CASES_TAC `(w:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MEASURABLE_WRT_DIFF_LT THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(B_n:num->A->bool) k IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((B_n:num->A->bool) k) <= &0 <=> + inv(&(SUC k)) * prob p (B_n k) <= inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO]] THEN + SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((B_n:num->A->bool) k) <= + expectation p (\x. ((g:A->real) x - f x) * + indicator_fn (B_n k) x)` MP_TAC THENL + [SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((B_n:num->A->bool) k) = + expectation p (\x:A. inv(&(SUC k)) * indicator_fn (B_n k) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((B_n:num->A->bool) k):A->real`] EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[EXPECTATION_INDICATOR]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((B_n:num->A->bool) k):A->real`] + INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. ((g:A->real) x - f x) * + indicator_fn ((B_n:num->A->bool) k) x) = + (\x. g x * indicator_fn (B_n k) x + + --(f x * indicator_fn (B_n k) x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_NEG THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (B_n:num->A->bool) k` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "B_n" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN MESON_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. ((g:A->real) x - f x) * + indicator_fn ((B_n:num->A->bool) k) x) = + (\x. g x * indicator_fn (B_n k) x - + f x * indicator_fn (B_n k) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; + `\x:A. (g:A->real) x * indicator_fn ((B_n:num->A->bool) k) x`; + `\x:A. (f:A->real) x * indicator_fn ((B_n:num->A->bool) k) x`] + EXPECTATION_SUB) THEN + BETA_TAC THEN ANTS_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `(B_n:num->A->bool) k`) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + + (* Subset *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNION; IN_UNIONS] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + SUBGOAL_THEN `(f:A->real) w > g w \/ (g:A->real) w > f w` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; + DISCH_THEN DISJ_CASES_TAC] THENL + [DISJ1_TAC THEN + SUBGOAL_THEN `&0 < (f:A->real) w - g w` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(A_n:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "A_n" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]; + + DISJ2_TAC THEN + SUBGOAL_THEN `&0 < (g:A->real) w - f w` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(B_n:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "B_n" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]]]);; + +(* Step 3: Non-negativity preservation *) +let GEN_COND_EXP_NONNEG = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X /\ + (!x. x IN prob_carrier p ==> &0 <= X x) + ==> almost_surely p {x | &0 <= gen_cond_exp p G X x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + ~(x IN {x | &0 <= gen_cond_exp p G (X:A->real) x})} = + {x | x IN prob_carrier p /\ gen_cond_exp p G X x < &0}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ABBREV_TAC + `A_k = \k:num. {x:A | x IN prob_carrier p /\ + gen_cond_exp p G (X:A->real) x < + --inv(&(SUC k))}` THEN + EXISTS_TAC `UNIONS {(A_k:num->A->bool) k | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NULL_EVENT_COUNTABLE_UNION THEN X_GEN_TAC `k:num` THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN G` ASSUME_TAC THENL + [SUBGOAL_THEN + `(A_k:num->A->bool) k = + {x:A | x IN prob_carrier p /\ + gen_cond_exp p G (X:A->real) x < --inv(&(SUC k))}` + SUBST1_TAC THENL + [EXPAND_TAC "A_k" THEN BETA_TAC THEN REFL_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `gen_cond_exp p G (X:A->real)`; `--inv(&(SUC k))`] + MEASURABLE_WRT_STRICT_LT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN + ASM_REWRITE_TAC[]; + SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&(SUC k))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x) = + expectation p (\x. X x * indicator_fn (A_k k) x)` ASSUME_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `&0 <= expectation p (\x:A. (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x)` + ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; + `\x:A. (X:A->real) x * indicator_fn ((A_k:num->A->bool) k) x`] + EXPECTATION_POS) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_MUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN REAL_ARITH_TAC]]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x) <= + --(inv(&(SUC k))) * prob p ((A_k:num->A->bool) k)` ASSUME_TAC THENL + [SUBGOAL_THEN + `--(inv(&(SUC k))) * prob (p:A prob_space) ((A_k:num->A->bool) k) = + expectation p (\x:A. --inv(&(SUC k)) * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:A prob_space`; `--inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `X:A->real`] GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ASM_REWRITE_TAC[ETA_AX]]; + MP_TAC(SPECL [`p:A prob_space`; `--inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] + INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (A_k:num->A->bool) k` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) ((A_k:num->A->bool) k) <= &0 <=> + inv(&(SUC k)) * prob p (A_k k) <= inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `--(expectation p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x))` THEN + CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_REAL_ARITH_TAC]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIONS] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + SUBGOAL_THEN `&0 < --(gen_cond_exp p G (X:A->real) w)` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(A_k:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + UNDISCH_TAC `inv (&j) < --(gen_cond_exp p G (X:A->real) w)` THEN + REAL_ARITH_TAC]]);; + +(* Step 4: Scalar multiple *) +let GEN_COND_EXP_CMUL = prove + (`!p:A prob_space G (X:A->real) c. + sub_sigma_algebra p G /\ integrable p X + ==> almost_surely p + {x | gen_cond_exp p G (\w. c * X w) x = c * gen_cond_exp p G X x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_AE_UNIQUE THEN + EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `(\w:A. c * (X:A->real) w)`] GEN_COND_EXP_MEASURABLE_WRT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `(\w:A. c * (X:A->real) w)`] GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_CMUL THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `gen_cond_exp p G (X:A->real)`; `c:real`] + MEASURABLE_WRT_CMUL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; `X:A->real`] + GEN_COND_EXP_MEASURABLE_WRT) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; SIMP_TAC[]]; + REWRITE_TAC[]]; + MP_TAC(SPECL [`p:A prob_space`; `c:real`; + `gen_cond_exp p G (X:A->real)`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; `X:A->real`] + GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; SIMP_TAC[]]; + REWRITE_TAC[]]; + X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G + (\w. c * (X:A->real) w) x * indicator_fn A x) = + expectation p (\x. (c * X x) * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. (c * (X:A->real) x) * indicator_fn (A:A->bool) x) = + (\x. c * (X x * indicator_fn A x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. (c * gen_cond_exp p G (X:A->real) x) * + indicator_fn (A:A->bool) x) = + (\x. c * (gen_cond_exp p G X x * indicator_fn A x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. c * (X:A->real) x * indicator_fn (A:A->bool) x) = + c * expectation p (\x. X x * indicator_fn A x)` SUBST1_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `c:real`; + `\x:A. (X:A->real) x * indicator_fn (A:A->bool) x`] + EXPECTATION_CMUL) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. c * gen_cond_exp p G (X:A->real) x * + indicator_fn (A:A->bool) x) = + c * expectation p (\x. gen_cond_exp p G X x * indicator_fn A x)` + SUBST1_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `c:real`; + `\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn (A:A->bool) x`] EXPECTATION_CMUL) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; `X:A->real`] + GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + AP_TERM_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]]);; + +(* Step 5: Addition *) +let GEN_COND_EXP_ADD = prove + (`!p:A prob_space G (X:A->real) (Y:A->real). + sub_sigma_algebra p G /\ integrable p X /\ integrable p Y + ==> almost_surely p + {x | gen_cond_exp p G (\w. X w + Y w) x = + gen_cond_exp p G X x + gen_cond_exp p G Y x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_AE_UNIQUE THEN + EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `(\w:A. (X:A->real) w + (Y:A->real) w)`] + GEN_COND_EXP_MEASURABLE_WRT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `(\w:A. (X:A->real) w + (Y:A->real) w)`] + GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC INTEGRABLE_ADD THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `gen_cond_exp p G (X:A->real)`; + `gen_cond_exp p G (Y:A->real)`] MEASURABLE_WRT_ADD) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`] + GEN_COND_EXP_MEASURABLE_WRT) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + MP_TAC(SPECL [`p:A prob_space`; + `gen_cond_exp p G (X:A->real)`; + `gen_cond_exp p G (Y:A->real)`] INTEGRABLE_ADD) THEN + ANTS_TAC THENL + [CONJ_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`] + GEN_COND_EXP_INTEGRABLE) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + X_GEN_TAC `A:A->bool` THEN DISCH_TAC THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G + (\w. (X:A->real) w + (Y:A->real) w) x * + indicator_fn (A:A->bool) x) = + expectation p (\x. (X x + Y x) * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. ((X:A->real) x + (Y:A->real) x) * + indicator_fn (A:A->bool) x) = + (\x. X x * indicator_fn A x + Y x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. (gen_cond_exp p G (X:A->real) x + + gen_cond_exp p G (Y:A->real) x) * + indicator_fn (A:A->bool) x) = + (\x. gen_cond_exp p G X x * indicator_fn A x + + gen_cond_exp p G Y x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. (X:A->real) x * + indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. (Y:A->real) x * + indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; `X:A->real`] + GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. gen_cond_exp p G (Y:A->real) x * + indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; `Y:A->real`] + GEN_COND_EXP_INTEGRABLE) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_ADD] THEN + BINOP_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]]);; + +(* Step 6: Monotonicity *) +let GEN_COND_EXP_MONOTONE = prove + (`!p:A prob_space G (X:A->real) (Y:A->real). + sub_sigma_algebra p G /\ integrable p X /\ integrable p Y /\ + (!x. x IN prob_carrier p ==> X x <= Y x) + ==> almost_surely p {x | gen_cond_exp p G X x <= gen_cond_exp p G Y x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + ~(x IN {x | gen_cond_exp p G (X:A->real) x <= + gen_cond_exp p G (Y:A->real) x})} = + {x | x IN prob_carrier p /\ + gen_cond_exp p G Y x < gen_cond_exp p G X x}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + ABBREV_TAC + `A_k = \k:num. {x:A | x IN prob_carrier p /\ + gen_cond_exp p G (Y:A->real) x - + gen_cond_exp p G (X:A->real) x < + --inv(&(SUC k))}` THEN + EXISTS_TAC `UNIONS {(A_k:num->A->bool) k | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NULL_EVENT_COUNTABLE_UNION THEN X_GEN_TAC `k:num` THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN G` ASSUME_TAC THENL + [SUBGOAL_THEN + `(A_k:num->A->bool) k = + {x:A | x IN prob_carrier p /\ + gen_cond_exp p G (Y:A->real) x - + gen_cond_exp p G (X:A->real) x < --inv(&(SUC k))}` + SUBST1_TAC THENL + [EXPAND_TAC "A_k" THEN BETA_TAC THEN REFL_TAC; ALL_TAC] THEN + MP_TAC(SPECL [`p:A prob_space`; `G:(A->bool)->bool`; + `gen_cond_exp p G (Y:A->real)`; + `gen_cond_exp p G (X:A->real)`; + `--inv(&(SUC k))`] MEASURABLE_WRT_DIFF_LT) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + SIMP_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `(A_k:num->A->bool) k IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&(SUC k))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((A_k:num->A->bool) k) <= &0 <=> + inv(&(SUC k)) * prob p (A_k k) <= inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO]] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation p (\x:A. + (gen_cond_exp p G (X:A->real) x - + gen_cond_exp p G (Y:A->real) x) * + indicator_fn ((A_k:num->A->bool) k) x)` THEN + CONJ_TAC THENL + [SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) ((A_k:num->A->bool) k) = + expectation p (\x:A. inv(&(SUC k)) * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] + EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[EXPECTATION_INDICATOR]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + REPEAT CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn ((A_k:num->A->bool) k):A->real`] + INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (X:A->real) x - + gen_cond_exp p G (Y:A->real) x) = + (\x. (\x. gen_cond_exp p G X x) x - + (\x. gen_cond_exp p G Y x) x)` SUBST1_TAC THENL + [REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (A_k:num->A->bool) k` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO; REAL_LE_REFL]]]; + (* E[(gen_cond_exp X - gen_cond_exp Y) * 1_A_k] <= 0 *) + SUBGOAL_THEN + `(\x:A. (gen_cond_exp p G (X:A->real) x - + gen_cond_exp p G (Y:A->real) x) * + indicator_fn ((A_k:num->A->bool) k) x) = + (\x. gen_cond_exp p G X x * indicator_fn (A_k k) x - + gen_cond_exp p G Y x * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. gen_cond_exp p G (Y:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[] THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SUB] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x) = + expectation p (\x. X x * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G (Y:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x) = + expectation p (\x. Y x * indicator_fn (A_k k) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. (X:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `integrable p (\x:A. (Y:A->real) x * + indicator_fn ((A_k:num->A->bool) k) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC(REAL_ARITH `a <= b ==> a - b <= &0`) THEN + MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN + ASM_REWRITE_TAC[] THEN + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [ASM_SIMP_TAC[]; + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THEN + REAL_ARITH_TAC]]; + (* Subset *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIONS] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + SUBGOAL_THEN + `&0 < gen_cond_exp p G (X:A->real) w - + gen_cond_exp p G (Y:A->real) w` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(A_k:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + UNDISCH_TAC + `inv (&j) < gen_cond_exp p G (X:A->real) w - + gen_cond_exp p G (Y:A->real) w` THEN + REAL_ARITH_TAC]]);; + +(* Step 7: Self-conditioning *) +let GEN_COND_EXP_SELF = prove + (`!p:A prob_space G (X:A->real). + sub_sigma_algebra p G /\ integrable p X /\ measurable_wrt p G X + ==> almost_surely p {x | gen_cond_exp p G X x = X x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_AE_UNIQUE THEN + EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (X:A->real) x) = gen_cond_exp p G X` + SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (X:A->real) x) = gen_cond_exp p G X` + SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]]);; + +(* Step 8: Constant conditioning *) +let GEN_COND_EXP_CONST = prove + (`!p:A prob_space G (c:real). + sub_sigma_algebra p G + ==> almost_surely p {x | gen_cond_exp p G (\w. c) x = c}`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_SELF THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [REWRITE_TAC[INTEGRABLE_CONST]; + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN ASM_REWRITE_TAC[]]);; + +(* Step 9: Iterated conditioning (tower property) *) +let GEN_COND_EXP_ITERATED = prove + (`!p:A prob_space G H (X:A->real). + sub_sigma_algebra p G /\ sub_sigma_algebra p H /\ + G SUBSET H /\ integrable p X + ==> almost_surely p + {x | gen_cond_exp p G (gen_cond_exp p H X) x = + gen_cond_exp p G X x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_AE_UNIQUE THEN + EXISTS_TAC `G:(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (gen_cond_exp p H (X:A->real)) x) = + gen_cond_exp p G (gen_cond_exp p H X)` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (gen_cond_exp p H (X:A->real)) x) = + gen_cond_exp p G (gen_cond_exp p H X)` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (X:A->real) x) = gen_cond_exp p G X` + SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN + `(\x:A. gen_cond_exp p G (X:A->real) x) = gen_cond_exp p G X` + SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p G + (gen_cond_exp p H (X:A->real)) x * + indicator_fn (A:A->bool) x) = + expectation p (\x. gen_cond_exp p H X x * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN H` ASSUME_TAC THENL + [ASM_MESON_TAC[SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p H (X:A->real) x * + indicator_fn (A:A->bool) x) = + expectation p (\x. X x * indicator_fn A x)` + SUBST1_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]]);; + +(* ========================================================================= *) +(* Gap 2: Martingale convergence for general (integrable) submartingales *) +(* Lifts SIMPLE_MARTINGALE_CONVERGENCE_L1_BOUNDED etc. from *) +(* simple_submartingale to submartingale. *) +(* ========================================================================= *) + +(* {x | carrier /\ X x <= v} IN prob_events for random_variable *) +let RV_LE_EVENT = prove + (`!p:A prob_space (X:A->real) v. + random_variable p X + ==> {x | x IN prob_carrier p /\ X x <= v} IN prob_events p`, + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [random_variable]) THEN + DISCH_THEN(MP_TAC o SPEC `v:real`) THEN REWRITE_TAC[]);; + +(* ---- Step 2: Multi-step submartingale inequality ---- *) + +let SUBMARTINGALE_MULTI_STEP = prove + (`!p:A prob_space FF (X:num->A->real) m n A. + submartingale p FF X /\ m <= n /\ A IN FF m + ==> expectation p (\x. X m x * indicator_fn A x) <= + expectation p (\x. X n x * indicator_fn A x)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN + GEN_TAC THEN INDUCT_TAC THENL + [GEN_TAC THEN REWRITE_TAC[LE] THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 SUBST1_TAC ASSUME_TAC)) THEN + REAL_ARITH_TAC; + GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (CONJUNCTS_THEN2 MP_TAC ASSUME_TAC)) THEN + REWRITE_TAC[LE] THEN + DISCH_THEN(DISJ_CASES_THEN2 SUBST1_TAC ASSUME_TAC) THENL + [REAL_ARITH_TAC; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. (X:num->A->real) n x * indicator_fn A x)` THEN + CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + SUBGOAL_THEN `(A:A->bool) IN (FF:num->(A->bool)->bool) n` + ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; submartingale; SUBSET]; + ASM_MESON_TAC[submartingale]]]]]);; + +(* ---- Step 3: Pos part of submartingale is submartingale ---- *) + +let SUBMARTINGALE_POS_PART = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real). + submartingale p FF X + ==> submartingale p FF (\n x. pos_part(X n x))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + REWRITE_TAC[submartingale] THEN REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + (* adapted *) + REWRITE_TAC[adapted; measurable_wrt] THEN X_GEN_TAC `nn:num` THEN + X_GEN_TAC `v:real` THEN REWRITE_TAC[pos_part] THEN + ASM_CASES_TAC `v < &0` THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ real_max ((X:num->A->real) nn x) (&0) <= v} = + {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN + GEN_TAC THEN DISCH_THEN(CONJUNCTS_THEN2 (K ALL_TAC) MP_TAC) THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + MATCH_MP_TAC SIGMA_ALGEBRA_EMPTY THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ real_max ((X:num->A->real) nn x) (&0) <= v} = + {x | x IN prob_carrier p /\ X nn x <= v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_max] THEN COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [adapted]) THEN + REWRITE_TAC[measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `nn:num`) THEN + DISCH_THEN(ACCEPT_TAC o SPEC `v:real`)]]; + (* integrable *) + GEN_TAC THEN REWRITE_TAC[pos_part] THEN + MATCH_MP_TAC INTEGRABLE_POS_PART THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + (* submartingale inequality: E[max(X_{n+1},0)*1_A] >= E[max(X_n,0)*1_A] *) + MAP_EVERY X_GEN_TAC [`nn:num`; `a:A->bool`] THEN DISCH_TAC THEN + REWRITE_TAC[pos_part] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) nn)` + ASSUME_TAC THENL [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) nn) + ((X:num->A->real) nn)` ASSUME_TAC THENL + [ASM_MESON_TAC[adapted]; ALL_TAC] THEN + SUBGOAL_THEN `sigma_algebra ((FF:num->(A->bool)->bool) nn)` ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + (* Key: B = a INTER {X_n >= 0}; chain E[max(Xn,0)*1a]=E[Xn*1B]<=E[Xsn*1B]<=E[max(Xsn,0)*1a] *) + ABBREV_TAC `B = a INTER + {x:A | x IN prob_carrier p /\ (X:num->A->real) nn x >= &0}` THEN + SUBGOAL_THEN `(B:A->bool) IN (FF:num->(A->bool)->bool) nn` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN MATCH_MP_TAC SIGMA_ALGEBRA_INTER THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + MATCH_MP_TAC MEASURABLE_WRT_GE THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* E[max(Xn,0)*1a] = E[Xn*1B]: on B, max(Xn,0)=Xn; on a\B, max(Xn,0)=0 *) + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. max ((X:num->A->real) nn x) (&0) * indicator_fn a x) = + expectation p (\x. X nn x * indicator_fn B x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN EXPAND_TAC "B" THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + ASM_CASES_TAC `(x:A) IN a` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_max] THEN REPEAT COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + (* E[Xn*1B] <= E[Xsn*1B] <= E[max(Xsn,0)*1a] *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC nn) x * indicator_fn B x)` THEN + CONJ_TAC THENL + [ASM_MESON_TAC[submartingale]; + (* E[Xsn*1B] <= E[max(Xsn,0)*1a] by EXPECTATION_MONO *) + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[sub_sigma_algebra; SUBSET]]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_POS_PART THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + ASM_MESON_TAC[sub_sigma_algebra; SUBSET]]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + ASM_CASES_TAC `(x:A) IN a` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_max] THEN REPEAT COND_CASES_TAC THEN ASM_REAL_ARITH_TAC]]]);; + +(* ---- Step 4: General Doob Upcrossing Inequality ---- *) + +(* Helper: integrability transfers when functions agree on carrier *) +let INTEGRABLE_CARRIER_AGREE = prove + (`!p:A prob_space f g. + integrable p g /\ + (!x. x IN prob_carrier p ==> f x = g x) + ==> integrable p f`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `random_variable (p:A prob_space) (f:A->real)` ASSUME_TAC THENL + [SUBGOAL_THEN `random_variable (p:A prob_space) (g:A->real)` MP_TAC THENL + [ASM_MESON_TAC[integrable]; ALL_TAC] THEN + REWRITE_TAC[random_variable] THEN DISCH_TAC THEN + X_GEN_TAC `aa:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (f:A->real) x <= aa} = + {x | x IN prob_carrier p /\ (g:A->real) x <= aa}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + REWRITE_TAC[integrable] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `?B. !h:A->real. + simple_rv (p:A prob_space) h /\ + (!x. x IN prob_carrier p ==> &0 <= h x) /\ + (!x. x IN prob_carrier p ==> h x <= abs ((g:A->real) x)) + ==> simple_expectation p h <= B` MP_TAC THENL + [ASM_MESON_TAC[integrable]; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN + EXISTS_TAC `B:real` THEN + X_GEN_TAC `h:A->real` THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `h:A->real`) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `abs((f:A->real) y)` THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[REAL_ARITH `a = b ==> abs a <= abs b`]; + REWRITE_TAC[]]);; + +(* Subtracting a constant preserves submartingale property *) +let SUBMARTINGALE_SUB_CONST = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c. + submartingale p FF X ==> + submartingale p FF (\n x. X n x - c)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + REWRITE_TAC[submartingale] THEN + REPEAT CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + (* adapted *) + REWRITE_TAC[adapted; measurable_wrt] THEN REPEAT GEN_TAC THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ (X:num->A->real) n x - c <= v} = + {x | x IN prob_carrier p /\ X n x <= v + c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC; + ALL_TAC] THEN + RULE_ASSUM_TAC(REWRITE_RULE[adapted; measurable_wrt]) THEN + ASM_REWRITE_TAC[]; + (* integrable *) + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[ETA_AX; INTEGRABLE_CONST]; + (* inequality *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[filtration]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (X:num->A->real) n x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (indicator_fn (a:A->bool))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. c * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `c:real`; `indicator_fn (a:A->bool)`] + INTEGRABLE_CMUL) THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - c) * indicator_fn (a:A->bool) x) = + expectation p (\x. X n x * indicator_fn a x) - c * prob p a` + SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. ((X:num->A->real) n x - c) * indicator_fn (a:A->bool) x) = + expectation p (\x. X n x * indicator_fn a x - c * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (X:num->A->real) n x * indicator_fn (a:A->bool) x`; + `\x:A. c * indicator_fn (a:A->bool) x`] + EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + MP_TAC(ISPECL [`p:A prob_space`; `c:real`; `indicator_fn (a:A->bool)`] + EXPECTATION_CMUL) THEN + ASM_REWRITE_TAC[ETA_AX] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. ((X:num->A->real) (SUC n) x - c) * indicator_fn (a:A->bool) x) = + expectation p (\x. X (SUC n) x * indicator_fn a x) - c * prob p a` + SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. ((X:num->A->real) (SUC n) x - c) * + indicator_fn (a:A->bool) x) = + expectation p + (\x. X (SUC n) x * indicator_fn a x - c * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x`; + `\x:A. c * indicator_fn (a:A->bool) x`] + EXPECTATION_SUB) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + MP_TAC(ISPECL [`p:A prob_space`; `c:real`; `indicator_fn (a:A->bool)`] + EXPECTATION_CMUL) THEN + ASM_REWRITE_TAC[ETA_AX] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ARITH `a - d <= b - d <=> a <= b`] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [submartingale]) THEN + STRIP_TAC THEN ASM_MESON_TAC[]]);; + +(* E[not_bet_gain of pos_part] >= 0 for general submartingale *) +let NOT_BET_GAIN_NONNEG_EXPECTATION = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b. + submartingale p FF X /\ a < b ==> + !n. integrable p + (\x. not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n) /\ + &0 <= expectation p + (\x. not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ABBREV_TAC `pp = \k (x:A). pos_part((X:num->A->real) k x - a)` THEN + SUBGOAL_THEN + `submartingale (p:A prob_space) FF (pp:num->A->real)` + ASSUME_TAC THENL + [SUBGOAL_THEN `(pp:num->A->real) = (\n x. pos_part((X:num->A->real) n x - a))` + SUBST1_TAC THENL [EXPAND_TAC "pp" THEN REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC SUBMARTINGALE_POS_PART THEN + MATCH_MP_TAC SUBMARTINGALE_SUB_CONST THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) + (\x. (pp:num->A->real) n x)` ASSUME_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!k (x:A). pos_part((X:num->A->real) k x - a) = + (pp:num->A->real) k x` ASSUME_TAC THENL + [EXPAND_TAC "pp" THEN REWRITE_TAC[]; ALL_TAC] THEN + INDUCT_TAC THENL + [(* Base case: not_bet_gain ... 0 = &0 *) + SUBGOAL_THEN `(\x:A. not_bet_gain (\k. (pp:num->A->real) k x) + (&0) (b - a) 0) = (\x. &0)` (fun th -> ASM_REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; not_bet_gain]; ALL_TAC] THEN + REWRITE_TAC[INTEGRABLE_CONST] THEN + SIMP_TAC[EXPECTATION_CONST; REAL_LE_REFL]; + (* Inductive step *) + FIRST_X_ASSUM(CONJUNCTS_THEN2 ASSUME_TAC (ASSUME_TAC)) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `integrable (p:A prob_space) + (\x:A. not_bet_gain (\k. (pp:num->A->real) k x) (&0) (b - a) n) /\ + &0 <= expectation (p:A prob_space) + (\x:A. not_bet_gain (\k. (pp:num->A->real) k x) (&0) (b - a) n)` + STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `integrable (p:A prob_space) + (\x:A. not_bet_gain (\k. pos_part ((X:num->A->real) k x - a)) + (&0) (b - a) n)` THEN + UNDISCH_TAC `&0 <= expectation (p:A prob_space) + (\x:A. not_bet_gain (\k. pos_part ((X:num->A->real) k x - a)) + (&0) (b - a) n)` THEN + ASM_REWRITE_TAC[] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. not_bet_gain (\k. (pp:num->A->real) k x) (&0) (b - a) (SUC n)) = + (\x. not_bet_gain (\k. pp k x) (&0) (b - a) n + + (if upcrossing_phase (\k. pp k x) (&0) (b - a) n = 0 + then &1 else &0) * + (pp (SUC n) x - pp n x))` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; not_bet_gain]; ALL_TAC] THEN + SUBGOAL_THEN + `!x:A. upcrossing_phase (\k. (pp:num->A->real) k x) (&0) (b - a) n = + upcrossing_phase (\k. (X:num->A->real) k x) a b n` + (fun th -> REWRITE_TAC[th]) THENL + [GEN_TAC THEN CONV_TAC SYM_CONV THEN EXPAND_TAC "pp" THEN + MATCH_MP_TAC UPCROSSING_PHASE_SHIFT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ + upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0}` THEN + SUBGOAL_THEN `(A:A->bool) IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + UPCROSSING_PHASE_SET_IN_FILTRATION) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + STRIP_TAC THEN EXPAND_TAC "A" THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[filtration]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. (if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0 + then &1 else &0) * + ((pp:num->A->real) (SUC n) x - pp n x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CARRIER_AGREE THEN + EXISTS_TAC `\x:A. ((pp:num->A->real) (SUC n) x - pp n x) * + indicator_fn (A:A->bool) x` THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THEN + ASM_REWRITE_TAC[ETA_AX]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + EXPAND_TAC "A" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) + (\x:A. not_bet_gain (\k. (pp:num->A->real) k x) (&0) (b - a) n + + (if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0 + then &1 else &0) * + (pp (SUC n) x - pp n x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. not_bet_gain (\k. (pp:num->A->real) k x) (&0) (b - a) n`; + `\x:A. (if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0 + then &1 else &0) * + ((pp:num->A->real) (SUC n) x - pp n x)`] + EXPECTATION_ADD) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC REAL_LE_ADD THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. (if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0 + then &1 else &0) * + ((pp:num->A->real) (SUC n) x - pp n x)) = + expectation p (\x. pp (SUC n) x * indicator_fn (A:A->bool) x) - + expectation p (\x. pp n x * indicator_fn A x)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. (if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 0 + then &1 else &0) * + ((pp:num->A->real) (SUC n) x - pp n x)) = + expectation p + (\x. (pp (SUC n) x - pp n x) * indicator_fn (A:A->bool) x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN + EXPAND_TAC "A" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `(\x:A. ((pp:num->A->real) (SUC n) x - pp n x) * + indicator_fn (A:A->bool) x) = + (\x. pp (SUC n) x * indicator_fn A x - pp n x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_SUB THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + REWRITE_TAC[REAL_SUB_LE] THEN + MP_TAC(REWRITE_RULE[submartingale] + (ASSUME `submartingale (p:A prob_space) FF (pp:num->A->real)`)) THEN + STRIP_TAC THEN FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `A:A->bool`]) THEN + ASM_REWRITE_TAC[]]);; + +(* General Doob Upcrossing Inequality *) +let DOOB_UPCROSSING_INEQUALITY = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n. + submartingale p FF X /\ a < b ==> + (b - a) * expectation p (\x. &(num_upcrossings X a b n x)) + <= expectation p (\x. pos_part(X n x - a))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + (* random_variable for num_upcrossings by induction *) + SUBGOAL_THEN + `!m. random_variable (p:A prob_space) + (\x. &(num_upcrossings (X:num->A->real) a b m x))` ASSUME_TAC THENL + [INDUCT_TAC THENL + [(* Base: U_0 = 0 *) + SUBGOAL_THEN + `(\x:A. &(num_upcrossings (X:num->A->real) a b 0 x)) = (\x. &0)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; num_upcrossings; upcrossing_count]; + REWRITE_TAC[RANDOM_VARIABLE_CONST]]; + (* Step: U_{SUC m} agrees on carrier with U_m + indicator_fn S *) + ABBREV_TAC `S = {x:A | x IN prob_carrier p /\ + upcrossing_phase (\k. (X:num->A->real) k x) a b m = 1 /\ + X (SUC m) x >= b}` THEN + SUBGOAL_THEN `(S:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "S" THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + upcrossing_phase (\k. (X:num->A->real) k x) a b m = 1 /\ + X (SUC m) x >= b} = + {x | x IN prob_carrier p /\ + upcrossing_phase (\k. X k x) a b m = 1} INTER + {x | x IN prob_carrier p /\ X (SUC m) x >= b}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_INTER; IN_ELIM_THM] THEN MESON_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + UPCROSSING_PHASE_SET_IN_FILTRATION) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `m:num`) THEN STRIP_TAC THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; + MP_TAC(SPECL [`p:A prob_space`; `(X:num->A->real) (SUC m)`; `b:real`] + RANDOM_VARIABLE_GE) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + SIMP_TAC[]]]; + ALL_TAC] THEN + REWRITE_TAC[random_variable] THEN X_GEN_TAC `c:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + &(num_upcrossings (X:num->A->real) a b (SUC m) x) <= c} = + {x | x IN prob_carrier p /\ + &(num_upcrossings X a b m x) + indicator_fn (S:A->bool) x <= c}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `&(num_upcrossings (X:num->A->real) a b (SUC m) x) = + &(num_upcrossings X a b m x) + indicator_fn (S:A->bool) x` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[num_upcrossings; upcrossing_count; GSYM REAL_OF_NUM_ADD] THEN + SUBGOAL_THEN + `&(if upcrossing_phase (\k. (X:num->A->real) k x) a b m = 1 /\ + X (SUC m) x >= b then 1 else 0) = + indicator_fn (S:A->bool) x` + (fun th -> REWRITE_TAC[th]) THEN + EXPAND_TAC "S" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN COND_CASES_TAC THEN REWRITE_TAC[] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &(num_upcrossings (X:num->A->real) a b m x)`; + `indicator_fn (S:A->bool)`] RANDOM_VARIABLE_ADD) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[random_variable] THEN + DISCH_THEN(MP_TAC o SPEC `c:real`) THEN REWRITE_TAC[]]]; + ALL_TAC] THEN + (* Integrability of num_upcrossings via INTEGRABLE_BOUNDED *) + SUBGOAL_THEN + `integrable (p:A prob_space) + (\x. &(num_upcrossings (X:num->A->real) a b n x))` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_BOUNDED THEN EXISTS_TAC `&n` THEN + ASM_REWRITE_TAC[] THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[REAL_ABS_NUM; REAL_OF_NUM_LE; num_upcrossings] THEN + SPEC_TAC(`n:num`, `k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[upcrossing_count; LE_0]; + REWRITE_TAC[upcrossing_count] THEN COND_CASES_TAC THEN ASM_ARITH_TAC]; + ALL_TAC] THEN + (* Integrability of pos_part(X k - a) *) + SUBGOAL_THEN + `!k. integrable (p:A prob_space) + (\x. pos_part((X:num->A->real) k x - a))` ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[pos_part] THEN + MATCH_MP_TAC INTEGRABLE_POS_PART THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN + ASM_REWRITE_TAC[INTEGRABLE_CONST; ETA_AX]; + ALL_TAC] THEN + (* NOT_BET_GAIN: integrable and nonneg expectation *) + MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + NOT_BET_GAIN_NONNEG_EXPECTATION) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN STRIP_TAC THEN + (* E[pp_0] >= 0 *) + SUBGOAL_THEN `&0 <= expectation (p:A prob_space) + (\x:A. pos_part((X:num->A->real) 0 x - a))` ASSUME_TAC THENL + [MATCH_MP_TAC EXPECTATION_POS THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN REWRITE_TAC[pos_part] THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* (b-a)*E[U] = E[(b-a)*U] by EXPECTATION_CMUL *) + SUBGOAL_THEN + `(b - a) * expectation (p:A prob_space) + (\x. &(num_upcrossings (X:num->A->real) a b n x)) = + expectation p (\x. (b - a) * &(num_upcrossings X a b n x))` + SUBST1_TAC THENL + [MATCH_MP_TAC(GSYM EXPECTATION_CMUL) THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Abbreviate expectation values *) + ABBREV_TAC `Eu = expectation (p:A prob_space) + (\x. (b - a) * &(num_upcrossings (X:num->A->real) a b n x))` THEN + ABBREV_TAC `En = expectation (p:A prob_space) + (\x. not_bet_gain (\k. pos_part((X:num->A->real) k x - a)) + (&0) (b - a) n)` THEN + ABBREV_TAC `E0 = expectation (p:A prob_space) + (\x. pos_part((X:num->A->real) 0 x - a))` THEN + (* Eu + En + E0 <= E[ppn] *) + SUBGOAL_THEN `Eu + En + E0 <= expectation (p:A prob_space) + (\x. pos_part((X:num->A->real) n x - a))` ASSUME_TAC THENL + [(* Step 1: Eu + En = E[(b-a)*U + nbg] *) + SUBGOAL_THEN `Eu + En = expectation (p:A prob_space) + (\x:A. (b - a) * &(num_upcrossings (X:num->A->real) a b n x) + + not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n)` + ASSUME_TAC THENL + [EXPAND_TAC "Eu" THEN EXPAND_TAC "En" THEN + MATCH_MP_TAC(GSYM EXPECTATION_ADD) THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 2: (Eu + En) + E0 = E[sum] *) + SUBGOAL_THEN `Eu + En + E0 = expectation (p:A prob_space) + (\x:A. (b - a) * &(num_upcrossings (X:num->A->real) a b n x) + + not_bet_gain (\k. pos_part(X k x - a)) (&0) (b - a) n + + pos_part(X 0 x - a))` + SUBST1_TAC THENL + [ASM_REWRITE_TAC[REAL_ADD_ASSOC] THEN EXPAND_TAC "E0" THEN + MATCH_MP_TAC(GSYM EXPECTATION_ADD) THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* Step 3: E[sum] <= E[ppn] from EXPECTATION_MONO *) + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [REPEAT(MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[] THEN + CONJ_TAC) THEN + MATCH_MP_TAC INTEGRABLE_CMUL THEN ASM_REWRITE_TAC[]; + ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + MP_TAC(SPECL [`X:num->A->real`; `a:real`; `b:real`; `n:num`; `x:A`] + UPCROSSING_POINTWISE_SUM_BOUND) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + ASM_REAL_ARITH_TAC);; + +(* ---- Step 5: General Maximal Inequalities ---- *) + +(* Doob maximal inequality for nonneg submartingales: direct first-crossing *) +let NONNEG_SUBMARTINGALE_MAXIMAL = prove + (`!p:A prob_space FF (X:num->A->real) c n. + submartingale p FF X /\ &0 < c /\ + (!m x. x IN prob_carrier p ==> &0 <= X m x) + ==> c * prob p {x | x IN prob_carrier p /\ running_max X n x >= c} + <= expectation p (X n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. (X:num->A->real) n x * indicator_fn + {y | y IN prob_carrier p /\ running_max X n y >= c} x)` THEN + CONJ_TAC THENL + [(* Strong maximal: c * P(max >= c) <= E[X n * 1_{max >= c}] *) + SPEC_TAC(`n:num`, `n:num`) THEN INDUCT_TAC THENL + [(* Base: running_max X 0 = X 0 *) + REWRITE_TAC[running_max] THEN + ABBREV_TAC `A0 = {y:A | y IN prob_carrier p /\ + (X:num->A->real) 0 y >= c}` THEN + SUBGOAL_THEN `(A0:A->bool) IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [EXPAND_TAC "A0" THEN MATCH_MP_TAC RANDOM_VARIABLE_GE THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. c * indicator_fn (A0:A->bool) x)` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `c:real`; `indicator_fn (A0:A->bool)`] + EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR; REAL_LE_REFL]]; + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (A0:A->bool)`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `(y:A) IN (A0:A->bool)` THEN EXPAND_TAC "A0" THEN + REWRITE_TAC[IN_ELIM_THM; real_ge] THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]]; + (* Inductive step *) + ABBREV_TAC + `A_n = {x:A | x IN prob_carrier p /\ + running_max (X:num->A->real) n x >= c}` THEN + ABBREV_TAC + `B = {x:A | x IN prob_carrier p /\ + (X:num->A->real) (SUC n) x >= c} DIFF A_n` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + running_max (X:num->A->real) (SUC n) x >= c} = A_n UNION B` + SUBST1_TAC THENL + [EXPAND_TAC "B" THEN EXPAND_TAC "A_n" THEN + GEN_REWRITE_TAC I [EXTENSION] THEN X_GEN_TAC `z:A` THEN + REWRITE_TAC[IN_UNION; IN_DIFF; IN_ELIM_THM; + running_max; REAL_MAX_GE] THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + ASM_CASES_TAC `running_max (X:num->A->real) n z >= c` THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT (A_n:A->bool) B` ASSUME_TAC THENL + [EXPAND_TAC "B" THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(A_n:A->bool) IN (FF:num->(A->bool)->bool) n` + ASSUME_TAC THENL + [EXPAND_TAC "A_n" THEN + MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(A_n:A->bool) IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `(B:A->bool) IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [EXPAND_TAC "B" THEN MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC RANDOM_VARIABLE_GE THEN REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC INTEGRABLE_IMP_RANDOM_VARIABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) (A_n UNION B) = prob p A_n + prob p B` + SUBST1_TAC THENL + [MATCH_MP_TAC PROB_ADDITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * + indicator_fn (A_n UNION B) x) = + expectation p (\x. X (SUC n) x * indicator_fn A_n x) + + expectation p (\x. X (SUC n) x * indicator_fn B x)` + SUBST1_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * + indicator_fn (A_n UNION B) x) = + expectation p + (\x. X (SUC n) x * indicator_fn A_n x + + X (SUC n) x * indicator_fn B x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN + AP_TERM_TAC THEN MATCH_MP_TAC INDICATOR_FN_DISJOINT_UNION THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_LDISTRIB] THEN + MATCH_MP_TAC REAL_LE_ADD2 THEN CONJ_TAC THENL + [(* c * P(A_n) <= E[X(SUC n) * 1_{A_n}] via IH + submartingale *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. (X:num->A->real) n x * indicator_fn (A_n:A->bool) x)` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MP_TAC(REWRITE_RULE[submartingale] + (ASSUME `submartingale (p:A prob_space) FF (X:num->A->real)`)) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `A_n:A->bool`]) THEN + ASM_REWRITE_TAC[]]; + (* c * P(B) <= E[X(SUC n) * 1_B] *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. c * indicator_fn (B:A->bool) x)` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (B:A->bool)`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR; REAL_LE_REFL]]; + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (B:A->bool)`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `(y:A) IN (B:A->bool)` THEN EXPAND_TAC "B" THEN + REWRITE_TAC[IN_DIFF; IN_ELIM_THM; real_ge] THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]]]]]; + (* E[X n * 1_{max >= c}] <= E[X n] since X >= 0 *) + SUBGOAL_THEN + `{y:A | y IN prob_carrier p /\ + running_max (X:num->A->real) n y >= c} IN prob_events p` + ASSUME_TAC THENL + [MP_TAC(SPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `c:real`; `n:num`] + RUNNING_MAX_EXCEEDS_IN_FILTRATION) THEN + ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; + ASM_REWRITE_TAC[ETA_AX]; + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO] THENL + [REWRITE_TAC[REAL_LE_REFL]; + ASM_MESON_TAC[]]]]);; + +(* Maximal inequality for pos part *) +let DOOB_MAXIMAL_POS_PART = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n C. + submartingale p FF X /\ &0 < c /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) n x >= c} + <= C`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) FF + (\m (x:A). pos_part((X:num->A->real) m x))` ASSUME_TAC THENL + [MATCH_MP_TAC SUBMARTINGALE_POS_PART THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!m. integrable (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!m. integrable (p:A prob_space) + ((\m (x:A). pos_part((X:num->A->real) m x)) m)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. pos_part((X:num->A->real) n x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NONNEG_SUBMARTINGALE_MAXIMAL THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN + ASM_REWRITE_TAC[] THEN BETA_TAC THEN REWRITE_TAC[POS_PART_POS]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x:A. abs((X:num->A->real) n x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN BETA_TAC THEN + REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[pos_part] THEN REAL_ARITH_TAC]; + ASM_REWRITE_TAC[]]]);; + +let ADAPTED_IMP_RV = prove + (`!p:A prob_space FF (X:num->A->real). + filtration p FF /\ adapted p FF X + ==> !n. random_variable p (X n)`, + REPEAT GEN_TAC THEN REWRITE_TAC[filtration; adapted; measurable_wrt] THEN + STRIP_TAC THEN GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[sub_sigma_algebra; random_variable] THEN + STRIP_TAC THEN DISCH_TAC THEN GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `a:real`) THEN + DISCH_TAC THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET prob_events (p:A prob_space)` + MP_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + REWRITE_TAC[SUBSET] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);; + +(* Neg part maximal inequality *) +let SUBMARTINGALE_NEG_PART_MAXIMAL = prove + (`!p:A prob_space FF X c (n:num) C. + submartingale p FF X /\ &0 < c /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. max (--(X m x)) (&0)) n x >= c} + <= &2 * C`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF X` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` + ASSUME_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + (* Neg part process is adapted *) + SUBGOAL_THEN + `adapted (p:A prob_space) FF (\m x. max (--(X:num->A->real) m x) (&0))` + ASSUME_TAC THENL + [REWRITE_TAC[adapted; measurable_wrt] THEN REPEAT GEN_TAC THEN + ASM_CASES_TAC `&0 <= v` THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (--(X:num->A->real) n x) (&0) <= v} = + {x | x IN prob_carrier p /\ X n x >= --v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN UNDISCH_TAC `&0 <= v` THEN REAL_ARITH_TAC; + MATCH_MP_TAC MEASURABLE_WRT_GE THEN CONJ_TAC THENL + [ASM_MESON_TAC[submartingale; filtration]; ALL_TAC] THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale; adapted]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (--(X:num->A->real) n x) (&0) <= v} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 (fun _ -> ALL_TAC) MP_TAC) THEN + UNDISCH_TAC `~(&0 <= v)` THEN REAL_ARITH_TAC; + SUBGOAL_THEN `sigma_algebra ((FF:num->(A->bool)->bool) n)` + MP_TAC THENL + [ASM_MESON_TAC[submartingale; filtration; sub_sigma_algebra]; + ALL_TAC] THEN + REWRITE_TAC[sigma_algebra] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `{}:(A->bool)->bool`) THEN + REWRITE_TAC[EMPTY_SUBSET; COUNTABLE_EMPTY; UNIONS_0]]]; + ALL_TAC] THEN + ABBREV_TAC + `A = \n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c}` THEN + ABBREV_TAC `B = \n. prob_carrier (p:A prob_space) DIFF (A:num->(A->bool)) n` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) n x >= c} = + (A:num->(A->bool)) n` + SUBST1_TAC THENL + [EXPAND_TAC "A" THEN REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!m. (A:num->(A->bool)) m IN (FF:num->(A->bool)->bool) m` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "A" THEN + MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!m. (A:num->(A->bool)) m IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) m` THEN + ASM_MESON_TAC[filtration; submartingale]; + ALL_TAC] THEN + SUBGOAL_THEN `!m. (B:num->(A->bool)) m IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "B" THEN + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN + ASM_REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; + ALL_TAC] THEN + SUBGOAL_THEN `!m. (B:num->(A->bool)) m IN (FF:num->(A->bool)->bool) m` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "B" THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF (A:num->(A->bool)) m = + UNIONS ((FF:num->(A->bool)->bool) m) DIFF A m` SUBST1_TAC THENL + [AP_THM_TAC THEN AP_TERM_TAC THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]; + MATCH_MP_TAC SIGMA_ALGEBRA_COMPL THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra]]; + ALL_TAC] THEN + SUBGOAL_THEN `!m. integrable (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; + ALL_TAC] THEN + (* Upper bound: E[X_m * 1_{B_m}] <= C *) + SUBGOAL_THEN + `!m. expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= C` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= + expectation p (\x. abs(X m x))` + MP_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THEN REWRITE_TAC[REAL_MUL_RID; REAL_MUL_RZERO] THENL + [REAL_ARITH_TAC; REWRITE_TAC[REAL_ABS_POS]]; + MP_TAC(SPEC `m:num` (ASSUME `!n. expectation (p:A prob_space) + (\x. abs ((X:num->A->real) n x)) <= C`)) THEN + REWRITE_TAC[ETA_AX] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Inductive claim: E[X_m * 1_{B_m}] >= -C + c * P(A_m) *) + SUBGOAL_THEN + `!m. expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) + >= --C + c * prob p ((A:num->(A->bool)) m)` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [(* Base case *) + SUBGOAL_THEN + `expectation (p:A prob_space) ((X:num->A->real) 0) = + expectation p (\x. X 0 x * indicator_fn ((B:num->(A->bool)) 0) x) + + expectation p (\x. X 0 x * indicator_fn ((A:num->(A->bool)) 0) x)` + ASSUME_TAC THENL + [CONV_TAC SYM_CONV THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) 0 x * indicator_fn ((B:num->(A->bool)) 0) x + + X 0 x * indicator_fn ((A:num->(A->bool)) 0) x) = + expectation p (\x. X 0 x * indicator_fn (B 0) x) + + expectation p (\x. X 0 x * indicator_fn (A 0) x)` + (fun th -> REWRITE_TAC[GSYM th]) THENL + [MATCH_MP_TAC EXPECTATION_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + EXPAND_TAC "B" THEN + REWRITE_TAC[indicator_fn; IN_DIFF] THEN + ASM_CASES_TAC `(y:A) IN ((A:num->(A->bool)) 0)` THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) 0 x * indicator_fn ((A:num->(A->bool)) 0) x) + <= --c * prob p (A 0)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `--c * prob (p:A prob_space) ((A:num->(A->bool)) 0) = + expectation p (\x. --c * indicator_fn (A 0) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; `--c:real`; + `indicator_fn ((A:num->(A->bool)) 0)`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `--c:real`; + `indicator_fn ((A:num->(A->bool)) 0)`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `(y:A) IN ((A:num->(A->bool)) 0)` THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM; running_max; real_ge] THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) ((X:num->A->real) 0) >= --C` + ASSUME_TAC THENL + [REWRITE_TAC[real_ge] THEN + SUBGOAL_THEN `abs(expectation (p:A prob_space) ((X:num->A->real) 0)) <= C` + MP_TAC THENL + [MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) 0 x))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_ABS_LE THEN ASM_REWRITE_TAC[ETA_AX]; + MP_TAC(SPEC `0` (ASSUME `!n. expectation (p:A prob_space) + (\x. abs ((X:num->A->real) n x)) <= C`)) THEN + REWRITE_TAC[ETA_AX]]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + POP_ASSUM MP_TAC THEN POP_ASSUM MP_TAC THEN + POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; + (* Inductive step *) + ABBREV_TAC + `D = (B:num->(A->bool)) m INTER + {x:A | x IN prob_carrier p /\ (X:num->A->real) (SUC m) x <= --c}` THEN + SUBGOAL_THEN `(B:num->(A->bool)) (SUC m) = B m DIFF D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[EXTENSION; IN_DIFF; IN_INTER; IN_ELIM_THM; + running_max; REAL_MAX_GE] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `D:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC RV_LE_EVENT THEN REWRITE_TAC[ETA_AX] THEN + ASM_MESON_TAC[ADAPTED_IMP_RV]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT ((A:num->(A->bool)) m) D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `(A:num->(A->bool)) (SUC m) = A m UNION D` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN EXPAND_TAC "B" THEN EXPAND_TAC "A" THEN + REWRITE_TAC[EXTENSION; IN_UNION; IN_INTER; IN_DIFF; IN_ELIM_THM; + running_max; REAL_MAX_GE] THEN + X_GEN_TAC `z:A` THEN + ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `&0 < c` THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) ((A:num->(A->bool)) (SUC m)) = + prob p (A m) + prob p D` + ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC PROB_ADDITIVE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) m x * indicator_fn ((B:num->(A->bool)) m) x) <= + expectation p + (\x. X (SUC m) x * indicator_fn (B m) x)` + ASSUME_TAC THENL + [MP_TAC(ASSUME `submartingale (p:A prob_space) FF (X:num->A->real)`) THEN + REWRITE_TAC[submartingale] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m:num`; `(B:num->(A->bool)) m`]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(B:num->(A->bool)) m = B (SUC m) UNION D` ASSUME_TAC THENL + [ASM_REWRITE_TAC[] THEN EXPAND_TAC "D" THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT ((B:num->(A->bool)) (SUC m)) D` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT] THEN + UNDISCH_TAC `(B:num->(A->bool)) (SUC m) = B m DIFF D` THEN SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * + indicator_fn ((B:num->(A->bool)) m) x) = + expectation p + (\x. X (SUC m) x * indicator_fn (B (SUC m)) x) + + expectation p + (\x. X (SUC m) x * indicator_fn D x)` + ASSUME_TAC THENL + [SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * + indicator_fn ((B:num->(A->bool)) m) x) = + expectation p + (\x. X (SUC m) x * indicator_fn (B (SUC m)) x + + X (SUC m) x * indicator_fn D x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[GSYM REAL_ADD_LDISTRIB] THEN AP_TERM_TAC THEN + UNDISCH_TAC `(B:num->(A->bool)) m = B (SUC m) UNION D` THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC INDICATOR_FN_DISJOINT_UNION THEN + FIRST_ASSUM ACCEPT_TAC; + MATCH_MP_TAC EXPECTATION_ADD THEN + CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * indicator_fn D x) <= + --c * prob p D` + ASSUME_TAC THENL + [SUBGOAL_THEN + `--c * prob (p:A prob_space) D = + expectation p (\x. --c * indicator_fn D x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; `--c:real`; + `indicator_fn (D:A->bool)`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX] THEN DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + ASM_SIMP_TAC[EXPECTATION_INDICATOR] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + MATCH_MP_TAC EXPECTATION_MONO THEN + CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `--c:real`; + `indicator_fn (D:A->bool)`] INTEGRABLE_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX]]; ALL_TAC] THEN + X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + UNDISCH_TAC `(y:A) IN D` THEN EXPAND_TAC "D" THEN + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + STRIP_TAC THEN ASM_REAL_ARITH_TAC; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Combine: abbreviate and use arithmetic *) + ABBREV_TAC `EB = expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * + indicator_fn ((B:num->(A->bool)) (SUC m)) x)` THEN + ABBREV_TAC `ED = expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * indicator_fn (D:A->bool) x)` THEN + ABBREV_TAC `EBm = expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC m) x * + indicator_fn ((B:num->(A->bool)) m) x)` THEN + ABBREV_TAC `Em = expectation (p:A prob_space) + (\x. (X:num->A->real) m x * + indicator_fn ((B:num->(A->bool)) m) x)` THEN + ABBREV_TAC `PA = prob (p:A prob_space) ((A:num->(A->bool)) m)` THEN + ABBREV_TAC `PD = prob (p:A prob_space) (D:A->bool)` THEN + ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + ALL_TAC] THEN + (* Final step: combine bounds *) + MP_TAC(SPEC `n:num` + (ASSUME `!m. expectation (p:A prob_space) + (\x. (X:num->A->real) m x * + indicator_fn ((B:num->(A->bool)) m) x) >= + --C + c * prob p ((A:num->(A->bool)) m)`)) THEN + MP_TAC(SPEC `n:num` + (ASSUME `!m. expectation (p:A prob_space) + (\x. (X:num->A->real) m x * + indicator_fn ((B:num->(A->bool)) m) x) <= C`)) THEN + REAL_ARITH_TAC);; + +(* ---- Step 6: Event membership for general submartingales ---- *) + +let RUNNING_MAX_POS_PART_EVENT = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n. + submartingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) n x >= c} + IN prob_events p`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) FF + (\n x. pos_part((X:num->A->real) n x))` ASSUME_TAC THENL + [MATCH_MP_TAC SUBMARTINGALE_POS_PART THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN CONJ_TAC THENL + [ASM_MESON_TAC[filtration; submartingale]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN + ASM_MESON_TAC[submartingale]);; + +let RUNNING_MAX_NEG_PART_EVENT = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c n. + submartingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. max (--X m x) (&0)) n x >= c} + IN prob_events p`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN CONJ_TAC THENL + [ASM_MESON_TAC[filtration; submartingale]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN CONJ_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + REWRITE_TAC[adapted; measurable_wrt] THEN REPEAT GEN_TAC THEN + ASM_CASES_TAC `&0 <= v` THENL + [SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (--(X:num->A->real) n x) (&0) <= v} = + {x | x IN prob_carrier p /\ X n x >= --v}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN UNDISCH_TAC `&0 <= v` THEN REAL_ARITH_TAC; + MATCH_MP_TAC MEASURABLE_WRT_GE THEN CONJ_TAC THENL + [ASM_MESON_TAC[submartingale; filtration]; ALL_TAC] THEN + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale; adapted]]; + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + max (--(X:num->A->real) n x) (&0) <= v} = {}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 (fun _ -> ALL_TAC) MP_TAC) THEN + UNDISCH_TAC `~(&0 <= v)` THEN REAL_ARITH_TAC; + SUBGOAL_THEN `sigma_algebra ((FF:num->(A->bool)->bool) n)` + MP_TAC THENL + [ASM_MESON_TAC[submartingale; filtration; sub_sigma_algebra]; + ALL_TAC] THEN + REWRITE_TAC[sigma_algebra] THEN STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `{}:(A->bool)->bool`) THEN + REWRITE_TAC[EMPTY_SUBSET; COUNTABLE_EMPTY; UNIONS_0]]]);; + +(* ---- Step 7: L1-bounded upcrossing lemmas ---- *) + +let UPCROSSING_EXPECTATION_BOUND_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n C. + submartingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> (b - a) * expectation p (\x. &(num_upcrossings X a b n x)) + <= C + abs(a)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `!m. integrable (p:A prob_space) ((X:num->A->real) m)` + ASSUME_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. pos_part((X:num->A->real) n x - a))` THEN + CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`] + DOOB_UPCROSSING_INEQUALITY) THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x) + abs(a))` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[pos_part] THEN MATCH_MP_TAC INTEGRABLE_POS_PART THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX; INTEGRABLE_CONST]]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[ETA_AX; INTEGRABLE_CONST]]; + GEN_TAC THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[pos_part] THEN REAL_ARITH_TAC]; + SUBGOAL_THEN `expectation (p:A prob_space) + (\x:A. abs((X:num->A->real) n x) + abs(a)) + = expectation p (\x. abs(X n x)) + abs(a)` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `\x:A. abs((X:num->A->real) n x)`; + `\x:A. abs(a:real)`] EXPECTATION_ADD) THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[INTEGRABLE_CONST]]; + REWRITE_TAC[EXPECTATION_CONST]]; + REWRITE_TAC[REAL_LE_RADD] THEN ASM_REWRITE_TAC[]]]]);; + +let RV_NUM_UPCROSSINGS = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b. + filtration p FF /\ adapted p FF X + ==> !n. random_variable p (\x. &(num_upcrossings X a b n x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[num_upcrossings; upcrossing_count] THEN + REWRITE_TAC[REAL_OF_NUM_EQ; ARITH_RULE `0 = 0`] THEN + REWRITE_TAC[RANDOM_VARIABLE_CONST]; + REWRITE_TAC[num_upcrossings; upcrossing_count] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD; GSYM num_upcrossings] THEN + MATCH_MP_TAC RANDOM_VARIABLE_ADD THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + ABBREV_TAC `S = {x:A | x IN prob_carrier p /\ + upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b}` THEN + SUBGOAL_THEN `(S:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "S" THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b} = + {x | x IN prob_carrier p /\ upcrossing_phase (\k. X k x) a b n = 1} + INTER {x | x IN prob_carrier p /\ X (SUC n) x >= b}` SUBST1_TAC THENL + [SET_TAC[]; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] UPCROSSING_PHASE_SET_IN_FILTRATION) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC (fun _ -> ALL_TAC)) THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [filtration]) THEN + DISCH_THEN(CONJUNCTS_THEN2 (MP_TAC o SPEC `n:num`) (fun _ -> ALL_TAC)) THEN + REWRITE_TAC[sub_sigma_algebra] THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MATCH_MP_TAC o REWRITE_RULE[SUBSET]) THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`] ADAPTED_IMP_RV) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `SUC n`) THEN + REWRITE_TAC[ETA_AX]]]; + REWRITE_TAC[random_variable] THEN GEN_TAC THEN + ASM_CASES_TAC `&1 <= a'` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + &(if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b + then 1 else 0) <= a'} = prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC THENL + [STRIP_TAC THEN ASM_REWRITE_TAC[]; + DISCH_TAC THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN ASM_REAL_ARITH_TAC]; + REWRITE_TAC[PROB_CARRIER_IN_EVENTS]]; + ASM_CASES_TAC `a' < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + &(if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b + then 1 else 0) <= a'} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN GEN_TAC THEN + REWRITE_TAC[DE_MORGAN_THM] THEN DISJ2_TAC THEN + COND_CASES_TAC THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[PROB_EMPTY_IN_EVENTS]]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + &(if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b + then 1 else 0) <= a'} = prob_carrier p DIFF S` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_DIFF] THEN X_GEN_TAC `x:A` THEN + EQ_TAC THENL + [STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + EXPAND_TAC "S" THEN REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN + UNDISCH_TAC `&(if upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b then 1 else 0) <= a'` THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~(&1 <= a')` THEN REAL_ARITH_TAC; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `~(upcrossing_phase (\k. (X:num->A->real) k x) a b n = 1 /\ + X (SUC n) x >= b)` ASSUME_TAC THENL + [UNDISCH_TAC `~((x:A) IN S)` THEN + EXPAND_TAC "S" THEN REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ASM_REWRITE_TAC[] THEN UNDISCH_TAC `~(a' < &0)` THEN REAL_ARITH_TAC]]; + MATCH_MP_TAC PROB_COMPL_IN_EVENTS THEN ASM_REWRITE_TAC[]]]]]]]);; + +let NUM_UPCROSSINGS_GE_EVENT = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n k. + filtration p FF /\ adapted p FF X + ==> {x | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} + IN prob_events p`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] RV_NUM_UPCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[]);; + +let UPCROSSING_COUNT_LE = prove + (`!f a b n. upcrossing_count f a b n <= n`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[upcrossing_count; LE_REFL]; + REWRITE_TAC[upcrossing_count] THEN + COND_CASES_TAC THEN ASM_ARITH_TAC]);; + +(* BOUNDED_RV_INTEGRABLE removed: identical to INTEGRABLE_BOUNDED + from expectation.ml. Uses below updated to INTEGRABLE_BOUNDED. *) + +let INTEGRABLE_NUM_UPCROSSINGS = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b. + filtration p FF /\ adapted p FF X + ==> !n. integrable p (\x. &(num_upcrossings X a b n x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&n` THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] RV_NUM_UPCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[num_upcrossings; REAL_ABS_NUM] THEN + REWRITE_TAC[REAL_OF_NUM_LE; UPCROSSING_COUNT_LE]]);; + +let MARKOV_GE = prove + (`!p:A prob_space f (c:real). + integrable p f /\ + (!x. x IN prob_carrier p ==> &0 <= f x) /\ + &0 < c /\ + {x | x IN prob_carrier p /\ f x >= c} IN prob_events p + ==> c * prob p {x | x IN prob_carrier p /\ f x >= c} + <= expectation p f`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ (f:A->real) x >= c}` THEN + SUBGOAL_THEN `c * prob (p:A prob_space) A = + expectation p (\x:A. c * indicator_fn (A:A->bool) x)` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `A:A->bool`] EXPECTATION_INDICATOR) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(SUBST1_TAC o GSYM) THEN + MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (A:A->bool)`] EXPECTATION_CMUL) THEN + ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[]] THEN + MESON_TAC[]; + MATCH_MP_TAC EXPECTATION_MONO THEN REPEAT CONJ_TAC THENL + [SUBGOAL_THEN `integrable (p:A prob_space) (indicator_fn (A:A->bool))` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + MP_TAC(ISPECL [`p:A prob_space`; `c:real`; + `indicator_fn (A:A->bool)`] INTEGRABLE_CMUL) THEN + ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN BETA_TAC THEN + REWRITE_TAC[indicator_fn] THEN + COND_CASES_TAC THENL + [POP_ASSUM MP_TAC THEN EXPAND_TAC "A" THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + STRIP_TAC THEN REWRITE_TAC[REAL_MUL_RID] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[REAL_MUL_RZERO] THEN ASM_MESON_TAC[]]]]);; + + +(* ========================================================================= *) +(* BACKWARD MARTINGALE CONVERGENCE: L^1-BOUNDED (continued from line ~5270) *) +(* Moved here because it depends on MARKOV_GE, DOOB_MAXIMAL_POS_PART *) +(* and other lemmas defined in this section. *) +(* ========================================================================= *) + +(* Downcrossing events are measurable for backward martingale *) +let NUM_DOWNCROSSINGS_GE_EVENT = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b n k. + backward_martingale p FF X + ==> {x | x IN prob_carrier p /\ &(num_downcrossings X a b n x) >= &k} + IN prob_events p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &k} = + {x | x IN prob_carrier p /\ + &(num_upcrossings (\m:num. \x:A. --((X:num->A->real) m x)) (--b) (--a) n x) >= &k}` + SUBST1_TAC THENL [ + REWRITE_TAC[EXTENSION; IN_ELIM_THM; num_downcrossings; num_upcrossings; + DOWNCROSSING_COUNT_EQ_NEG] THEN + GEN_TAC THEN REWRITE_TAC[real_ge; REAL_OF_NUM_LE]; + MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `\n:num. prob_events (p:A prob_space)` THEN + CONJ_TAC THENL [ + REWRITE_TAC[FILTRATION_CONST_EVENTS]; + MATCH_MP_TAC ADAPTED_NEG_BACKWARD THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]]]);; + +(* Random variable for downcrossing counts *) +let RV_NUM_DOWNCROSSINGS = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b. + backward_martingale p FF X + ==> !n. random_variable p (\x. &(num_downcrossings X a b n x))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(\x:A. &(num_downcrossings (X:num->A->real) a b n x)) = + (\x. &(num_upcrossings (\m. \x. --(X m x)) (--b) (--a) n x))` + SUBST1_TAC THENL [ + REWRITE_TAC[FUN_EQ_THM; num_downcrossings; num_upcrossings; + DOWNCROSSING_COUNT_EQ_NEG]; + MP_TAC(ISPECL [`p:A prob_space`; `\n:num. prob_events (p:A prob_space)`; + `\m:num. \x:A. --((X:num->A->real) m x)`; + `--b:real`; `--a:real`] RV_NUM_UPCROSSINGS) THEN + ANTS_TAC THENL [ + CONJ_TAC THENL [ + REWRITE_TAC[FILTRATION_CONST_EVENTS]; + MATCH_MP_TAC ADAPTED_NEG_BACKWARD THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]]; + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[]]]);; + +(* Integrability of downcrossing counts *) +let INTEGRABLE_NUM_DOWNCROSSINGS = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b. + backward_martingale p FF X + ==> !n. integrable p (\x. &(num_downcrossings X a b n x))`, + REPEAT GEN_TAC THEN DISCH_TAC THEN GEN_TAC THEN + MATCH_MP_TAC INTEGRABLE_BOUNDED THEN + EXISTS_TAC `&n` THEN CONJ_TAC THENL [ + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] RV_NUM_DOWNCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[num_downcrossings; DOWNCROSSING_COUNT_EQ_NEG; REAL_ABS_NUM] THEN + REWRITE_TAC[REAL_OF_NUM_LE; UPCROSSING_COUNT_LE]]);; + +(* Backward downcrossing expectation bound for L^1 case *) +let BACKWARD_DOWNCROSSING_EXPECTATION_BOUND_L1 = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b N C. + backward_martingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> (b - a) * expectation p (\x. &(num_downcrossings X a b N x)) + <= C + abs a + (b - a)`, + REPEAT STRIP_TAC THEN + (* Get the reversed submartingale *) + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `N:num`] REVERSED_IS_SUBMARTINGALE) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + (* Upcrossing bound for the reversed submartingale *) + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N - k)`; + `\k:num. (X:num->A->real)(N - k)`; `a:real`; `b:real`; + `N:num`; `C:real`] + UPCROSSING_EXPECTATION_BOUND_L1) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN + (* Integrability of dc *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. &(num_downcrossings (X:num->A->real) a b N x))` ASSUME_TAC THENL [ + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + INTEGRABLE_NUM_DOWNCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `N:num`) THEN + REWRITE_TAC[]; + ALL_TAC] THEN + (* Integrability of uc_rev *) + SUBGOAL_THEN `integrable (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x))` + ASSUME_TAC THENL [ + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N - k)`; + `\k:num. (X:num->A->real)(N - k)`; `a:real`; `b:real`] + INTEGRABLE_NUM_UPCROSSINGS) THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [submartingale]) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `N:num`) THEN + REWRITE_TAC[]; + ALL_TAC] THEN + (* Pointwise: dc <= uc_rev + 1 *) + SUBGOAL_THEN + `!x:A. x IN prob_carrier p ==> + &(num_downcrossings (X:num->A->real) a b N x) <= + &(num_upcrossings (\k. X(N - k)) a b N x) + &1` + ASSUME_TAC THENL [ + REPEAT STRIP_TAC THEN REWRITE_TAC[num_downcrossings; num_upcrossings] THEN + REWRITE_TAC[REAL_OF_NUM_ADD; REAL_OF_NUM_LE] THEN + MATCH_MP_TAC DC_LE_REV_UC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Main chain: (b-a)*E[dc] <= (b-a)*(E[uc_rev]+1) <= C+|a|+(b-a) *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(b - a) * (expectation (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x)) + &1)` THEN + CONJ_TAC THENL [ + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x) + &1)` THEN + CONJ_TAC THENL [ + MATCH_MP_TAC EXPECTATION_MONO THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_ADD THEN ASM_REWRITE_TAC[INTEGRABLE_CONST]; + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x) + &1) = + expectation p (\x. &(num_upcrossings (\k. X(N - k)) a b N x)) + &1` + SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &(num_upcrossings (\k. (X:num->A->real)(N - k)) a b N x)`; + `\x:A. &1`] EXPECTATION_ADD) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[INTEGRABLE_CONST]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN REWRITE_TAC[EXPECTATION_CONST]; + REAL_ARITH_TAC]]; + REWRITE_TAC[REAL_ADD_RDISTRIB; REAL_MUL_RID] THEN ASM_REAL_ARITH_TAC]);; + +(* Backward downcrossing probability bound for L^1 case *) +let BACKWARD_DOWNCROSSING_PROB_BOUND_L1 = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) + a b n C (k:num). + backward_martingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) /\ 0 < k + ==> prob p {x | x IN prob_carrier p /\ + &(num_downcrossings X a b n x) >= &k} + <= (C + abs a + (b - a)) / ((b - a) * &k)`, + REPEAT STRIP_TAC THEN + (* From MARKOV_GE: &k * P(dc >= k) <= E[dc] *) + SUBGOAL_THEN `&k * prob (p:A prob_space) + {x | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &k} <= + expectation p (\x. &(num_downcrossings X a b n x))` ASSUME_TAC THENL [ + MATCH_MP_TAC MARKOV_GE THEN REPEAT CONJ_TAC THENL [ + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] + INTEGRABLE_NUM_DOWNCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[]; + REWRITE_TAC[num_downcrossings] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[REAL_POS]; + ASM_REWRITE_TAC[REAL_OF_NUM_LT]; + MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* From expectation bound: E[dc] <= (C + |a| + (b-a)) / (b-a) *) + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`; `C:real`] + BACKWARD_DOWNCROSSING_EXPECTATION_BOUND_L1) THEN + ANTS_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < b - a` ASSUME_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &k` ASSUME_TAC THENL [ASM_REWRITE_TAC[REAL_OF_NUM_LT]; ALL_TAC] THEN + DISCH_TAC THEN + (* Combine: P(dc >= k) <= (C+|a|+(b-a))/((b-a)*k) *) + (* Via: P*((b-a)*k) <= (b-a)*(k*P) <= (b-a)*E[dc] <= C+|a|+(b-a) *) + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_LT_MUL] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(b - a) * expectation (p:A prob_space) + (\x. &(num_downcrossings (X:num->A->real) a b n x))` THEN + CONJ_TAC THENL [ + SUBGOAL_THEN `prob (p:A prob_space) + {x | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &k} * + ((b - a) * &k) = (b - a) * (&k * prob p + {x | x IN prob_carrier p /\ + &(num_downcrossings X a b n x) >= &k})` + SUBST1_TAC THENL [REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; ASM_REWRITE_TAC[]]; + ASM_REWRITE_TAC[]]);; + +(* a.s. finite downcrossings for L^1-bounded backward martingale *) +let FINITE_DOWNCROSSINGS_AS_L1_BACKWARD = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) a b C. + backward_martingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?B:num. !n. num_downcrossings X a b n x <= B}`, + REPEAT STRIP_TAC THEN REWRITE_TAC[almost_surely] THEN + EXISTS_TAC + `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `(C + abs(a:real) + (b - a)) / (b - a)` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &(SUC j)} + | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC PROB_INDEXED_INTER_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN + GEN_TAC THEN MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + SET_TAC[]]; + SUBGOAL_THEN `(C + abs(a:real) + (b - a)) / (b - a) / &(SUC j) = + (C + abs a + (b - a)) / ((b - a) * &(SUC j))` + SUBST1_TAC THENL + [REWRITE_TAC[real_div; REAL_INV_MUL; REAL_MUL_ASSOC]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + &(num_downcrossings (X:num->A->real) a b n x) >= &(SUC j)} + | n IN (:num)})` THEN + CONJ_TAC THENL [REWRITE_TAC[REAL_LE_REFL]; ALL_TAC] THEN + MATCH_MP_TAC PROB_UNIONS_INCREASING_BOUND THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NUM_DOWNCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `nn:num` THEN REWRITE_TAC[SUBSET; IN_ELIM_THM; real_ge; + REAL_OF_NUM_LE] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[NUM_DOWNCROSSINGS_MONO; LE_TRANS; + ARITH_RULE `nn <= SUC nn`]; + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `nn:num`; + `C:real`; `SUC j`] BACKWARD_DOWNCROSSING_PROB_BOUND_L1) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[LT_0]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS] THEN + REWRITE_TAC[EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM; + real_ge; REAL_OF_NUM_LE] THEN + FIRST_X_ASSUM(MP_TAC o + GEN_REWRITE_RULE I [NOT_EXISTS_THM]) THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + REWRITE_TAC[NOT_FORALL_THM; NOT_LE] THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[] THEN ASM_ARITH_TAC]);; + +(* Helper: running_max is bounded if all components are bounded *) +let RUNNING_MAX_BOUNDED = prove( + `!(f:num->A->real) N x C. + (!m. m <= N ==> f m x <= C) ==> running_max f N x <= C`, + GEN_TAC THEN INDUCT_TAC THEN REPEAT STRIP_TAC THENL + [REWRITE_TAC[running_max] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ARITH_TAC; + REWRITE_TAC[running_max; real_max] THEN COND_CASES_TAC THENL + [FIRST_ASSUM MATCH_MP_TAC THEN ARITH_TAC; + FIRST_X_ASSUM MATCH_MP_TAC THEN GEN_TAC THEN DISCH_TAC THEN + FIRST_ASSUM MATCH_MP_TAC THEN ASM_ARITH_TAC]]);; + +(* Reversal preserves running_max *) +let RUNNING_MAX_REV = prove( + `!N (g:num->A->real) x. + running_max (\m. g(N - m)) N x = running_max g N x`, + REPEAT GEN_TAC THEN REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`\m:num. (g:num->A->real)(N - m)`; `N:num`; `x:A`; + `running_max (g:num->A->real) N x`] RUNNING_MAX_BOUNDED) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN ASM_ARITH_TAC; + MP_TAC(ISPECL [`g:num->A->real`; `N:num`; `x:A`; + `running_max (\m:num. (g:num->A->real)(N - m)) N x`] + RUNNING_MAX_BOUNDED) THEN + DISCH_THEN MATCH_MP_TAC THEN X_GEN_TAC `m:num` THEN DISCH_TAC THEN + SUBGOAL_THEN `(g:num->A->real) m x = (\m. g(N - m)) (N - m) x` + SUBST1_TAC THENL + [BETA_TAC THEN AP_THM_TAC THEN AP_TERM_TAC THEN ASM_ARITH_TAC; + MATCH_MP_TAC RUNNING_MAX_GE THEN ASM_ARITH_TAC]]);; + +(* Backward martingale gives random variables *) +let BACKWARD_MARTINGALE_RV = prove( + `!p:A prob_space FF (X:num->A->real). + backward_martingale p FF X ==> !n. random_variable p (X n)`, + REPEAT GEN_TAC THEN REWRITE_TAC[backward_martingale] THEN STRIP_TAC THEN + GEN_TAC THEN REWRITE_TAC[random_variable] THEN GEN_TAC THEN + UNDISCH_TAC `adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPECL [`n:num`; `a:real`]) THEN + UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration; sub_sigma_algebra; SUBSET] THEN + MESON_TAC[]);; + +(* Running max of pos_part events for backward martingale *) +let BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT = prove( + `!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c N. + backward_martingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) N x >= c} + IN prob_events p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part((X:num->A->real) m x)) N x >= c} + IN (\n:num. prob_events (p:A prob_space)) N` + MP_TAC THENL + [MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN CONJ_TAC THENL + [REWRITE_TAC[FILTRATION_CONST_EVENTS]; ALL_TAC] THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + X_GEN_TAC `n:num` THEN X_GEN_TAC `v:real` THEN + ASM_CASES_TAC `v < &0` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + pos_part((X:num->A->real) n x) <= v} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN GEN_TAC THEN + REWRITE_TAC[DE_MORGAN_THM] THEN DISJ2_TAC THEN + REWRITE_TAC[pos_part] THEN ASM_REAL_ARITH_TAC; + REWRITE_TAC[PROB_EMPTY_IN_EVENTS]]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + pos_part((X:num->A->real) n x) <= v} = + {x | x IN prob_carrier p /\ X n x <= v}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + AP_TERM_TAC THEN REWRITE_TAC[pos_part] THEN ASM_REAL_ARITH_TAC; + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`] BACKWARD_MARTINGALE_RV) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[random_variable] THEN DISCH_THEN(MP_TAC o SPEC `v:real`) THEN + REWRITE_TAC[]]]; + REWRITE_TAC[]]);; + +(* Running max of neg_part events for backward martingale *) +let BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT = prove( + `!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c N. + backward_martingale p FF X + ==> {x | x IN prob_carrier p /\ + running_max (\m x. max (--(X m x)) (&0)) N x >= c} + IN prob_events p`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + running_max (\m x. max (--((X:num->A->real) m x)) (&0)) N x >= c} + IN (\n:num. prob_events (p:A prob_space)) N` + MP_TAC THENL + [MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN CONJ_TAC THENL + [REWRITE_TAC[FILTRATION_CONST_EVENTS]; ALL_TAC] THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + X_GEN_TAC `n:num` THEN X_GEN_TAC `v:real` THEN + ASM_CASES_TAC `&0 <= v` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + max (--((X:num->A->real) n x)) (&0) <= v} = + {x | x IN prob_carrier p /\ X n x >= --v}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + POP_ASSUM MP_TAC THEN UNDISCH_TAC `&0 <= v` THEN REAL_ARITH_TAC; + MATCH_MP_TAC RV_LEVEL_GE_IN_EVENTS THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`] BACKWARD_MARTINGALE_RV) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + SIMP_TAC[ETA_AX]]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ + max (--((X:num->A->real) n x)) (&0) <= v} = {}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; NOT_IN_EMPTY] THEN GEN_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 (fun _ -> ALL_TAC) MP_TAC) THEN + UNDISCH_TAC `~(&0 <= v)` THEN REAL_ARITH_TAC; + REWRITE_TAC[PROB_EMPTY_IN_EVENTS]]]; + REWRITE_TAC[]]);; + +(* Doob maximal inequality for pos_part of backward martingale *) +let BACKWARD_MAXIMAL_POS_PART = prove( + `!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c N C. + backward_martingale p FF X /\ &0 < c /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. pos_part(X m x)) N x >= c} + <= C`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) + (\k. (FF:num->(A->bool)->bool)(N - k)) + (\k. (X:num->A->real)(N - k))` ASSUME_TAC THENL + [MATCH_MP_TAC REVERSED_IS_SUBMARTINGALE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N-k)`; + `\k:num. (X:num->A->real)(N-k)`; `c:real`; `N:num`; `C:real`] + DOOB_MAXIMAL_POS_PART) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN GEN_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_TAC THEN + SUBGOAL_THEN + `!y:A. running_max (\m (x:A). pos_part((X:num->A->real) m x)) N y = + running_max (\m (x:A). pos_part(X(N - m) x)) N y` + (fun th -> REWRITE_TAC[th] THEN FIRST_ASSUM ACCEPT_TAC) THEN + GEN_TAC THEN + MP_TAC(ISPECL [`N:num`; `\m (x:A). pos_part((X:num->A->real) m x)`; + `y:A`] RUNNING_MAX_REV) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(ACCEPT_TAC o GSYM));; + +(* Doob maximal inequality for neg_part of backward martingale *) +let BACKWARD_NEG_PART_MAXIMAL = prove( + `!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) c N C. + backward_martingale p FF X /\ &0 < c /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> c * prob p {x | x IN prob_carrier p /\ + running_max (\m x. max (--(X m x)) (&0)) N x >= c} + <= &2 * C`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) + (\k. (FF:num->(A->bool)->bool)(N - k)) + (\k. (X:num->A->real)(N - k))` ASSUME_TAC THENL + [MATCH_MP_TAC REVERSED_IS_SUBMARTINGALE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `\k:num. (FF:num->(A->bool)->bool)(N-k)`; + `\k:num. (X:num->A->real)(N-k)`; `c:real`; `N:num`; `C:real`] + SUBMARTINGALE_NEG_PART_MAXIMAL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN GEN_TAC THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN DISCH_TAC THEN + SUBGOAL_THEN + `!y:A. running_max (\m (x:A). max (--((X:num->A->real) m x)) (&0)) N y = + running_max (\m (x:A). max (--(X(N - m) x)) (&0)) N y` + (fun th -> REWRITE_TAC[th] THEN FIRST_ASSUM ACCEPT_TAC) THEN + GEN_TAC THEN + MP_TAC(ISPECL [`N:num`; + `\m (x:A). max (--((X:num->A->real) m x)) (&0)`; + `y:A`] RUNNING_MAX_REV) THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(ACCEPT_TAC o GSYM));; + +(* a.s. boundedness for L^1-bounded backward martingale *) +let BACKWARD_MARTINGALE_ALMOST_SURELY_BOUNDED = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) C. + backward_martingale p FF X /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p {x | ?M. !n. abs(X n x) <= M}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Reduce to pos_part and neg_part bounds *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ?M. !n. pos_part((X:num->A->real) n x) <= M} INTER + {x:A | ?M. !n. max (--(X:num->A->real) n x) (&0) <= M}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [(* a.s. pos_part bounded *) + REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `C:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + REWRITE_TAC[]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)}`; + `C / &(SUC j)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. pos_part ((X:num->A->real) m x)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC j)`; `nn:num`; `C:real`] + BACKWARD_MAXIMAL_POS_PART) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LE] THEN DISCH_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&(SUC k)`) THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(\m x. pos_part ((X:num->A->real) m x)) nn x` THEN + CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]; + (* a.s. neg_part bounded *) + REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `&2 * C` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC j)} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + REWRITE_TAC[]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC j)}`; + `(&2 * C) / &(SUC j)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC BACKWARD_SIMPLE_RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. max (--(X:num->A->real) m x) (&0)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC j)`; `nn:num`; `C:real`] + BACKWARD_NEG_PART_MAXIMAL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + GEN_REWRITE_TAC (LAND_CONV) [REAL_MUL_SYM] THEN + ASM_REWRITE_TAC[]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LE] THEN DISCH_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&(SUC k)`) THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(\m x. max (--(X:num->A->real) m x) (&0)) nn x` THEN + CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]]; + (* Subset: pos_part bounded + neg_part bounded ==> abs bounded *) + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_TAC `M1:real`) (X_CHOOSE_TAC `M2:real`)) THEN + EXISTS_TAC `M1 + M2:real` THEN GEN_TAC THEN + MP_TAC(SPEC `n:num` + (ASSUME `!n. pos_part ((X:num->A->real) n x) <= M1`)) THEN + MP_TAC(SPEC `n:num` + (ASSUME `!n. max (--(X:num->A->real) n x) (&0) <= M2`)) THEN + REWRITE_TAC[pos_part] THEN REAL_ARITH_TAC]);; + +(* Main convergence theorem for L^1-bounded backward martingale *) +let BACKWARD_MARTINGALE_CONVERGENCE_L1_BOUNDED = prove( + `!(p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) C. + backward_martingale p FF X /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC RATIONAL_ENUMERATION THEN + DISCH_THEN(X_CHOOSE_TAC `g:num->real`) THEN + (* Step 1: For each k, the downcrossing bound property is a.s. *) + SUBGOAL_THEN + `!k. almost_surely (p:A prob_space) + {x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN + ASM_CASES_TAC `(g:num->real)(NUMFST k) < g(NUMSND k)` THENL + [(* Case a < b: use FINITE_DOWNCROSSINGS_AS_L1_BACKWARD *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ?B. !n. num_downcrossings (X:num->A->real) + ((g:num->real)(NUMFST k)) (g(NUMSND k)) n x <= B}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; + `(g:num->real)(NUMFST (k:num))`; + `(g:num->real)(NUMSND (k:num))`; + `C:real`] FINITE_DOWNCROSSINGS_AS_L1_BACKWARD) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + (* Case a >= b: S_k = UNIV, trivially a.s. *) + SUBGOAL_THEN + `{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} = (:A)` + (fun th -> REWRITE_TAC[th; ALMOST_SURELY_UNIV]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNIV] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Step 2: a.s. bounded *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | ?M. !n. abs((X:num->A->real) n x) <= M}` + ASSUME_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `C:real`] + BACKWARD_MARTINGALE_ALMOST_SURELY_BOUNDED) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: Combine a.s. bounded with a.s. finite rational downcrossings *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ?M. !n. abs((X:num->A->real) n x) <= M} INTER + INTERS {{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} + | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]]; + (* Step 4: Pointwise implication *) + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTERS] THEN + DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC `M:real`) ASSUME_TAC) THEN + (* Extract: for all k, the downcrossing bound property holds *) + SUBGOAL_THEN + `!k. (g:num->real)(NUMFST k) < g(NUMSND k) + ==> ?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | (g:num->real)(NUMFST (k:num)) < g(NUMSND k) ==> + (?B. !n. num_downcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}`) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `k:num` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Apply BOUNDED_FINITE_DOWNCROSSINGS_IMP_CONVERGENT *) + MP_TAC(ISPECL [`\n:num. (X:num->A->real) n x`; `M:real`] + BOUNDED_FINITE_DOWNCROSSINGS_IMP_CONVERGENT) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN + (* Find i,j with g(i) = a, g(j) = b *) + SUBGOAL_THEN `?i:num. (g:num->real) i = a` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `a:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `?j:num. (g:num->real) j = b` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `b:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + (* Use k = NUMPAIR i j *) + FIRST_X_ASSUM(MP_TAC o SPEC `NUMPAIR i j`) THEN + REWRITE_TAC[NUMPAIR_DEST] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:num`) THEN + EXISTS_TAC `B:num` THEN X_GEN_TAC `n:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[num_downcrossings]; + REWRITE_TAC[]]]);; + +let UPCROSSING_PROB_BOUND_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b n C k. + submartingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) /\ + 0 < k + ==> prob p {x | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} + <= (C + abs(a)) / ((b - a) * &k)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF /\ adapted p FF X` + STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [submartingale]) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 < (b - a) * &k` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN CONJ_TAC THENL + [ASM_REAL_ARITH_TAC; + UNDISCH_TAC `0 < k` THEN REWRITE_TAC[GSYM REAL_OF_NUM_LT] THEN + REAL_ARITH_TAC]; + ALL_TAC] THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `(b - a) * expectation (p:A prob_space) + (\x:A. &(num_upcrossings (X:num->A->real) a b n x))` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `&0 < b - a` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < &k` ASSUME_TAC THENL + [UNDISCH_TAC `0 < k` THEN REWRITE_TAC[GSYM REAL_OF_NUM_LT] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&k * prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + &(num_upcrossings (X:num->A->real) a b n x) >= &k} + <= expectation p (\x. &(num_upcrossings X a b n x))` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. &(num_upcrossings (X:num->A->real) a b n x)`; + `&k`] MARKOV_GE) THEN + ASM_REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`] INTEGRABLE_NUM_UPCROSSINGS) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[REAL_POS]; + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`; `k:num`] + NUM_UPCROSSINGS_GE_EVENT) THEN + ASM_REWRITE_TAC[]]; + REWRITE_TAC[]]; + ABBREV_TAC `PP = prob (p:A prob_space) {x:A | x IN prob_carrier p /\ + &(num_upcrossings (X:num->A->real) a b n x) >= &k}` THEN + ABBREV_TAC `EE = expectation (p:A prob_space) + (\x:A. &(num_upcrossings (X:num->A->real) a b n x))` THEN + SUBGOAL_THEN `PP * (b - a) * &k = (b - a) * (&k * PP)` SUBST1_TAC THENL + [REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_LMUL THEN ASM_REWRITE_TAC[] THEN + ASM_REAL_ARITH_TAC]; + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `n:num`; `C:real`] + UPCROSSING_EXPECTATION_BOUND_L1) THEN + ASM_REWRITE_TAC[]]);; + +let PROB_INCREASING_UNION_BOUND = prove + (`!p:A prob_space (A:num->A->bool) c. + (!n. A n IN prob_events p) /\ + (!m n. m <= n ==> A m SUBSET A n) /\ + (!n. prob p (A n) <= c) + ==> prob p (UNIONS {A n | n IN (:num)}) <= c`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `real_liminf (\n. prob (p:A prob_space) ((A:num->A->bool) n))` THEN + CONJ_TAC THENL + [SUBGOAL_THEN `UNIONS {(A:num->A->bool) n | n IN (:num)} = liminf_events A` + SUBST1_TAC THENL + [SUBGOAL_THEN `!m. INTERS {(A:num->A->bool) n | n >= m} = A m` + ASSUME_TAC THENL + [GEN_TAC THEN REWRITE_TAC[EXTENSION; IN_INTERS; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [DISCH_THEN(MP_TAC o SPEC `(A:num->A->bool) m`) THEN + REWRITE_TAC[IN_ELIM_THM] THEN + ANTS_TAC THENL [EXISTS_TAC `m:num` THEN ARITH_TAC; REWRITE_TAC[]]; + DISCH_TAC THEN X_GEN_TAC `t:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` (CONJUNCTS_THEN2 ASSUME_TAC + (fun th -> REWRITE_TAC[th]))) THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m:num`; `n:num`]) THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `n:num >= m` THEN REWRITE_TAC[GE] THEN + STRIP_TAC THEN ASM SET_TAC[]]; + REWRITE_TAC[liminf_events] THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC FATOU_EVENTS_LIMINF THEN ASM_REWRITE_TAC[]]; + MATCH_MP_TAC REAL_LIMINF_UBOUND THEN + EXISTS_TAC `&0` THEN ASM_REWRITE_TAC[] THEN + GEN_TAC THEN MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]]);; + +let INFINITE_UPCROSSINGS_NULL_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b C. + submartingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> !k. 0 < k ==> + prob p (UNIONS { + {x | x IN prob_carrier p /\ &(num_upcrossings X a b n x) >= &k} + | n IN (:num)}) <= (C + abs(a)) / ((b - a) * &k)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_INCREASING_UNION_BOUND THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [submartingale]) THEN + ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [real_ge]) THEN + DISCH_TAC THEN REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `&(num_upcrossings (X:num->A->real) a b m x)` THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_OF_NUM_LE; num_upcrossings] THEN + MATCH_MP_TAC UPCROSSING_COUNT_INCREASING THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN MATCH_MP_TAC UPCROSSING_PROB_BOUND_L1 THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]]);; + +let REAL_LE_ZERO_FROM_BOUND = prove + (`!x c d. &0 < d /\ (!k. 0 < k ==> x <= c / (d * &k)) ==> x <= &0`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + MP_TAC(SPEC `c / (d * x):real` REAL_ARCH_LT) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `SUC N`) THEN + REWRITE_TAC[ARITH_RULE `0 < SUC N`] THEN + REWRITE_TAC[REAL_NOT_LE] THEN + SUBGOAL_THEN `&0 < d * &(SUC N)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[REAL_OF_NUM_LT] THEN + ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `&0 < d * x` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_MUL THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `c / (d * x) < &N` THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LT_LDIV_EQ] THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN EXISTS_TAC `&N * (d * x)` THEN + CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + SUBGOAL_THEN `&N * d * x = &N * (d * x) /\ + x * d * &(SUC N) = &(SUC N) * (d * x)` + (fun th -> REWRITE_TAC[th]) THENL + [CONJ_TAC THEN REWRITE_TAC[REAL_MUL_AC]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_RMUL THEN CONJ_TAC THENL + [REWRITE_TAC[REAL_OF_NUM_LE] THEN ARITH_TAC; + MATCH_MP_TAC REAL_LT_IMP_LE THEN ASM_REWRITE_TAC[]]]);; + +let FINITE_UPCROSSINGS_AS_L1 = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) a b C. + submartingale p FF X /\ a < b /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?B:num. !n. num_upcrossings X a b n x <= B}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[almost_surely; null_event; IN_ELIM_THM; + NOT_EXISTS_THM; NOT_FORALL_THM; NOT_LE] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ &(num_upcrossings X a b n x) >= &k} + | n IN (:num)} | k | 0 < k}` THEN + MATCH_MP_TAC(TAUT `c /\ (c ==> a /\ b) ==> (a /\ b) /\ c`) THEN + CONJ_TAC THENL + [(* Subset part *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS; IN_UNIONS; IN_UNIV] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN + X_GEN_TAC `t:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` (CONJUNCTS_THEN2 ASSUME_TAC + (fun th -> REWRITE_TAC[th]))) THEN + REWRITE_TAC[IN_UNIONS; IN_ELIM_THM; IN_UNIV] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `k:num`) THEN + DISCH_THEN(X_CHOOSE_TAC `n:num`) THEN + EXISTS_TAC `{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k}` THEN + CONJ_TAC THENL + [EXISTS_TAC `n:num` THEN REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[real_ge; REAL_OF_NUM_LE] THEN + ASM_ARITH_TAC]; + DISCH_TAC] THEN + (* Each Uk is in events *) + SUBGOAL_THEN `!k. 0 < k ==> UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} | n IN (:num)} IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIV] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` ASSUME_TAC) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC NUM_UPCROSSINGS_GE_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o GEN_REWRITE_RULE I [submartingale]) THEN + ASM_REWRITE_TAC[]; + MATCH_MP_TAC COUNTABLE_SUBSET THEN + EXISTS_TAC `IMAGE (\n. {x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k}) (:num)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE; IN_UNIV] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `nn:num` ASSUME_TAC) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* INTERS is in events *) + SUBGOAL_THEN `INTERS {UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} | n IN (:num)} | 0 < k} + IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_INTERS_IN_EVENTS THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `kk:num` (CONJUNCTS_THEN2 ASSUME_TAC + (fun th -> REWRITE_TAC[th]))) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC COUNTABLE_SUBSET THEN + EXISTS_TAC `IMAGE (\k. UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} | n IN (:num)}) (:num)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_IMAGE; IN_UNIV] THEN + X_GEN_TAC `s:A->bool` THEN + DISCH_THEN(X_CHOOSE_THEN `kk:num` (CONJUNCTS_THEN2 ASSUME_TAC + (fun th -> REWRITE_TAC[th]))) THEN + EXISTS_TAC `kk:num` THEN REWRITE_TAC[]]; + REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &1} | n IN (:num)}` THEN + EXISTS_TAC `1` THEN ARITH_TAC]; + ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + (* Prob = 0 *) + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_LE_ZERO_FROM_BOUND THEN + MAP_EVERY EXISTS_TAC [`C + abs(a:real)`; `b - a:real`] THEN + CONJ_TAC THENL [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + GEN_TAC THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_SIMP_TAC[] THEN + REWRITE_TAC[SUBSET; IN_INTERS; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `UNIONS {{x:A | x IN prob_carrier p /\ + &(num_upcrossings X a b n x) >= &k} | n IN (:num)}`) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_ELIM_THM] THEN EXISTS_TAC `k:num` THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[]]; + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `a:real`; `b:real`; `C:real`] + INFINITE_UPCROSSINGS_NULL_L1) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(MP_TAC o SPEC `k:num`) THEN + ASM_REWRITE_TAC[]]]);; + +(* ---- Step 8: A.s. boundedness for L1-bounded submartingales ---- *) + +(* This follows from DOOB_MAXIMAL_POS_PART and + SUBMARTINGALE_NEG_PART_MAXIMAL via Borel-Cantelli type argument: + P(exists n. |X_n| >= c) <= C/c + 2C/c = 3C/c -> 0 as c -> inf *) +let SUBMARTINGALE_ALMOST_SURELY_BOUNDED = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) C. + submartingale p FF X /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p {x | ?M. !n. abs(X n x) <= M}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + (* Reduce to pos_part and neg_part bounds *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ?M. !n. pos_part((X:num->A->real) n x) <= M} INTER + {x:A | ?M. !n. max (--(X:num->A->real) n x) (&0) <= M}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [(* a.s. pos_part bounded *) + REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `C:real` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + REWRITE_TAC[]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. pos_part ((X:num->A->real) m x)) n x + >= &(SUC j)}`; + `C / &(SUC j)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RUNNING_MAX_POS_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. pos_part ((X:num->A->real) m x)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC j)`; `nn:num`; `C:real`] + DOOB_MAXIMAL_POS_PART) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LE] THEN DISCH_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&(SUC k)`) THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(\m x. pos_part ((X:num->A->real) m x)) nn x` THEN + CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]; + (* a.s. neg_part bounded *) + REWRITE_TAC[almost_surely] THEN + EXISTS_TAC `INTERS {UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)} + | n IN (:num)} | k IN (:num)}` THEN + CONJ_TAC THENL + [REWRITE_TAC[null_event] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC REAL_EQ_0_FROM_INV_BOUND THEN + EXISTS_TAC `&2 * C` THEN CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `j:num` THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `prob (p:A prob_space) (UNIONS { + {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC j)} | n IN (:num)})` THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\k n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC k)}`] INTERS_UNIONS_IN_EVENTS) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN REPEAT GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INDEXED_UNION_IN_EVENTS THEN GEN_TAC THEN + MATCH_MP_TAC RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SUBSET; IN_INTERS; SIMPLE_IMAGE; + FORALL_IN_IMAGE; IN_UNIV] THEN + GEN_TAC THEN DISCH_THEN(MP_TAC o SPEC `j:num`) THEN + REWRITE_TAC[]]; + MP_TAC(ISPECL [ + `p:A prob_space`; + `\n. {x:A | x IN prob_carrier p /\ + running_max (\m x. max (--(X:num->A->real) m x) (&0)) n x + >= &(SUC j)}`; + `(&2 * C) / &(SUC j)`] PROB_UNIONS_INCREASING_BOUND) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN + REPEAT CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC RUNNING_MAX_NEG_PART_EVENT THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN REWRITE_TAC[SUBSET; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[real_ge] THEN MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `running_max (\m x. max (--(X:num->A->real) m x) (&0)) + n (x:A)` THEN + REWRITE_TAC[RUNNING_MAX_MONO_SUC] THEN + FIRST_X_ASSUM(ACCEPT_TAC o REWRITE_RULE[real_ge]); + X_GEN_TAC `nn:num` THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `&(SUC j)`; `nn:num`; `C:real`] + SUBMARTINGALE_NEG_PART_MAXIMAL) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_TAC THEN + ASM_SIMP_TAC[REAL_LE_RDIV_EQ; REAL_OF_NUM_LT; LT_0] THEN + GEN_REWRITE_TAC (LAND_CONV) [REAL_MUL_SYM] THEN + ASM_REWRITE_TAC[]]]]]; + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_INTERS] THEN + X_GEN_TAC `x:A` THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o GEN_REWRITE_RULE I [NOT_EXISTS_THM])) THEN + REWRITE_TAC[NOT_FORALL_THM; REAL_NOT_LE] THEN DISCH_TAC THEN + GEN_TAC THEN REWRITE_TAC[SIMPLE_IMAGE; IN_IMAGE; IN_UNIV] THEN + DISCH_THEN(X_CHOOSE_THEN `k:num` SUBST1_TAC) THEN + REWRITE_TAC[IN_UNIONS; EXISTS_IN_IMAGE; IN_UNIV; IN_ELIM_THM] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `&(SUC k)`) THEN + DISCH_THEN(X_CHOOSE_TAC `nn:num`) THEN + EXISTS_TAC `nn:num` THEN ASM_REWRITE_TAC[real_ge] THEN + MATCH_MP_TAC REAL_LT_IMP_LE THEN + MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(\m x. max (--(X:num->A->real) m x) (&0)) nn x` THEN + CONJ_TAC THENL [BETA_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC RUNNING_MAX_GE THEN REWRITE_TAC[LE_REFL]]]; + (* Subset: pos_part bounded + neg_part bounded ==> abs bounded *) + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + DISCH_THEN(CONJUNCTS_THEN2 + (X_CHOOSE_TAC `M1:real`) (X_CHOOSE_TAC `M2:real`)) THEN + EXISTS_TAC `M1 + M2:real` THEN GEN_TAC THEN + MP_TAC(SPEC `n:num` + (ASSUME `!n. pos_part ((X:num->A->real) n x) <= M1`)) THEN + MP_TAC(SPEC `n:num` + (ASSUME `!n. max (--(X:num->A->real) n x) (&0) <= M2`)) THEN + REWRITE_TAC[pos_part] THEN REAL_ARITH_TAC]);; + +(* ---- Step 9: Main convergence theorem ---- *) + +let SUBMARTINGALE_CONVERGENCE_L1_BOUNDED = prove + (`!p:A prob_space (FF:num->(A->bool)->bool) (X:num->A->real) C. + submartingale p FF X /\ + (!n. expectation p (\x. abs(X n x)) <= C) + ==> almost_surely p + {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + MP_TAC RATIONAL_ENUMERATION THEN + DISCH_THEN(X_CHOOSE_TAC `g:num->real`) THEN + (* Step 1: For each k, the upcrossing bound property is a.s. *) + SUBGOAL_THEN + `!k. almost_surely (p:A prob_space) + {x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN + ASM_CASES_TAC `(g:num->real)(NUMFST k) < g(NUMSND k)` THENL + [(* Case a < b: use FINITE_UPCROSSINGS_AS_L1 *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC `{x:A | ?B. !n. num_upcrossings (X:num->A->real) + ((g:num->real)(NUMFST k)) (g(NUMSND k)) n x <= B}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; + `(g:num->real)(NUMFST (k:num))`; + `(g:num->real)(NUMSND (k:num))`; + `C:real`] FINITE_UPCROSSINGS_AS_L1) THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + (* Case a >= b: S_k = UNIV, so a.s. trivially *) + SUBGOAL_THEN + `{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} = (:A)` + (fun th -> REWRITE_TAC[th; ALMOST_SURELY_UNIV]) THEN + REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_UNIV] THEN + ASM_MESON_TAC[]]; + ALL_TAC] THEN + (* Step 2: a.s. bounded *) + SUBGOAL_THEN + `almost_surely (p:A prob_space) + {x:A | ?M. !n. abs((X:num->A->real) n x) <= M}` + ASSUME_TAC THENL + [MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `C:real`] + SUBMARTINGALE_ALMOST_SURELY_BOUNDED) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Step 3: Combine a.s. bounded with a.s. finite rational upcrossings *) + MATCH_MP_TAC ALMOST_SURELY_SUBSET THEN + EXISTS_TAC + `{x:A | ?M. !n. abs((X:num->A->real) n x) <= M} INTER + INTERS {{x:A | (g:num->real)(NUMFST k) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)} + | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC ALMOST_SURELY_INTER THEN CONJ_TAC THENL + [ASM_REWRITE_TAC[]; + MATCH_MP_TAC ALMOST_SURELY_COUNTABLE_INTER THEN ASM_REWRITE_TAC[]]; + (* Step 4: Pointwise implication *) + REWRITE_TAC[IN_INTER; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[IN_INTERS] THEN + DISCH_THEN(CONJUNCTS_THEN2 (X_CHOOSE_TAC `M:real`) ASSUME_TAC) THEN + (* Extract: for all k, the upcrossing bound property holds *) + SUBGOAL_THEN + `!k. (g:num->real)(NUMFST k) < g(NUMSND k) + ==> ?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B` + ASSUME_TAC THENL + [X_GEN_TAC `k:num` THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `{x:A | (g:num->real)(NUMFST (k:num)) < g(NUMSND k) ==> + (?B. !n. num_upcrossings (X:num->A->real) + (g(NUMFST k)) (g(NUMSND k)) n x <= B)}`) THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `k:num` THEN REFL_TAC; ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Apply BOUNDED_FINITE_UPCROSSINGS_IMP_CONVERGENT *) + MP_TAC(ISPECL [`\n:num. (X:num->A->real) n x`; `M:real`] + BOUNDED_FINITE_UPCROSSINGS_IMP_CONVERGENT) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MAP_EVERY X_GEN_TAC [`a:real`; `b:real`] THEN STRIP_TAC THEN + (* Find i,j with g(i) = a, g(j) = b *) + SUBGOAL_THEN `?i:num. (g:num->real) i = a` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `a:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `?j:num. (g:num->real) j = b` STRIP_ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o SPEC `b:real` o + GEN_REWRITE_RULE I [EXTENSION]) THEN + REWRITE_TAC[IN_IMAGE; IN_UNIV] THEN + ASM_REWRITE_TAC[IN] THEN MESON_TAC[]; + ALL_TAC] THEN + (* Use k = NUMPAIR i j *) + FIRST_X_ASSUM(MP_TAC o SPEC `NUMPAIR i j`) THEN + REWRITE_TAC[NUMPAIR_DEST] THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:num`) THEN + EXISTS_TAC `B:num` THEN X_GEN_TAC `n:num` THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num`) THEN + REWRITE_TAC[num_upcrossings]; + REWRITE_TAC[]]]);; + +(* ---- Step 10: UI submartingale convergence ---- *) + +let UI_SUBMARTINGALE_CONVERGENCE_AS = prove + (`!p:A prob_space FF X. + uniformly_integrable p X /\ submartingale p FF X + ==> almost_surely p {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP UI_IMP_L1_BOUNDED) THEN + DISCH_THEN(X_CHOOSE_TAC `C:real`) THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `C:real`] + SUBMARTINGALE_CONVERGENCE_L1_BOUNDED) THEN + ASM_REWRITE_TAC[]);; + +let UI_BACKWARD_MARTINGALE_CONVERGENCE_AS = prove + (`!p:A prob_space FF X. + uniformly_integrable p X /\ backward_martingale p FF X + ==> almost_surely p {x | ?L. ((\n. X n x) ---> L) sequentially}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP UI_IMP_L1_BOUNDED) THEN + DISCH_THEN(X_CHOOSE_TAC `C:real`) THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `C:real`] + BACKWARD_MARTINGALE_CONVERGENCE_L1_BOUNDED) THEN + ASM_REWRITE_TAC[]);; + +(* ==================================================================== *) +(* Unbounded optional stopping under uniform integrability (Gap 3) *) +(* Williams Ch 10, Theorem 10.10 *) +(* ==================================================================== *) + +(* Arithmetic helpers for MIN on natural numbers *) + +let MIN_LE_RIGHT = prove + (`!t N n:num. N <= n ==> MIN t N <= n`, + REPEAT GEN_TAC THEN + MATCH_MP_TAC(ARITH_RULE `MIN t N <= N ==> N <= n ==> MIN t N <= n`) THEN + ARITH_TAC);; + +let MIN_LE_IFF = prove + (`!t N n:num. ~(N <= n) ==> (MIN t N <= n <=> t <= n)`, + REPEAT GEN_TAC THEN SIMP_TAC[MIN] THEN ARITH_TAC);; + +(* Truncation of stopping time: MIN(tau, N) is a bounded stopping time *) + +let STOPPING_TIME_MIN = prove + (`!p FF (tau:A->num) N. + stopping_time p FF tau /\ filtration p FF + ==> bounded_stopping_time p FF (\x. MIN (tau x) N) N`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[bounded_stopping_time] THEN + CONJ_TAC THENL + [REWRITE_TAC[stopping_time] THEN X_GEN_TAC `n:num` THEN + ASM_CASES_TAC `N:num <= n` THENL + [SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ MIN (tau x) N <= n} = + prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `y:A` THEN + EQ_TAC THENL + [SIMP_TAC[]; + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `N:num <= n` + (fun th -> SIMP_TAC[th; MIN_LE_RIGHT]) THEN + ASM_REWRITE_TAC[]]; + ASM_MESON_TAC[filtration; SUB_SIGMA_ALGEBRA_CARRIER_IN]]; + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ MIN (tau x) N <= n} = + {x | x IN prob_carrier p /\ tau x <= n}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `y:A` THEN + AP_TERM_TAC THEN + SUBGOAL_THEN `~(N:num <= n)` + (fun th -> SIMP_TAC[th; MIN_LE_IFF]) THEN + ASM_REWRITE_TAC[]; + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [stopping_time]) THEN + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[]]]; + GEN_TAC THEN DISCH_TAC THEN ARITH_TAC]);; + +(* Stopped process with truncated tau at N agrees with original *) + +let STOPPED_PROCESS_TRUNCATION_AGREE = prove + (`!X (tau:A->num) N x. + stopped_process X (\x. MIN (tau x) N) N x = stopped_process X tau N x`, + REPEAT GEN_TAC THEN REWRITE_TAC[stopped_process] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ARITH_TAC);; + +(* Pointwise convergence of stopped process to X(tau(x), x) *) + +let STOPPED_PROCESS_POINTWISE_LIMIT = prove + (`!X (tau:A->num) x. + ((\n. stopped_process X tau n x) ---> X (tau x) x) sequentially`, + REPEAT GEN_TAC THEN MATCH_MP_TAC REALLIM_EVENTUALLY THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN EXISTS_TAC `(tau:A->num) x` THEN + REPEAT STRIP_TAC THEN REWRITE_TAC[stopped_process] THEN + AP_THM_TAC THEN AP_TERM_TAC THEN ASM_ARITH_TAC);; + +(* Main theorem: unbounded optional stopping for martingales *) + +let OPTIONAL_STOPPING_UI = prove + (`!p FF X (tau:A->num). + martingale p FF X /\ stopping_time p FF tau /\ + uniformly_integrable p (\n. stopped_process X tau n) + ==> integrable p (\x. X (tau x) x) /\ + expectation p (\x. X (tau x) x) = expectation p (X 0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `integrable p (\x:A. X (tau x) x) /\ + ((\n. expectation p (\x. abs(stopped_process X tau n x - X (tau x) x))) + ---> &0) sequentially` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC UI_POINTWISE_L1 THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(\n x:A. stopped_process X tau n x) = (\n. stopped_process X tau n)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; ETA_AX]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[STOPPED_PROCESS_POINTWISE_LIMIT]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. expectation p (stopped_process (X:num->A->real) tau n) = + expectation p (X 0)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(SPECL [`p:(A)prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `\x:A. MIN (tau x) n`; `n:num`] + DOOB_OPTIONAL_STOPPING) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC STOPPING_TIME_MIN THEN + ASM_MESON_TAC[martingale]; + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + SUBGOAL_THEN + `stopped_process X (\x:A. MIN (tau x) n) n = stopped_process X tau n` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_TRUNCATION_AGREE]]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_UNIQUE) THEN + EXISTS_TAC + `\n. expectation p (stopped_process (X:num->A->real) tau n)` THEN + CONJ_TAC THENL [REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY]; ALL_TAC] THEN + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(fun th -> + MP_TAC(MATCH_MP (SPEC `e:real` th) (ASSUME `&0 < e`))) THEN + MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN + MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN + MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC + `expectation p + (\x:A. abs(stopped_process X tau n x - X (tau x) x))` THEN + CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN + SUBGOAL_THEN + `expectation p (stopped_process (X:num->A->real) tau n) - + expectation p (\x. X (tau x) x) = + expectation p (\x. stopped_process X tau n x - X (tau x) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:(A)prob_space`; + `stopped_process (X:num->A->real) tau n`; + `\x:A. (X:num->A->real) (tau x) x`] EXPECTATION_SUB) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[]; + REWRITE_TAC[]]; + MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]]; + ASM_REWRITE_TAC[REALLIM_CONST]]);; + +(* Submartingale variant *) + +let SUBMARTINGALE_OPTIONAL_STOPPING_UI = prove + (`!p FF X (tau:A->num). + submartingale p FF X /\ stopping_time p FF tau /\ + uniformly_integrable p (\n. stopped_process X tau n) + ==> integrable p (\x. X (tau x) x) /\ + expectation p (X 0) <= expectation p (\x. X (tau x) x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `integrable p (\x:A. X (tau x) x) /\ + ((\n. expectation p (\x. abs(stopped_process X tau n x - X (tau x) x))) + ---> &0) sequentially` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC UI_POINTWISE_L1 THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(\n x:A. stopped_process X tau n x) = (\n. stopped_process X tau n)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; ETA_AX]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[STOPPED_PROCESS_POINTWISE_LIMIT]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. expectation p ((X:num->A->real) 0) <= + expectation p (stopped_process X tau n)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(SPECL [`p:(A)prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `\x:A. MIN (tau x) n`; `n:num`] + SUBMARTINGALE_OPTIONAL_STOPPING_GE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC STOPPING_TIME_MIN THEN + ASM_MESON_TAC[submartingale; martingale]; + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + SUBGOAL_THEN + `stopped_process X (\x:A. MIN (tau x) n) n = stopped_process X tau n` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_TRUNCATION_AGREE]]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC `\n:num. expectation p ((X:num->A->real) 0)` THEN + EXISTS_TAC + `\n:num. expectation p (stopped_process (X:num->A->real) tau n)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; REALLIM_CONST] THEN + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(fun th -> + MP_TAC(MATCH_MP (SPEC `e:real` th) (ASSUME `&0 < e`))) THEN + MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN + MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN + MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC + `expectation p + (\x:A. abs(stopped_process X tau n x - X (tau x) x))` THEN + CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN + SUBGOAL_THEN + `expectation p (stopped_process (X:num->A->real) tau n) - + expectation p (\x. X (tau x) x) = + expectation p (\x. stopped_process X tau n x - X (tau x) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:(A)prob_space`; + `stopped_process (X:num->A->real) tau n`; + `\x:A. (X:num->A->real) (tau x) x`] EXPECTATION_SUB) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[]; + REWRITE_TAC[]]; + MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]]; + ASM_REWRITE_TAC[EVENTUALLY_TRUE]]);; + +(* Supermartingale variant *) + +let SUPERMARTINGALE_OPTIONAL_STOPPING_UI = prove + (`!p FF X (tau:A->num). + supermartingale p FF X /\ stopping_time p FF tau /\ + uniformly_integrable p (\n. stopped_process X tau n) + ==> integrable p (\x. X (tau x) x) /\ + expectation p (\x. X (tau x) x) <= expectation p (X 0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN + `integrable p (\x:A. X (tau x) x) /\ + ((\n. expectation p (\x. abs(stopped_process X tau n x - X (tau x) x))) + ---> &0) sequentially` + STRIP_ASSUME_TAC THENL + [MATCH_MP_TAC UI_POINTWISE_L1 THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN + `(\n x:A. stopped_process X tau n x) = (\n. stopped_process X tau n)` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[FUN_EQ_THM; ETA_AX]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN + GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[STOPPED_PROCESS_POINTWISE_LIMIT]; + ALL_TAC] THEN + SUBGOAL_THEN + `!n. expectation p (stopped_process (X:num->A->real) tau n) <= + expectation p (X 0)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(SPECL [`p:(A)prob_space`; `FF:num->(A->bool)->bool`; + `X:num->A->real`; `\x:A. MIN (tau x) n`; `n:num`] + SUPERMARTINGALE_OPTIONAL_STOPPING_LE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN MATCH_MP_TAC STOPPING_TIME_MIN THEN + ASM_MESON_TAC[supermartingale; martingale]; + DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + SUBGOAL_THEN + `stopped_process X (\x:A. MIN (tau x) n) n = stopped_process X tau n` + (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_TRUNCATION_AGREE]]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC(ISPEC `sequentially` REALLIM_LE) THEN + EXISTS_TAC + `\n:num. expectation p (stopped_process (X:num->A->real) tau n)` THEN + EXISTS_TAC `\n:num. expectation p ((X:num->A->real) 0)` THEN + REWRITE_TAC[TRIVIAL_LIMIT_SEQUENTIALLY; REALLIM_CONST] THEN + CONJ_TAC THENL + [REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN X_GEN_TAC `e:real` THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [REALLIM_SEQUENTIALLY]) THEN + DISCH_THEN(fun th -> + MP_TAC(MATCH_MP (SPEC `e:real` th) (ASSUME `&0 < e`))) THEN + MATCH_MP_TAC MONO_EXISTS THEN X_GEN_TAC `N:num` THEN + MATCH_MP_TAC MONO_FORALL THEN X_GEN_TAC `n:num` THEN + MATCH_MP_TAC MONO_IMP THEN REWRITE_TAC[] THEN DISCH_TAC THEN + MATCH_MP_TAC REAL_LET_TRANS THEN + EXISTS_TAC + `expectation p + (\x:A. abs(stopped_process X tau n x - X (tau x) x))` THEN + CONJ_TAC THENL [ALL_TAC; ASM_REAL_ARITH_TAC] THEN + SUBGOAL_THEN + `expectation p (stopped_process (X:num->A->real) tau n) - + expectation p (\x. X (tau x) x) = + expectation p (\x. stopped_process X tau n x - X (tau x) x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(SPECL [`p:(A)prob_space`; + `stopped_process (X:num->A->real) tau n`; + `\x:A. (X:num->A->real) (tau x) x`] EXPECTATION_SUB) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[]; + REWRITE_TAC[]]; + MATCH_MP_TAC EXPECTATION_ABS_BOUND THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [uniformly_integrable]) THEN + SIMP_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[ETA_AX]]; + ASM_REWRITE_TAC[EVENTUALLY_TRUE]]);; + + +(* ========================================================================= *) +(* GENERAL DOOB DECOMPOSITION *) +(* Removes FINITE(FF n) and simple_rv restrictions from DOOB_DECOMPOSITION. *) +(* Uses gen_cond_exp instead of simple_cond_exp. Williams Ch 12, Thm 12.14. *) +(* ========================================================================= *) + +(* General predictable: H_{n+1} is FF_n-measurable (no simple_rv requirement) *) +let gen_predictable = new_definition + `gen_predictable (p:A prob_space) (FF:num->(A->bool)->bool) (H:num->A->real) <=> + measurable_wrt p (FF 0) (H 0) /\ + (!n. measurable_wrt p (FF n) (H (SUC n)))`;; + +(* General Doob compensator: A_0 = 0, A_{n+1} = A_n + E[X_{n+1}|FF_n] - X_n *) +let gen_doob_compensator = define + `(gen_doob_compensator (p:A prob_space) (FF:num->(A->bool)->bool) + (X:num->A->real) 0 (x:A) = &0) /\ + (gen_doob_compensator p FF X (SUC n) x = + gen_doob_compensator p FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x)`;; + +(* Submartingale property via gen_cond_exp: E[X_{n+1}|FF_n] >= X_n a.s. *) +let SUBMARTINGALE_GEN_COND_EXP_GE = prove + (`!p:A prob_space FF (X:num->A->real) n. + submartingale p FF X + ==> almost_surely p + {x | X n x <= gen_cond_exp p (FF n) (X (SUC n)) x}`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[almost_surely] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + ~(x IN {x | (X:num->A->real) n x <= + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x})} = + {x | x IN prob_carrier p /\ + gen_cond_exp p (FF n) (X (SUC n)) x - X n x < &0}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) ((X:num->A->real) (SUC n))` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale; adapted]; ALL_TAC] THEN + ABBREV_TAC + `A_k = \k:num. {x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < + --inv(&(SUC k))}` THEN + EXISTS_TAC `UNIONS {(A_k:num->A->bool) k | k IN (:num)}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC NULL_EVENT_COUNTABLE_UNION THEN X_GEN_TAC `k:num` THEN + SUBGOAL_THEN + `(A_k:num->A->bool) k = + {x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < --inv(&(SUC k))}` + SUBST1_TAC THENL + [EXPAND_TAC "A_k" THEN BETA_TAC THEN REFL_TAC; ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < --inv (&(SUC k))} IN + FF n` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n))`; + `(X:num->A->real) n`; + `--inv(&(SUC k))`] MEASURABLE_WRT_DIFF_LT) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < --inv(&(SUC k))} IN + prob_events p` + ASSUME_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + REWRITE_TAC[null_event] THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC(REAL_ARITH `&0 <= x /\ x <= &0 ==> x = &0`) THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_POSITIVE THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 < inv(&(SUC k))` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LT_INV THEN REWRITE_TAC[REAL_OF_NUM_LT; LT_0]; + ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) + {x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < --inv(&(SUC k))} <= &0 <=> + inv(&(SUC k)) * prob p + {x | x IN prob_carrier p /\ + gen_cond_exp p (FF n) (X (SUC n)) x - X n x < --inv(&(SUC k))} <= + inv(&(SUC k)) * &0` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC REAL_LE_LMUL_EQ THEN + ASM_REWRITE_TAC[]; + REWRITE_TAC[REAL_MUL_RZERO]] THEN + (* conditioning: E[gen_cond_exp * 1_A] = E[X_{n+1} * 1_A] *) + SUBGOAL_THEN + `expectation p (\x:A. gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x * + indicator_fn + {x | x IN prob_carrier p /\ + gen_cond_exp p (FF n) (X (SUC n)) x - X n x < --inv(&(SUC k))} x) = + expectation p (\x. X (SUC n) x * + indicator_fn + {x | x IN prob_carrier p /\ + gen_cond_exp p (FF n) (X (SUC n)) x - X n x < --inv(&(SUC k))} x)` + ASSUME_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_CONDITIONING THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* submartingale inequality *) + SUBGOAL_THEN + `expectation p (\x:A. (X:num->A->real) n x * + indicator_fn + {x | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x - X n x < + --inv(&(SUC k))} x) <= + expectation p (\x. X (SUC n) x * + indicator_fn + {x | x IN prob_carrier p /\ + gen_cond_exp p (FF n) (X (SUC n)) x - X n x < --inv(&(SUC k))} x)` + ASSUME_TAC THENL + [UNDISCH_TAC `submartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real)` THEN + REWRITE_TAC[submartingale] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* integrabilities *) + ABBREV_TAC `B = {x:A | x IN prob_carrier p /\ + gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x - X n x < --inv(&(SUC k))}` THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. (X:num->A->real) n x * indicator_fn (B:A->bool) x)` + ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x * indicator_fn (B:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* inv(k+1)*P(B) = E[inv(k+1)*1_B] *) + SUBGOAL_THEN + `inv(&(SUC k)) * prob (p:A prob_space) (B:A->bool) = + expectation p (\x:A. inv(&(SUC k)) * indicator_fn B x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn (B:A->bool):A->real`] EXPECTATION_CMUL) THEN + BETA_TAC THEN ANTS_TAC THENL + [MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + ASM_SIMP_TAC[EXPECTATION_INDICATOR]]; ALL_TAC] THEN + (* E[(X_n - gen_cond_exp) * 1_B] = E[X_n*1_B] - E[gen_cond_exp*1_B] *) + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x * indicator_fn (B:A->bool) x) - + expectation p (\x. gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x * + indicator_fn B x) = + expectation p (\x. X n x * indicator_fn B x - + gen_cond_exp p (FF n) (X (SUC n)) x * + indicator_fn B x)` + SUBST1_TAC THENL + [CONV_TAC SYM_CONV THEN MATCH_MP_TAC EXPECTATION_SUB THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Main: E[inv(k+1)*1_B] <= E[(X_n - gen_cond_exp)*1_B] <= 0 *) + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC + `expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x * indicator_fn (B:A->bool) x - + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x * + indicator_fn B x)` THEN + CONJ_TAC THENL + [MATCH_MP_TAC EXPECTATION_MONO THEN BETA_TAC THEN REPEAT CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `inv(&(SUC k))`; + `indicator_fn (B:A->bool):A->real`] INTEGRABLE_CMUL_ALT) THEN + BETA_TAC THEN DISCH_THEN MATCH_MP_TAC THEN + MATCH_MP_TAC INTEGRABLE_INDICATOR THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `w:A` THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn] THEN COND_CASES_TAC THENL + [REWRITE_TAC[REAL_MUL_RID] THEN + SUBGOAL_THEN `(w:A) IN (B:A->bool)` MP_TAC THENL + [ASM_REWRITE_TAC[]; ALL_TAC] THEN + EXPAND_TAC "B" THEN REWRITE_TAC[IN_ELIM_THM] THEN + STRIP_TAC THEN MATCH_MP_TAC REAL_LT_IMP_LE THEN + UNDISCH_TAC `gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) (w:A) - X n w < --inv (&(SUC k))` THEN + REAL_ARITH_TAC; + REAL_ARITH_TAC]]; + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x * indicator_fn (B:A->bool) x - + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x * + indicator_fn B x) = + expectation p (\x. X n x * indicator_fn B x) - + expectation p (\x. gen_cond_exp p (FF n) (X (SUC n)) x * + indicator_fn B x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_SUB THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `expectation (p:A prob_space) + (\x:A. gen_cond_exp p ((FF:num->(A->bool)->bool) n) + ((X:num->A->real) (SUC n)) x * indicator_fn (B:A->bool) x) = + expectation p (\x. X (SUC n) x * indicator_fn B x)` THEN + UNDISCH_TAC `expectation (p:A prob_space) + (\x:A. (X:num->A->real) n x * indicator_fn (B:A->bool) x) <= + expectation p (\x. X (SUC n) x * indicator_fn B x)` THEN + REAL_ARITH_TAC]; + (* Subset: {f < 0} SUBSET UNIONS {A_k k | k IN UNIV} *) + REWRITE_TAC[SUBSET; IN_ELIM_THM; IN_UNIONS] THEN + X_GEN_TAC `w:A` THEN STRIP_TAC THEN + SUBGOAL_THEN `&0 < (X:num->A->real) n w - + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) w` MP_TAC THENL + [POP_ASSUM MP_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `j:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `(A_k:num->A->bool) (j - 1)` THEN CONJ_TAC THENL + [EXISTS_TAC `j - 1` THEN REWRITE_TAC[IN_UNIV]; ALL_TAC] THEN + EXPAND_TAC "A_k" THEN BETA_TAC THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `SUC (j - 1) = j` SUBST1_TAC THENL + [UNDISCH_TAC `~(j = 0)` THEN ARITH_TAC; + UNDISCH_TAC `inv (&j) < (X:num->A->real) n w - + gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) w` THEN + REAL_ARITH_TAC]]);; + +(* Lemma A: gen_doob_compensator is integrable *) +let GEN_DOOB_COMPENSATOR_INTEGRABLE = prove + (`!p:A prob_space FF (X:num->A->real) n. + submartingale p FF X + ==> integrable p (gen_doob_compensator p FF X n)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN STRIP_TAC THENL + [(* Base case *) + SUBGOAL_THEN `gen_doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; gen_doob_compensator]; ALL_TAC] THEN + REWRITE_TAC[INTEGRABLE_CONST]; + (* Step case *) + SUBGOAL_THEN `integrable (p:A prob_space) (gen_doob_compensator p FF X n)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `gen_doob_compensator (p:A prob_space) FF X (SUC n) = + (\x:A. gen_doob_compensator p FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; gen_doob_compensator]; ALL_TAC] THEN + SUBGOAL_THEN `(\x:A. gen_doob_compensator (p:A prob_space) FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (gen_doob_compensator p FF X n x + gen_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `gen_doob_compensator (p:A prob_space) FF X n`; + `gen_cond_exp (p:A prob_space) (FF (n:num)) ((X:num->A->real) (SUC n))`] + INTEGRABLE_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN + ASM_MESON_TAC[submartingale; filtration]; + REWRITE_TAC[ETA_AX] THEN ASM_MESON_TAC[submartingale]]]);; + +(* Helper: gen_doob_compensator is measurable_wrt FF n at step n *) +let GEN_DOOB_COMPENSATOR_MEASURABLE_WRT = prove + (`!p:A prob_space FF (X:num->A->real) n. + submartingale p FF X + ==> measurable_wrt p (FF n) (gen_doob_compensator p FF X n)`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THEN STRIP_TAC THENL + [(* Base case *) + SUBGOAL_THEN `gen_doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; gen_doob_compensator]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN ASM_MESON_TAC[submartingale; filtration]; + (* Step case *) + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF n) (gen_doob_compensator p FF X n)` ASSUME_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` ASSUME_TAC THENL + [MATCH_MP_TAC FILTRATION_MONO THEN EXISTS_TAC `p:A prob_space` THEN + ASM_REWRITE_TAC[LE; LE_REFL]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF (SUC n)) (gen_doob_compensator p FF X n)` ASSUME_TAC THENL + [UNDISCH_TAC `measurable_wrt (p:A prob_space) (FF n) (gen_doob_compensator p FF X n)` THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]; + ALL_TAC] THEN + GEN_REWRITE_TAC RAND_CONV [GSYM ETA_AX] THEN + REWRITE_TAC[gen_doob_compensator] THEN + SUBGOAL_THEN `(\x:A. gen_doob_compensator (p:A prob_space) FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (gen_doob_compensator p FF X n x + gen_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) (SUC n))` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) ((X:num->A->real) (SUC n))` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF (SUC n)) (gen_cond_exp p (FF n) (X (SUC n)))` ASSUME_TAC THENL + [SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) + (gen_cond_exp p (FF n) ((X:num->A->real) (SUC n)))` MP_TAC THENL + [MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[]; + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `measurable_wrt (p:A prob_space) (FF (SUC n)) ((X:num->A->real) n)` ASSUME_TAC THENL + [SUBGOAL_THEN `measurable_wrt (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) n)` MP_TAC THENL + [ASM_MESON_TAC[submartingale; adapted]; ALL_TAC] THEN + UNDISCH_TAC `(FF:num->(A->bool)->bool) n SUBSET FF (SUC n)` THEN + REWRITE_TAC[measurable_wrt; SUBSET] THEN MESON_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) (SUC n)`; + `\x:A. gen_doob_compensator (p:A prob_space) FF X n x + gen_cond_exp p (FF n) (X (SUC n)) x`; + `(X:num->A->real) n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) (SUC n)`; + `gen_doob_compensator (p:A prob_space) FF X n`; + `gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) (SUC n))`] + MEASURABLE_WRT_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]]);; + +(* Lemma B: gen_doob_compensator is gen_predictable *) +let GEN_DOOB_COMPENSATOR_GEN_PREDICTABLE = prove + (`!p:A prob_space FF (X:num->A->real). + submartingale p FF X + ==> gen_predictable p FF (gen_doob_compensator p FF X)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN REWRITE_TAC[gen_predictable] THEN CONJ_TAC THENL + [(* Base: measurable_wrt p (FF 0) (compensator 0) *) + SUBGOAL_THEN `gen_doob_compensator (p:A prob_space) FF X 0 = (\x:A. &0)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; gen_doob_compensator]; ALL_TAC] THEN + MATCH_MP_TAC MEASURABLE_WRT_CONST THEN ASM_MESON_TAC[submartingale; filtration]; + (* Step: measurable_wrt p (FF n) (compensator (SUC n)) *) + GEN_TAC THEN + GEN_REWRITE_TAC RAND_CONV [GSYM ETA_AX] THEN + REWRITE_TAC[gen_doob_compensator] THEN + SUBGOAL_THEN `(\x:A. gen_doob_compensator (p:A prob_space) FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x) = + (\x. (gen_doob_compensator p FF X n x + gen_cond_exp p (FF n) (X (SUC n)) x) - X n x)` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale; filtration]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `\x:A. gen_doob_compensator (p:A prob_space) FF X n x + gen_cond_exp p (FF n) (X (SUC n)) x`; + `(X:num->A->real) n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `gen_doob_compensator (p:A prob_space) FF X n`; + `gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) (SUC n))`] + MEASURABLE_WRT_ADD) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_MEASURABLE_WRT]; + MATCH_MP_TAC GEN_COND_EXP_MEASURABLE_WRT THEN ASM_REWRITE_TAC[] THEN + ASM_MESON_TAC[submartingale]]; + ASM_MESON_TAC[submartingale; adapted]]]);; + +(* Lemma C: gen_doob_compensator is a.e. increasing *) +let GEN_DOOB_COMPENSATOR_AE_INCREASING = prove + (`!p:A prob_space FF (X:num->A->real) n. + submartingale p FF X + ==> almost_surely p + {x | gen_doob_compensator p FF X n x <= + gen_doob_compensator p FF X (SUC n) x}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[gen_doob_compensator] THEN + SUBGOAL_THEN + `{x:A | gen_doob_compensator (p:A prob_space) FF X n x <= + gen_doob_compensator p FF X n x + + gen_cond_exp p (FF n) (X (SUC n)) x - X n x} = + {x | (X:num->A->real) n x <= gen_cond_exp p (FF n) (X (SUC n)) x}` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ASM_SIMP_TAC[SUBMARTINGALE_GEN_COND_EXP_GE]]);; + +(* Lemma D: X - gen_doob_compensator is a martingale *) +let GEN_DOOB_COMPENSATOR_MARTINGALE = prove + (`!p:A prob_space FF (X:num->A->real). + submartingale p FF X + ==> martingale p FF (\n x. X n x - gen_doob_compensator p FF X n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[martingale] THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF X` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!n. integrable (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [(* adapted *) + REWRITE_TAC[adapted] THEN GEN_TAC THEN CONV_TAC(DEPTH_CONV BETA_CONV) THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(X:num->A->real) n`; + `gen_doob_compensator (p:A prob_space) FF X n`] MEASURABLE_WRT_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM_MESON_TAC[adapted]; ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_MEASURABLE_WRT]]; + (* integrable *) + GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `gen_doob_compensator (p:A prob_space) FF X n`] INTEGRABLE_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_INTEGRABLE]; + (* martingale condition *) + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + (X (SUC n) x - gen_doob_compensator (p:A prob_space) FF X (SUC n) x) * indicator_fn a x = + (X n x - gen_doob_compensator p FF X n x) * indicator_fn (a:A->bool) x + + (X (SUC n) x - gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x) * indicator_fn a x` + ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN REWRITE_TAC[gen_doob_compensator] THEN REAL_ARITH_TAC; + ALL_TAC] THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. ((X:num->A->real) n x - gen_doob_compensator p FF X n x) * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) n`; + `gen_doob_compensator (p:A prob_space) FF X n`] INTEGRABLE_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_INTEGRABLE]; + ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. ((X:num->A->real) (SUC n) x - gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x) * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) (SUC n)`; + `gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) (SUC n))`] INTEGRABLE_SUB) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[] THEN MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x. (X (SUC n) x - gen_doob_compensator p FF X (SUC n) x) * indicator_fn (a:A->bool) x) = + expectation p + (\x. (X n x - gen_doob_compensator p FF X n x) * indicator_fn a x + + (X (SUC n) x - gen_cond_exp p (FF n) (X (SUC n)) x) * indicator_fn a x)` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. ((X:num->A->real) n x - gen_doob_compensator (p:A prob_space) FF X n x) * indicator_fn (a:A->bool) x`; + `\x:A. ((X:num->A->real) (SUC n) x - gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) (X (SUC n)) x) * indicator_fn (a:A->bool) x`] + EXPECTATION_ADD) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `expectation (p:A prob_space) + (\x:A. ((X:num->A->real) (SUC n) x - gen_cond_exp p ((FF:num->(A->bool)->bool) n) (X (SUC n)) x) * + indicator_fn (a:A->bool) x) = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + SUBGOAL_THEN + `(\x:A. ((X:num->A->real) (SUC n) x - gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) (X (SUC n)) x) * + indicator_fn (a:A->bool) x) = + (\x. X (SUC n) x * indicator_fn a x - gen_cond_exp p (FF n) (X (SUC n)) x * indicator_fn a x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x:A. gen_cond_exp p ((FF:num->(A->bool)->bool) n) ((X:num->A->real) (SUC n)) x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC GEN_COND_EXP_INTEGRABLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; + `\x:A. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x`; + `\x:A. gen_cond_exp (p:A prob_space) ((FF:num->(A->bool)->bool) n) ((X:num->A->real) (SUC n)) x * indicator_fn (a:A->bool) x`] + EXPECTATION_SUB) THEN + REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN SUBST1_TAC THEN + MP_TAC(SPECL [`p:A prob_space`; `(FF:num->(A->bool)->bool) n`; + `(X:num->A->real) (SUC n)`; `a:A->bool`] GEN_COND_EXP_CONDITIONING) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC]);; + +(* General Doob decomposition: X = M + A where M is a martingale, + A is gen_predictable, a.e. increasing, and A_0 = 0. *) +let GEN_DOOB_DECOMPOSITION = prove + (`!p:A prob_space FF (X:num->A->real). + submartingale p FF X + ==> ?M A. martingale p FF M /\ + gen_predictable p FF A /\ + (!x:A. A 0 x = &0) /\ + (!n. almost_surely p {x | A n x <= A (SUC n) x}) /\ + (!n x. X n x = M n x + A n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + EXISTS_TAC `\n (x:A). X n x - gen_doob_compensator (p:A prob_space) FF X n x` THEN + EXISTS_TAC `gen_doob_compensator (p:A prob_space) FF X` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + REPEAT CONJ_TAC THENL + [ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_MARTINGALE]; + ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_GEN_PREDICTABLE]; + REWRITE_TAC[gen_doob_compensator]; + ASM_SIMP_TAC[GEN_DOOB_COMPENSATOR_AE_INCREASING]; + REPEAT GEN_TAC THEN REAL_ARITH_TAC]);; + +(* Helper: supermartingale negation gives submartingale *) +let SUPERMARTINGALE_NEG_SUBMARTINGALE = prove + (`!p:A prob_space FF X. + supermartingale p FF X + ==> submartingale p FF (\n x. --((X:num->A->real) n x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[supermartingale; submartingale] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[adapted] THEN GEN_TAC THEN + MATCH_MP_TAC MEASURABLE_WRT_NEG THEN CONJ_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN SIMP_TAC[]; + UNDISCH_TAC `adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[adapted] THEN SIMP_TAC[ETA_AX]]; + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_NEG THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_LNEG] THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!k. integrable (p:A prob_space) (\x:A. (X:num->A->real) k x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_NEG_INTEGRABLE] THEN + REWRITE_TAC[REAL_LE_NEG2] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Helper: negation of martingale is martingale *) +let MARTINGALE_NEG = prove + (`!p:A prob_space FF X. + martingale p FF X + ==> martingale p FF (\n x. --((X:num->A->real) n x))`, + REPEAT GEN_TAC THEN REWRITE_TAC[martingale] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [REWRITE_TAC[adapted] THEN GEN_TAC THEN + MATCH_MP_TAC MEASURABLE_WRT_NEG THEN CONJ_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN SIMP_TAC[]; + UNDISCH_TAC `adapted (p:A prob_space) FF X` THEN + REWRITE_TAC[adapted] THEN SIMP_TAC[ETA_AX]]; + GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_NEG THEN ASM_REWRITE_TAC[ETA_AX]; + REPEAT STRIP_TAC THEN REWRITE_TAC[REAL_MUL_LNEG] THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN STRIP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `!k. integrable (p:A prob_space) (\x:A. (X:num->A->real) k x * indicator_fn (a:A->bool) x)` ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_NEG_INTEGRABLE] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]);; + +(* Supermartingale variant: X = M + A where A is a.e. decreasing *) +let GEN_DOOB_DECOMPOSITION_SUPER = prove + (`!p:A prob_space FF (X:num->A->real). + supermartingale p FF X + ==> ?M A. martingale p FF M /\ + gen_predictable p FF A /\ + (!x:A. A 0 x = &0) /\ + (!n. almost_surely p {x | A (SUC n) x <= A n x}) /\ + (!n x. X n x = M n x + A n x)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `submartingale (p:A prob_space) FF (\n x. --((X:num->A->real) n x))` + (MP_TAC o MATCH_MP GEN_DOOB_DECOMPOSITION) THENL + [MATCH_MP_TAC SUPERMARTINGALE_NEG_SUBMARTINGALE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN + DISCH_THEN(X_CHOOSE_THEN `M':num->A->real` + (X_CHOOSE_THEN `A':num->A->real` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `\n (x:A). --((M':num->A->real) n x)` THEN + EXISTS_TAC `\n (x:A). --((A':num->A->real) n x)` THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC MARTINGALE_NEG THEN ASM_REWRITE_TAC[]; + (* gen_predictable *) + UNDISCH_TAC `gen_predictable (p:A prob_space) FF (A':num->A->real)` THEN + REWRITE_TAC[gen_predictable] THEN + CONV_TAC(DEPTH_CONV BETA_CONV) THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC MEASURABLE_WRT_NEG THEN + CONJ_TAC THENL [ASM_MESON_TAC[filtration]; ASM_REWRITE_TAC[ETA_AX]]; + GEN_TAC THEN MATCH_MP_TAC MEASURABLE_WRT_NEG THEN + CONJ_TAC THENL [ASM_MESON_TAC[filtration]; ASM_REWRITE_TAC[ETA_AX]]]; + (* A' 0 = 0 so --A' 0 = 0 *) + ASM_REWRITE_TAC[REAL_NEG_0]; + (* a.e. decreasing *) + GEN_TAC THEN + SUBGOAL_THEN `{x:A | --(A':num->A->real) (SUC n) x <= --A' n x} = + {x | A' n x <= A' (SUC n) x}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + (* X = -M' + -A' *) + REPEAT GEN_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `x:A`]) THEN REAL_ARITH_TAC]);; diff --git a/Probability/martingales.ml b/Probability/martingales.ml index aa62374c..755d4245 100644 --- a/Probability/martingales.ml +++ b/Probability/martingales.ml @@ -4,8 +4,8 @@ (* *) (* Follows Williams "Probability with Martingales" Chapters 8-10. *) (* Includes sub-sigma-algebras, conditional expectation for simple RVs, *) -(* filtrations, martingale definitions, Doob's optional stopping theorem *) -(* (Fair Games Theorem), submartingale inequalities, and Doob's maximal *) +(* filtrations, simple_martingale definitions, Doob's optional stopping theorem *) +(* (Fair Games Theorem), simple_submartingale inequalities, and Doob's maximal *) (* inequality (both bounded and general versions). *) (* ========================================================================= *) @@ -140,9 +140,9 @@ let natural_filtration = new_definition sigma_generated (prob_carrier p) (UNIONS (IMAGE (\k. {{x | x IN prob_carrier p /\ X k x <= v} | v IN (:real)}) (0..n)))`;; -(* A martingale w.r.t. filtration FF *) -let martingale = new_definition - `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> +(* A simple_martingale w.r.t. filtration FF *) +let simple_martingale = new_definition + `simple_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> filtration p FF /\ simple_adapted p FF X /\ (!n. simple_rv p (X n)) /\ @@ -150,9 +150,9 @@ let martingale = new_definition ==> simple_expectation p (\x. X (SUC n) x * indicator_fn a x) = simple_expectation p (\x. X n x * indicator_fn a x))`;; -(* A submartingale w.r.t. filtration FF *) -let submartingale = new_definition - `submartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> +(* A simple_submartingale w.r.t. filtration FF *) +let simple_submartingale = new_definition + `simple_submartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> filtration p FF /\ simple_adapted p FF X /\ (!n. simple_rv p (X n)) /\ @@ -160,9 +160,9 @@ let submartingale = new_definition ==> simple_expectation p (\x. X n x * indicator_fn a x) <= simple_expectation p (\x. X (SUC n) x * indicator_fn a x))`;; -(* A supermartingale w.r.t. filtration FF *) -let supermartingale = new_definition - `supermartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> +(* A simple_supermartingale w.r.t. filtration FF *) +let simple_supermartingale = new_definition + `simple_supermartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> filtration p FF /\ simple_adapted p FF X /\ (!n. simple_rv p (X n)) /\ @@ -170,27 +170,27 @@ let supermartingale = new_definition ==> simple_expectation p (\x. X (SUC n) x * indicator_fn a x) <= simple_expectation p (\x. X n x * indicator_fn a x))`;; -(* Every martingale is both a sub- and super-martingale *) -let MARTINGALE_IMP_SUBMARTINGALE = prove +(* Every simple_martingale is both a sub- and super-simple_martingale *) +let SIMPLE_MARTINGALE_IMP_SUBMARTINGALE = prove (`!p:A prob_space FF X. - martingale p FF X ==> submartingale p FF X`, - REWRITE_TAC[martingale; submartingale] THEN + simple_martingale p FF X ==> simple_submartingale p FF X`, + REWRITE_TAC[simple_martingale; simple_submartingale] THEN MESON_TAC[REAL_LE_REFL]);; -let MARTINGALE_IMP_SUPERMARTINGALE = prove +let SIMPLE_MARTINGALE_IMP_SUPERMARTINGALE = prove (`!p:A prob_space FF X. - martingale p FF X ==> supermartingale p FF X`, - REWRITE_TAC[martingale; supermartingale] THEN + simple_martingale p FF X ==> simple_supermartingale p FF X`, + REWRITE_TAC[simple_martingale; simple_supermartingale] THEN MESON_TAC[REAL_LE_REFL]);; -(* X is a martingale iff it is both sub- and super-martingale *) -let MARTINGALE_SUB_SUPER = prove +(* X is a simple_martingale iff it is both sub- and super-simple_martingale *) +let SIMPLE_MARTINGALE_SUB_SUPER = prove (`!p:A prob_space FF X. - martingale p FF X <=> - submartingale p FF X /\ supermartingale p FF X`, + simple_martingale p FF X <=> + simple_submartingale p FF X /\ simple_supermartingale p FF X`, REPEAT GEN_TAC THEN EQ_TAC THENL - [MESON_TAC[MARTINGALE_IMP_SUBMARTINGALE; MARTINGALE_IMP_SUPERMARTINGALE]; - REWRITE_TAC[submartingale; supermartingale; martingale] THEN + [MESON_TAC[SIMPLE_MARTINGALE_IMP_SUBMARTINGALE; SIMPLE_MARTINGALE_IMP_SUPERMARTINGALE]; + REWRITE_TAC[simple_submartingale; simple_supermartingale; simple_martingale] THEN MESON_TAC[REAL_LE_ANTISYM]]);; @@ -199,12 +199,12 @@ let FILTRATION_MONO = prove filtration p FF /\ m <= n ==> FF m SUBSET FF n`, SIMP_TAC[filtration]);; -(* Constant sequence is a martingale *) -let MARTINGALE_CONST = prove +(* Constant sequence is a simple_martingale *) +let SIMPLE_MARTINGALE_CONST = prove (`!p:A prob_space FF c. filtration p FF - ==> martingale p FF (\n x. c)`, - REPEAT STRIP_TAC THEN REWRITE_TAC[martingale] THEN + ==> simple_martingale p FF (\n x. c)`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_martingale] THEN TRY BETA_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL [REWRITE_TAC[simple_adapted; adapted] THEN @@ -229,11 +229,11 @@ let bounded_stopping_time = new_definition (!x. x IN prob_carrier p ==> tau x <= N)`;; (* E[X_n] = E[X_0] for martingales *) -let MARTINGALE_EXPECTATION_CONST = prove +let SIMPLE_MARTINGALE_EXPECTATION_CONST = prove (`!p:A prob_space FF X. - martingale p FF X + simple_martingale p FF X ==> !n. simple_expectation p (X n) = simple_expectation p (X 0)`, - REWRITE_TAC[martingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[simple_martingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN INDUCT_TAC THEN REWRITE_TAC[] THEN SUBGOAL_THEN `simple_expectation p ((X:num->A->real) (SUC n)) = @@ -244,11 +244,11 @@ let MARTINGALE_EXPECTATION_CONST = prove ASM_SIMP_TAC[]);; (* E[X_n] <= E[X_{n+1}] for submartingales *) -let SUBMARTINGALE_EXPECTATION_MONO = prove +let SIMPLE_SUBMARTINGALE_EXPECTATION_MONO = prove (`!p:A prob_space FF X. - submartingale p FF X + simple_submartingale p FF X ==> !n. simple_expectation p (X n) <= simple_expectation p (X (SUC n))`, - REWRITE_TAC[submartingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[simple_submartingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN ONCE_REWRITE_TAC[GSYM SIMPLE_EXPECTATION_MUL_INDICATOR_CARRIER] THEN SUBGOAL_THEN `prob_carrier (p:A prob_space) IN FF (n:num)` ASSUME_TAC THENL @@ -256,11 +256,11 @@ let SUBMARTINGALE_EXPECTATION_MONO = prove ASM_SIMP_TAC[]);; (* E[X_{n+1}] <= E[X_n] for supermartingales *) -let SUPERMARTINGALE_EXPECTATION_MONO = prove +let SIMPLE_SUPERMARTINGALE_EXPECTATION_MONO = prove (`!p:A prob_space FF X. - supermartingale p FF X + simple_supermartingale p FF X ==> !n. simple_expectation p (X (SUC n)) <= simple_expectation p (X n)`, - REWRITE_TAC[supermartingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN + REWRITE_TAC[simple_supermartingale] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN ONCE_REWRITE_TAC[GSYM SIMPLE_EXPECTATION_MUL_INDICATOR_CARRIER] THEN SUBGOAL_THEN `prob_carrier (p:A prob_space) IN FF (n:num)` ASSUME_TAC THENL @@ -268,9 +268,9 @@ let SUPERMARTINGALE_EXPECTATION_MONO = prove ASM_SIMP_TAC[]);; (* E[X_0] <= E[X_n] for submartingales (by induction) *) -let SUBMARTINGALE_EXPECTATION_INCREASING = prove +let SIMPLE_SUBMARTINGALE_EXPECTATION_INCREASING = prove (`!p:A prob_space FF X. - submartingale p FF X + simple_submartingale p FF X ==> !m n. m <= n ==> simple_expectation p (X m) <= simple_expectation p (X n)`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `?k. n = m + k:num` CHOOSE_TAC THENL @@ -283,14 +283,14 @@ let SUBMARTINGALE_EXPECTATION_INCREASING = prove EXISTS_TAC `simple_expectation p ((X:num->A->real) (m + j))` THEN CONJ_TAC THENL [ASM_REWRITE_TAC[]; - MP_TAC (SPEC `m + j:num` (MATCH_MP SUBMARTINGALE_EXPECTATION_MONO - (ASSUME `submartingale (p:A prob_space) FF (X:num->A->real)`))) THEN + MP_TAC (SPEC `m + j:num` (MATCH_MP SIMPLE_SUBMARTINGALE_EXPECTATION_MONO + (ASSUME `simple_submartingale (p:A prob_space) FF (X:num->A->real)`))) THEN SIMP_TAC[]]]);; (* E[X_n] <= E[X_0] for supermartingales (by induction) *) -let SUPERMARTINGALE_EXPECTATION_DECREASING = prove +let SIMPLE_SUPERMARTINGALE_EXPECTATION_DECREASING = prove (`!p:A prob_space FF X. - supermartingale p FF X + simple_supermartingale p FF X ==> !m n. m <= n ==> simple_expectation p (X n) <= simple_expectation p (X m)`, REPEAT STRIP_TAC THEN SUBGOAL_THEN `?k. n = m + k:num` CHOOSE_TAC THENL @@ -302,8 +302,8 @@ let SUPERMARTINGALE_EXPECTATION_DECREASING = prove MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `simple_expectation p ((X:num->A->real) (m + j))` THEN CONJ_TAC THENL - [MP_TAC (SPEC `m + j:num` (MATCH_MP SUPERMARTINGALE_EXPECTATION_MONO - (ASSUME `supermartingale (p:A prob_space) FF (X:num->A->real)`))) THEN + [MP_TAC (SPEC `m + j:num` (MATCH_MP SIMPLE_SUPERMARTINGALE_EXPECTATION_MONO + (ASSUME `simple_supermartingale (p:A prob_space) FF (X:num->A->real)`))) THEN SIMP_TAC[]; ASM_REWRITE_TAC[]]]);; @@ -316,17 +316,17 @@ let SUPERMARTINGALE_EXPECTATION_DECREASING = prove E[Y * 1_A] = E[X * 1_A]. We define it constructively for simple RVs. *) -(* First: a key property - martingale condition restated *) -let MARTINGALE_COND_EXP = prove +(* First: a key property - simple_martingale condition restated *) +let SIMPLE_MARTINGALE_COND_EXP = prove (`!p:A prob_space FF X. - martingale p FF X + simple_martingale p FF X ==> !n a. a IN FF n ==> simple_expectation p (\x. X (SUC n) x * indicator_fn a x) = simple_expectation p (\x. X n x * indicator_fn a x)`, - REWRITE_TAC[martingale] THEN MESON_TAC[]);; + REWRITE_TAC[simple_martingale] THEN MESON_TAC[]);; -(* Martingale transform: if X is a martingale and H is predictable & bounded, - then (H . X)_n = sum_{i=0}^{n-1} H_i * (X_{i+1} - X_i) is a martingale. +(* Martingale transform: if X is a simple_martingale and H is predictable & bounded, + then (H . X)_n = sum_{i=0}^{n-1} H_i * (X_{i+1} - X_i) is a simple_martingale. For simple setup, we define the transform directly. *) (* Martingale transform definition *) @@ -350,14 +350,14 @@ let stopped_process = new_definition (* Doob's Optional Stopping Theorem (bounded case) *) (* ========================================================================= *) -(* Key theorem: For a martingale X and bounded stopping times sigma <= tau <= N, +(* Key theorem: For a simple_martingale X and bounded stopping times sigma <= tau <= N, E[X_tau] = E[X_sigma] = E[X_0]. The simplest case: E[X_{tau /\ n}] = E[X_0] for all n. Proof approach: X^tau_n = X_0 + sum_{i=0}^{n-1} 1_{tau > i} * (X_{i+1} - X_i) The indicator 1_{tau > i} is FF_i-measurable (since {tau > i} = Omega \ {tau <= i} and {tau <= i} IN FF_i by the stopping time property). - So X^tau is a martingale transform, and E[X^tau_n] = E[X_0]. *) + So X^tau is a simple_martingale transform, and E[X^tau_n] = E[X_0]. *) (* First: indicator of {tau > n} is FF_n-measurable *) let STOPPING_TIME_INDICATOR_PREDICTABLE = prove @@ -374,10 +374,7 @@ let STOPPING_TIME_INDICATOR_PREDICTABLE = prove [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_COMPL THEN ASM_REWRITE_TAC[]; MATCH_MP_TAC EQ_IMP THEN AP_THM_TAC THEN AP_TERM_TAC THEN - REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `y:A` THEN - ASM_CASES_TAC `(y:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - ARITH_TAC]);; + SET_TAC[NOT_LE; GT]]);; (* Base case for stopped process *) let STOPPED_PROCESS_ZERO = prove @@ -484,25 +481,25 @@ let SIMPLE_RV_STOPPED_PROCESS = prove (* Doob's Optional Stopping Theorem (bounded case), also known as the "Fair Games Theorem" (Williams, Ch.10): - For a martingale X and bounded stopping time tau, + For a simple_martingale X and bounded stopping time tau, E[X^tau_n] = E[X_0] for all n. *) -let DOOB_OPTIONAL_STOPPING_BOUNDED = prove +let SIMPLE_DOOB_OPTIONAL_STOPPING_BOUNDED = prove (`!p:A prob_space FF X tau N. - martingale p FF X /\ bounded_stopping_time p FF tau N + simple_martingale p FF X /\ bounded_stopping_time p FF tau N ==> !n. simple_expectation p (stopped_process X tau n) = simple_expectation p (X 0)`, REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Extract key properties from martingale *) + (* Extract key properties from simple_martingale *) SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN SUBGOAL_THEN `!n a. a IN (FF:num->(A->bool)->bool) n ==> simple_expectation (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn a x) = simple_expectation p (\x. X n x * indicator_fn a x)` - ASSUME_TAC THENL [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN INDUCT_TAC THENL @@ -515,7 +512,7 @@ let DOOB_OPTIONAL_STOPPING_BOUNDED = prove (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL [ASM_SIMP_TAC[STOPPING_TIME_INDICATOR_PREDICTABLE]; ALL_TAC] THEN - (* Apply the martingale property: E[X_{n+1} * 1_{tau>n}] = E[X_n * 1_{tau>n}] *) + (* Apply the simple_martingale property: E[X_{n+1} * 1_{tau>n}] = E[X_n * 1_{tau>n}] *) SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * @@ -525,7 +522,7 @@ let DOOB_OPTIONAL_STOPPING_BOUNDED = prove ASSUME_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN (* Show (X_{n+1} - X_n) * 1_{tau>n} has zero expectation. Uses: (a - b) * c = a * c - b * c pointwise, E[SUB] = E[] - E[], - and martingale property for {tau > n} IN FF n. *) + and simple_martingale property for {tau > n} IN FF n. *) SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. (X (SUC n) x - X n x) * indicator_fn {y | y IN prob_carrier p /\ (tau:A->num) y > n} x) = &0` @@ -627,18 +624,18 @@ let DOOB_OPTIONAL_STOPPING_BOUNDED = prove (* Submartingale optional stopping: lower bound. - For a submartingale, E[X_0] <= E[X^tau_n] for all n. *) -let SUBMARTINGALE_OPTIONAL_STOPPING_GE = prove + For a simple_submartingale, E[X_0] <= E[X^tau_n] for all n. *) +let SIMPLE_SUBMARTINGALE_OPTIONAL_STOPPING_GE = prove (`!p:A prob_space FF X tau N. - submartingale p FF X /\ bounded_stopping_time p FF tau N + simple_submartingale p FF X /\ bounded_stopping_time p FF tau N ==> !n. simple_expectation p (X 0) <= simple_expectation p (stopped_process X tau n)`, REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Extract key properties from submartingale *) + (* Extract key properties from simple_submartingale *) SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN INDUCT_TAC THENL @@ -696,7 +693,7 @@ let SUBMARTINGALE_OPTIONAL_STOPPING_GE = prove SIMP_TAC[]]; (* Step 2: Show E[increment] >= 0, i.e. &0 <= E[(X_{n+1}-X_n)*1_{tau>n}] *) MATCH_MP_TAC(REAL_ARITH `&0 <= c ==> a <= a + c`) THEN - (* Prove E[increment] >= 0 using submartingale property *) + (* Prove E[increment] >= 0 using simple_submartingale property *) (* Step A: Rewrite (a-b)*c as a*c - b*c pointwise *) SUBGOAL_THEN `simple_expectation (p:A prob_space) @@ -750,28 +747,28 @@ let SUBMARTINGALE_OPTIONAL_STOPPING_GE = prove (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL [ASM_SIMP_TAC[STOPPING_TIME_INDICATOR_PREDICTABLE]; ALL_TAC] THEN - (* Extract one-step submartingale inequality and apply *) + (* Extract one-step simple_submartingale inequality and apply *) SUBGOAL_THEN `!n' (a:A->bool). a IN (FF:num->(A->bool)->bool) n' ==> simple_expectation (p:A prob_space) (\x. (X:num->A->real) n' x * indicator_fn a x) <= simple_expectation p (\x. X (SUC n') x * indicator_fn a x)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]]]);; (* Supermartingale optional stopping: upper bound. - For a supermartingale, E[X^tau_n] <= E[X_0] for all n. *) -let SUPERMARTINGALE_OPTIONAL_STOPPING_LE = prove + For a simple_supermartingale, E[X^tau_n] <= E[X_0] for all n. *) +let SIMPLE_SUPERMARTINGALE_OPTIONAL_STOPPING_LE = prove (`!p:A prob_space FF X tau N. - supermartingale p FF X /\ bounded_stopping_time p FF tau N + simple_supermartingale p FF X /\ bounded_stopping_time p FF tau N ==> !n. simple_expectation p (stopped_process X tau n) <= simple_expectation p (X 0)`, REPEAT GEN_TAC THEN STRIP_TAC THEN - (* Extract key properties from supermartingale *) + (* Extract key properties from simple_supermartingale *) SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN INDUCT_TAC THENL @@ -885,7 +882,7 @@ let SUPERMARTINGALE_OPTIONAL_STOPPING_LE = prove (\x. (X:num->A->real) (SUC n') x * indicator_fn a x) <= simple_expectation p (\x. X n' x * indicator_fn a x)` ASSUME_TAC THENL - [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]]; (* IH: E[X^tau_n] <= E[X_0] *) ASM_REWRITE_TAC[]]]);; @@ -1051,19 +1048,19 @@ let SIMPLE_ADAPTED_STOPPED_PROCESS = prove DISCH_THEN(MP_TAC o SPEC `n:num`) THEN REWRITE_TAC[simple_rv] THEN MESON_TAC[]]);; -(* Stopped process of a submartingale is a submartingale *) -let SUBMARTINGALE_STOPPED_PROCESS = prove +(* Stopped process of a simple_submartingale is a simple_submartingale *) +let SIMPLE_SUBMARTINGALE_STOPPED_PROCESS = prove (`!p:A prob_space FF X tau N. - submartingale p FF X /\ bounded_stopping_time p FF tau N - ==> submartingale p FF (stopped_process X tau)`, + simple_submartingale p FF X /\ bounded_stopping_time p FF tau N + ==> simple_submartingale p FF (stopped_process X tau)`, REPEAT GEN_TAC THEN STRIP_TAC THEN (* Extract key properties *) SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `simple_adapted (p:A prob_space) FF (X:num->A->real)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN SUBGOAL_THEN `simple_adapted (p:A prob_space) FF @@ -1075,7 +1072,7 @@ let SUBMARTINGALE_STOPPED_PROCESS = prove [MATCH_MP_TAC SIMPLE_RV_STOPPED_PROCESS THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[submartingale] THEN + REWRITE_TAC[simple_submartingale] THEN ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN DISCH_TAC THEN (* Need: E[X^tau_n * 1_a] <= E[X^tau_{SUC n} * 1_a] for a IN FF n *) @@ -1191,28 +1188,28 @@ let SUBMARTINGALE_STOPPED_PROCESS = prove SUBST1_TAC THENL [MATCH_MP_TAC SIMPLE_EXPECTATION_SUB THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN REWRITE_TAC[REAL_SUB_LE] THEN - (* Apply the submartingale property to B IN FF n *) + (* Apply the simple_submartingale property to B IN FF n *) SUBGOAL_THEN `!n' (s:A->bool). s IN (FF:num->(A->bool)->bool) n' ==> simple_expectation (p:A prob_space) (\x. (X:num->A->real) n' x * indicator_fn s x) <= simple_expectation p (\x. X (SUC n') x * indicator_fn s x)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);; -(* Stopped process of a supermartingale is a supermartingale *) -let SUPERMARTINGALE_STOPPED_PROCESS = prove +(* Stopped process of a simple_supermartingale is a simple_supermartingale *) +let SIMPLE_SUPERMARTINGALE_STOPPED_PROCESS = prove (`!p:A prob_space FF X tau N. - supermartingale p FF X /\ bounded_stopping_time p FF tau N - ==> supermartingale p FF (stopped_process X tau)`, + simple_supermartingale p FF X /\ bounded_stopping_time p FF tau N + ==> simple_supermartingale p FF (stopped_process X tau)`, REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `filtration (p:A prob_space) (FF:num->(A->bool)->bool)` - ASSUME_TAC THENL [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN SUBGOAL_THEN `simple_adapted (p:A prob_space) FF (X:num->A->real)` - ASSUME_TAC THENL [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` - ASSUME_TAC THENL [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + ASSUME_TAC THENL [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN SUBGOAL_THEN `simple_adapted (p:A prob_space) FF @@ -1224,7 +1221,7 @@ let SUPERMARTINGALE_STOPPED_PROCESS = prove [MATCH_MP_TAC SIMPLE_RV_STOPPED_PROCESS THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN - REWRITE_TAC[supermartingale] THEN + REWRITE_TAC[simple_supermartingale] THEN ASM_REWRITE_TAC[] THEN REPEAT GEN_TAC THEN DISCH_TAC THEN SUBGOAL_THEN @@ -1289,7 +1286,7 @@ let SUPERMARTINGALE_STOPPED_PROCESS = prove EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[]]]; SIMP_TAC[]]; ALL_TAC] THEN - (* For supermartingale: need E[(X(SUC n) - X n) * 1_B] <= 0 *) + (* For simple_supermartingale: need E[(X(SUC n) - X n) * 1_B] <= 0 *) MATCH_MP_TAC(REAL_ARITH `c <= &0 ==> a + c <= a`) THEN SUBGOAL_THEN `simple_expectation (p:A prob_space) @@ -1337,28 +1334,28 @@ let SUPERMARTINGALE_STOPPED_PROCESS = prove (\x. (X:num->A->real) (SUC n') x * indicator_fn s x) <= simple_expectation p (\x. X n' x * indicator_fn s x)` ASSUME_TAC THENL - [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_supermartingale]; ALL_TAC] THEN FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]);; -(* Stopped process of a martingale is a martingale *) -let MARTINGALE_STOPPED_PROCESS = prove +(* Stopped process of a simple_martingale is a simple_martingale *) +let SIMPLE_MARTINGALE_STOPPED_PROCESS = prove (`!p:A prob_space FF X tau N. - martingale p FF X /\ bounded_stopping_time p FF tau N - ==> martingale p FF (stopped_process X tau)`, + simple_martingale p FF X /\ bounded_stopping_time p FF tau N + ==> simple_martingale p FF (stopped_process X tau)`, REPEAT GEN_TAC THEN STRIP_TAC THEN - REWRITE_TAC[MARTINGALE_SUB_SUPER] THEN CONJ_TAC THENL - [MATCH_MP_TAC SUBMARTINGALE_STOPPED_PROCESS THEN + REWRITE_TAC[SIMPLE_MARTINGALE_SUB_SUPER] THEN CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_SUBMARTINGALE_STOPPED_PROCESS THEN EXISTS_TAC `N:num` THEN ASM_REWRITE_TAC[] THEN - ASM_MESON_TAC[MARTINGALE_IMP_SUBMARTINGALE]; - MATCH_MP_TAC SUPERMARTINGALE_STOPPED_PROCESS THEN + ASM_MESON_TAC[SIMPLE_MARTINGALE_IMP_SUBMARTINGALE]; + MATCH_MP_TAC SIMPLE_SUPERMARTINGALE_STOPPED_PROCESS THEN EXISTS_TAC `N:num` THEN ASM_REWRITE_TAC[] THEN - ASM_MESON_TAC[MARTINGALE_IMP_SUPERMARTINGALE]]);; + ASM_MESON_TAC[SIMPLE_MARTINGALE_IMP_SUPERMARTINGALE]]);; -(* Localized submartingale increasing: E[X_m * 1_a] <= E[X_n * 1_a] +(* Localized simple_submartingale increasing: E[X_m * 1_a] <= E[X_n * 1_a] for a IN FF m and m <= n *) -let SUBMARTINGALE_LOCALIZED_INCREASING = prove +let SIMPLE_SUBMARTINGALE_LOCALIZED_INCREASING = prove (`!p:A prob_space FF X m n a. - submartingale p FF X /\ a IN FF m /\ m <= n + simple_submartingale p FF X /\ a IN FF m /\ m <= n ==> simple_expectation p (\x. X m x * indicator_fn a x) <= simple_expectation p (\x. X n x * indicator_fn a x)`, REPEAT STRIP_TAC THEN @@ -1374,13 +1371,13 @@ let SUBMARTINGALE_LOCALIZED_INCREASING = prove CONJ_TAC THENL [ASM_REWRITE_TAC[]; (* Need: E[X(m+j) * 1_a] <= E[X(SUC(m+j)) * 1_a] *) - (* From submartingale: need a IN FF (m+j) *) + (* From simple_submartingale: need a IN FF (m+j) *) SUBGOAL_THEN `(a:A->bool) IN (FF:num->(A->bool)->bool) (m + j)` (fun th -> MP_TAC th) THENL [SUBGOAL_THEN `(FF:num->(A->bool)->bool) m SUBSET FF (m + j)` MP_TAC THENL - [UNDISCH_TAC `submartingale (p:A prob_space) FF (X:num->A->real)` THEN - REWRITE_TAC[submartingale; filtration] THEN + [UNDISCH_TAC `simple_submartingale (p:A prob_space) FF (X:num->A->real)` THEN + REWRITE_TAC[simple_submartingale; filtration] THEN DISCH_THEN(MP_TAC o CONJUNCT1) THEN DISCH_THEN(MP_TAC o CONJUNCT2) THEN DISCH_THEN(MP_TAC o SPECL [`m:num`; `m + j:num`]) THEN @@ -1389,8 +1386,8 @@ let SUBMARTINGALE_LOCALIZED_INCREASING = prove REWRITE_TAC[SUBSET] THEN MESON_TAC[]; ALL_TAC] THEN DISCH_TAC THEN - UNDISCH_TAC `submartingale (p:A prob_space) FF (X:num->A->real)` THEN - REWRITE_TAC[submartingale] THEN + UNDISCH_TAC `simple_submartingale (p:A prob_space) FF (X:num->A->real)` THEN + REWRITE_TAC[simple_submartingale] THEN DISCH_THEN(MP_TAC o last o CONJUNCTS) THEN DISCH_THEN(MP_TAC o SPECL [`m + j:num`; `a:A->bool`]) THEN ASM_REWRITE_TAC[]]]);; @@ -1422,10 +1419,7 @@ let MEASURABLE_WRT_GE = prove SUBST1_TAC THENL [SUBGOAL_THEN `UNIONS (G:(A->bool)->bool) = prob_carrier p` SUBST1_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN - REWRITE_TAC[EXTENSION; IN_DIFF; IN_ELIM_THM] THEN - X_GEN_TAC `z:A` THEN - ASM_CASES_TAC `(z:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN - REAL_ARITH_TAC; + SET_TAC[REAL_ARITH `!x c:real. x >= c <=> ~(x < c)`]; ALL_TAC] THEN MATCH_MP_TAC SIGMA_ALGEBRA_COMPL THEN CONJ_TAC THENL [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN @@ -1497,9 +1491,9 @@ let INDICATOR_FN_DISJOINT_UNION = prove (* Doob's maximal inequality - strong form *) (* c * P(max_{k<=n} X_k >= c) <= E[X_n * 1_{max_{k<=n} X_k >= c}] *) -let DOOB_MAXIMAL_INEQUALITY_STRONG = prove +let SIMPLE_DOOB_MAXIMAL_INEQUALITY_STRONG = prove (`!p:A prob_space FF X c n. - submartingale p FF X /\ &0 < c /\ + simple_submartingale p FF X /\ &0 < c /\ (!m x. x IN prob_carrier p ==> &0 <= X m x) ==> c * prob p {x | x IN prob_carrier p /\ running_max X n x >= c} <= simple_expectation p @@ -1508,12 +1502,12 @@ let DOOB_MAXIMAL_INEQUALITY_STRONG = prove REWRITE_TAC[RIGHT_FORALL_IMP_THM] THEN REPEAT GEN_TAC THEN STRIP_TAC THEN SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN SUBGOAL_THEN `adapted (p:A prob_space) FF X` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale; simple_adapted]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale; simple_adapted]; ALL_TAC] THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN INDUCT_TAC THENL [REWRITE_TAC[running_max] THEN SUBGOAL_THEN @@ -1629,7 +1623,7 @@ let DOOB_MAXIMAL_INEQUALITY_STRONG = prove simple_expectation p (\x. X (SUC n) x * indicator_fn A_n x)` ASSUME_TAC THENL - [MATCH_MP_TAC SUBMARTINGALE_LOCALIZED_INCREASING THEN + [MATCH_MP_TAC SIMPLE_SUBMARTINGALE_LOCALIZED_INCREASING THEN EXISTS_TAC `(FF:num->(A->bool)->bool)` THEN ASM_REWRITE_TAC[ARITH_RULE `n <= SUC n`]; ALL_TAC] THEN @@ -1690,7 +1684,7 @@ let DOOB_MAXIMAL_INEQUALITY_STRONG = prove (* Doob's maximal inequality *) let DOOB_MAXIMAL_INEQUALITY = prove (`!p:A prob_space FF X c n. - submartingale p FF X /\ &0 < c /\ + simple_submartingale p FF X /\ &0 < c /\ (!m x. x IN prob_carrier p ==> &0 <= X m x) ==> c * prob p {x | x IN prob_carrier p /\ running_max X n x >= c} <= simple_expectation p (X n)`, @@ -1700,13 +1694,13 @@ let DOOB_MAXIMAL_INEQUALITY = prove (\x. X n x * indicator_fn {y | y IN prob_carrier p /\ running_max X n y >= c} x)` THEN CONJ_TAC THENL - [MATCH_MP_TAC DOOB_MAXIMAL_INEQUALITY_STRONG THEN + [MATCH_MP_TAC SIMPLE_DOOB_MAXIMAL_INEQUALITY_STRONG THEN EXISTS_TAC `(FF:num->(A->bool)->bool)` THEN ASM_REWRITE_TAC[]; (* E[X n * 1_A] <= E[X n] since X n >= 0 and 1_A <= 1 *) MATCH_MP_TAC SIMPLE_EXPECTATION_MONO THEN SUBGOAL_THEN `!n. simple_rv (p:A prob_space) ((X:num->A->real) n)` ASSUME_TAC THENL - [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_submartingale]; ALL_TAC] THEN CONJ_TAC THENL [MATCH_MP_TAC SIMPLE_RV_MUL THEN REWRITE_TAC[ETA_AX] THEN CONJ_TAC THENL @@ -1717,8 +1711,8 @@ let DOOB_MAXIMAL_INEQUALITY = prove (FF:num->(A->bool)->bool) n` MP_TAC THENL [MATCH_MP_TAC RUNNING_MAX_EXCEEDS_IN_FILTRATION THEN - ASM_MESON_TAC[submartingale; simple_adapted]; - ASM_MESON_TAC[submartingale; simple_adapted; filtration; + ASM_MESON_TAC[simple_submartingale; simple_adapted]; + ASM_MESON_TAC[simple_submartingale; simple_adapted; filtration; sub_sigma_algebra; SUBSET]]]; ALL_TAC] THEN CONJ_TAC THENL [REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN X_GEN_TAC `y:A` THEN DISCH_TAC THEN BETA_TAC THEN @@ -1734,14 +1728,14 @@ let DOOB_MAXIMAL_INEQUALITY = prove (* ------------------------------------------------------------------------- *) (* Fair Games Theorem (Doob Optional Stopping) with general expectation *) -let DOOB_OPTIONAL_STOPPING_GENERAL = prove +let SIMPLE_DOOB_OPTIONAL_STOPPING = prove (`!p:A prob_space FF X tau N. - martingale p FF X /\ bounded_stopping_time p FF tau N + simple_martingale p FF X /\ bounded_stopping_time p FF tau N ==> !n. expectation p (stopped_process X tau n) = expectation p (X 0)`, REPEAT STRIP_TAC THEN MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `tau:A->num`; `N:num`] - DOOB_OPTIONAL_STOPPING_BOUNDED) THEN + SIMPLE_DOOB_OPTIONAL_STOPPING_BOUNDED) THEN ASM_REWRITE_TAC[] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN SUBGOAL_THEN `simple_rv (p:A prob_space) (stopped_process X tau n) /\ simple_rv p (X 0)` STRIP_ASSUME_TAC THENL @@ -1751,19 +1745,19 @@ let DOOB_OPTIONAL_STOPPING_GENERAL = prove SIMPLE_RV_STOPPED_PROCESS) THEN ANTS_TAC THENL [CONJ_TAC THENL - [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + [ASM_MESON_TAC[simple_martingale]; ALL_TAC] THEN CONJ_TAC THENL [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN - ASM_MESON_TAC[martingale]; + ASM_MESON_TAC[simple_martingale]; SIMP_TAC[]]; - ASM_MESON_TAC[martingale]]; + ASM_MESON_TAC[simple_martingale]]; ALL_TAC] THEN ASM_SIMP_TAC[GSYM EXPECTATION_SIMPLE_AGREE]);; (* Doob Maximal Inequality with general expectation *) let DOOB_MAXIMAL_INEQUALITY_GENERAL = prove (`!p:A prob_space FF X c n. - submartingale p FF X /\ + simple_submartingale p FF X /\ &0 < c /\ (!m x. x IN prob_carrier p ==> &0 <= X m x) ==> c * prob p {x | x IN prob_carrier p /\ running_max X n x >= c} <= @@ -1772,6 +1766,967 @@ let DOOB_MAXIMAL_INEQUALITY_GENERAL = prove SUBGOAL_THEN `expectation (p:A prob_space) ((X:num->A->real) n) = simple_expectation p (X n)` SUBST1_TAC THENL [MATCH_MP_TAC EXPECTATION_SIMPLE_AGREE THEN - ASM_MESON_TAC[submartingale]; + ASM_MESON_TAC[simple_submartingale]; MATCH_MP_TAC DOOB_MAXIMAL_INEQUALITY THEN EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]]);; + +(* ================================================================== *) +(* Wald's Equation: E[S_tau] = mu * E[SUC(tau)] *) +(* For bounded stopping times with i.i.d.-like conditional mean *) +(* ================================================================== *) + +(* {tau > n} is in FF n *) +let STOPPING_TIME_GT_IN_FF = prove + (`!p:A prob_space FF (tau:A->num) n. + filtration p FF /\ stopping_time p FF tau + ==> {x | x IN prob_carrier p /\ tau x > n} IN FF n`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `sub_sigma_algebra (p:A prob_space) ((FF:num->(A->bool)->bool) n)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration]; ALL_TAC] THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ (tau:A->num) x <= n} IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [ASM_MESON_TAC[stopping_time]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS ((FF:num->(A->bool)->bool) n) DIFF {x:A | x IN prob_carrier p /\ (tau:A->num) x <= n} IN FF n` MP_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra; sigma_algebra]; ALL_TAC] THEN + SUBGOAL_THEN `UNIONS ((FF:num->(A->bool)->bool) n) = prob_carrier (p:A prob_space)` SUBST1_TAC THENL + [ASM_MESON_TAC[sub_sigma_algebra]; ALL_TAC] THEN + MATCH_MP_TAC(TAUT `a = b ==> a ==> b`) THEN AP_THM_TAC THEN AP_TERM_TAC THEN + SET_TAC[NOT_LE; GT]);; + +(* Transfer simple_rv via equality on carrier *) +let SIMPLE_RV_EQ_ON_CARRIER = prove + (`!p:A prob_space f g. + simple_rv p g /\ (!x. x IN prob_carrier p ==> f x = g x) + ==> simple_rv p f`, + REPEAT STRIP_TAC THEN REWRITE_TAC[simple_rv] THEN CONJ_TAC THENL + [REWRITE_TAC[random_variable] THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ f x <= v} = {x | x IN prob_carrier p /\ g x <= v}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN ASM_MESON_TAC[]; + ASM_MESON_TAC[simple_rv; random_variable]]; + SUBGOAL_THEN `{f x:real | x:A IN prob_carrier p} = {g x | x IN prob_carrier p}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN GEN_TAC THEN EQ_TAC THEN STRIP_TAC THEN EXISTS_TAC `x':A` THEN ASM_MESON_TAC[]; + ASM_MESON_TAC[simple_rv]]]);; + +(* Pointwise identity: sum up to random index = sum with indicators *) +let SUM_RANDOM_INDEX = prove + (`!f (tau:B->num) M (x:B). + tau x <= M + ==> sum(0..tau x) (\i. f i) = + sum(0..M) (\i. f i * (if i <= tau x then &1 else &0))`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `0..M = (0..(tau (x:B))) UNION (((tau x) + 1)..M)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_NUMSEG] THEN X_GEN_TAC `i:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT (0..tau (x:B)) ((tau x + 1)..M)` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; IN_NUMSEG; NOT_IN_EMPTY] THEN X_GEN_TAC `i:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[SUM_UNION; FINITE_NUMSEG] THEN + SUBGOAL_THEN `sum (0..tau (x:B)) (\i. f i * (if i <= tau x then &1 else &0)) = sum (0..tau x) (\i. f i)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `x':num <= tau (x:B)` (fun th -> REWRITE_TAC[th; REAL_MUL_RID]) THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum ((tau (x:B) + 1)..M) (\i. f i * (if i <= tau x then &1 else &0)) = &0` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_0 THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN + SUBGOAL_THEN `~(x':num <= tau (x:B))` (fun th -> REWRITE_TAC[th; REAL_MUL_RZERO]) THEN ASM_ARITH_TAC; + REAL_ARITH_TAC]);; + +(* {i <= tau} is in prob_events *) +let STOPPING_TIME_GE_EVENT = prove + (`!p:A prob_space FF (tau:A->num) i. + filtration p FF /\ stopping_time p FF tau + ==> {x | x IN prob_carrier p /\ i <= tau x} IN prob_events p`, + GEN_TAC THEN GEN_TAC THEN GEN_TAC THEN INDUCT_TAC THENL + [STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ 0 <= tau x} = prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; LE_0]; ALL_TAC] THEN REWRITE_TAC[PROB_CARRIER_IN_EVENTS]; + STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ SUC i <= tau x} = {x | x IN prob_carrier p /\ tau x > i}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GT] THEN ARITH_TAC; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `tau:A->num`; `i:num`] STOPPING_TIME_GT_IN_FF) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]]);; + +(* {SUC n <= tau} is in FF n *) +let STOPPING_TIME_SUC_GE_IN_FF = prove + (`!p:A prob_space FF (tau:A->num) n. + filtration p FF /\ stopping_time p FF tau + ==> {x | x IN prob_carrier p /\ SUC n <= tau x} IN FF n`, + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `{x:A | x IN prob_carrier p /\ SUC n <= tau x} = {x | x IN prob_carrier p /\ tau x > n}` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM] THEN X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN REWRITE_TAC[GT] THEN ARITH_TAC; + MATCH_MP_TAC STOPPING_TIME_GT_IN_FF THEN ASM_REWRITE_TAC[]]);; + +(* E[X_i * 1_{i<=tau}] = mu * P(i <= tau) *) +let WALD_TERM_EXPECTATION = prove + (`!p:A prob_space FF (X:num->A->real) (tau:A->num) (M:num) (mu:real) i. + filtration p FF /\ + (!n. n <= M ==> simple_rv p (X n)) /\ + (!n. n <= M ==> simple_expectation p (X n) = mu) /\ + (!n. n <= M ==> !a. a IN FF n ==> + simple_expectation p (\x. X (SUC n) x * indicator_fn a x) = mu * prob p a) /\ + bounded_stopping_time p FF tau M /\ + i <= M + ==> simple_expectation p + (\x. X i x * indicator_fn {y | y IN prob_carrier p /\ i <= tau y} x) = + mu * prob p {y | y IN prob_carrier p /\ i <= tau y}`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL + [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN + ASM_CASES_TAC `?n. i = SUC n` THENL + [FIRST_X_ASSUM(X_CHOOSE_TAC `n:num`) THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `n:num <= M` ASSUME_TAC THENL + [UNDISCH_TAC `(i:num) <= M` THEN ASM_REWRITE_TAC[] THEN ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `{y:A | y IN prob_carrier p /\ SUC n <= (tau:A->num) y} IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [MATCH_MP_TAC STOPPING_TIME_SUC_GE_IN_FF THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[]; + SUBGOAL_THEN `i = 0` SUBST_ALL_TAC THENL [ASM_MESON_TAC[num_CASES]; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + (X:num->A->real) 0 x * indicator_fn {y | y IN prob_carrier p /\ 0 <= (tau:A->num) y} x = X 0 x` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM; LE_0] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; ALL_TAC] THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. (X:num->A->real) 0 x * + indicator_fn {y | y IN prob_carrier p /\ 0 <= tau y} x) = simple_expectation p (X 0)` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_SIMP_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) {y | y IN prob_carrier p /\ 0 <= (tau:A->num) y} = &1` SUBST1_TAC THENL + [SUBGOAL_THEN `{y:A | y IN prob_carrier p /\ 0 <= (tau:A->num) y} = prob_carrier p` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; LE_0]; ALL_TAC] THEN REWRITE_TAC[PROB_SPACE]; ALL_TAC] THEN + REWRITE_TAC[REAL_MUL_RID; ETA_AX] THEN ASM_MESON_TAC[LE_0]]);; + +(* Sum of indicators = SUC(tau) *) +let INDICATOR_SUM_STOPPING_TIME = prove + (`!p:A prob_space (tau:A->num) M x. + x IN prob_carrier p /\ tau x <= M + ==> sum(0..M) (\i. indicator_fn {y | y IN prob_carrier p /\ i <= tau y} x) = &(SUC(tau x))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `0..M = (0..tau (x:A)) UNION ((tau x + 1)..M)` SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_UNION; IN_NUMSEG] THEN X_GEN_TAC `i:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `DISJOINT (0..tau (x:A)) ((tau x + 1)..M)` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; IN_NUMSEG; NOT_IN_EMPTY] THEN X_GEN_TAC `i:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[SUM_UNION; FINITE_NUMSEG] THEN + SUBGOAL_THEN `sum (0..tau (x:A)) (\i. indicator_fn {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y} x) = sum (0..tau x) (\i. &1)` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THENL [ALL_TAC; ASM_MESON_TAC[]] THEN + ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `sum ((tau (x:A) + 1)..M) (\i. indicator_fn {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y} x) = &0` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_0 THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + COND_CASES_TAC THEN REWRITE_TAC[] THEN + FIRST_X_ASSUM(MP_TAC o CONJUNCT2) THEN ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_ADD_RID; SUM_CONST_NUMSEG; SUB_0] THEN + REWRITE_TAC[REAL_MUL_RID; GSYM REAL_OF_NUM_SUC] THEN + REWRITE_TAC[GSYM REAL_OF_NUM_ADD] THEN REAL_ARITH_TAC);; + +(* Wald's Equation *) +let WALD_EQUATION = prove + (`!p:A prob_space FF (X:num->A->real) (tau:A->num) (M:num) (mu:real). + filtration p FF /\ + (!n. n <= M ==> simple_rv p (X n)) /\ + (!n. n <= M ==> simple_expectation p (X n) = mu) /\ + (!n. n <= M ==> !a. a IN FF n ==> + simple_expectation p (\x. X (SUC n) x * indicator_fn a x) = + mu * prob p a) /\ + bounded_stopping_time p FF tau M + ==> simple_expectation p (\x. sum(0..tau x) (\i. X i x)) = + mu * simple_expectation p (\x. &(SUC(tau x)))`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num) /\ (!x. x IN prob_carrier p ==> tau x <= M)` STRIP_ASSUME_TAC THENL + [UNDISCH_TAC `bounded_stopping_time (p:A prob_space) FF (tau:A->num) M` THEN REWRITE_TAC[bounded_stopping_time]; ALL_TAC] THEN + SUBGOAL_THEN `!i. {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y} IN prob_events p` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `tau:A->num`; `i:num`] STOPPING_TIME_GE_EVENT) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!i. i <= M ==> simple_rv (p:A prob_space) (\x. (X:num->A->real) i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x)` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `(X:num->A->real) i`; `indicator_fn {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y}`] SIMPLE_RV_MUL) THEN + REWRITE_TAC[ETA_AX] THEN DISCH_THEN MATCH_MP_TAC THEN + CONJ_TAC THENL [ASM_SIMP_TAC[]; MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]]; ALL_TAC] THEN + SUBGOAL_THEN `!x:A. x IN prob_carrier p ==> + sum(0..tau x) (\i. (X:num->A->real) i x) = + sum(0..M) (\i. X i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x)` ASSUME_TAC THENL + [X_GEN_TAC `x:A` THEN DISCH_TAC THEN + SUBGOAL_THEN `(tau:A->num) x <= M` ASSUME_TAC THENL [ASM_SIMP_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`\i. (X:num->A->real) i x`; `tau:A->num`; `M:num`; `x:A`] SUM_RANDOM_INDEX) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> REWRITE_TAC[th]) THEN + MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN + REPEAT STRIP_TAC THEN BETA_TAC THEN AP_TERM_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Rewrite LHS *) + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. sum(0..tau x) (\i. (X:num->A->real) i x)) = + simple_expectation p (\x. sum(0..M) (\i. X i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x))` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Apply linearity of expectation *) + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. sum(0..M) (\i. (X:num->A->real) i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x)) = + sum(0..M) (\i. simple_expectation p (\x. X i x * indicator_fn {y | y IN prob_carrier p /\ i <= tau y} x))` SUBST1_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; + `\i (x:A). (X:num->A->real) i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x`; + `M:num`] SIMPLE_EXPECTATION_SUM_NUMSEG) THEN + REWRITE_TAC[] THEN DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Apply WALD_TERM_EXPECTATION to each term *) + SUBGOAL_THEN `!i. i <= M ==> simple_expectation (p:A prob_space) + (\x. (X:num->A->real) i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x) = + mu * prob p {y | y IN prob_carrier p /\ i <= tau y}` ASSUME_TAC THENL + [REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `X:num->A->real`; `tau:A->num`; `M:num`; `mu:real`; `i:num`] WALD_TERM_EXPECTATION) THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Rewrite each term *) + SUBGOAL_THEN `sum(0..M) (\i. simple_expectation (p:A prob_space) (\x. (X:num->A->real) i x * indicator_fn {y | y IN prob_carrier p /\ i <= (tau:A->num) y} x)) = + sum(0..M) (\i. mu * prob p {y | y IN prob_carrier p /\ i <= tau y})` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN BETA_TAC THEN ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Factor out mu *) + REWRITE_TAC[SUM_LMUL] THEN AP_TERM_TAC THEN + (* Rewrite prob as expectation of indicator *) + SUBGOAL_THEN `sum(0..M) (\i. prob (p:A prob_space) {y | y IN prob_carrier p /\ i <= (tau:A->num) y}) = + sum(0..M) (\i. simple_expectation p (indicator_fn {y | y IN prob_carrier p /\ i <= tau y}))` SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ THEN REWRITE_TAC[IN_NUMSEG] THEN REPEAT STRIP_TAC THEN + BETA_TAC THEN CONV_TAC SYM_CONV THEN + MATCH_MP_TAC SIMPLE_EXPECTATION_INDICATOR THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* Use linearity in reverse: sum of E[ind_i] = E[sum of ind_i] *) + CONV_TAC SYM_CONV THEN + SUBGOAL_THEN `simple_expectation (p:A prob_space) (\x. &(SUC((tau:A->num) x))) = + simple_expectation p (\x. sum(0..M) (\i. indicator_fn {y | y IN prob_carrier p /\ i <= tau y} x))` SUBST1_TAC THENL + [MATCH_MP_TAC SIMPLE_EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + CONV_TAC SYM_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; `tau:A->num`; `M:num`; `x:A`] INDICATOR_SUM_STOPPING_TIME) THEN + ASM_SIMP_TAC[]; ALL_TAC] THEN + (* Apply linearity *) + MP_TAC(ISPECL [`p:A prob_space`; + `\i (x:A). indicator_fn {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y} x`; + `M:num`] SIMPLE_EXPECTATION_SUM_NUMSEG) THEN + REWRITE_TAC[] THEN ANTS_TAC THENL + [REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_RV_EQ_ON_CARRIER THEN + EXISTS_TAC `indicator_fn {y:A | y IN prob_carrier p /\ i <= (tau:A->num) y}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC SIMPLE_RV_INDICATOR THEN ASM_REWRITE_TAC[]; + GEN_TAC THEN DISCH_TAC THEN REWRITE_TAC[]]; ALL_TAC] THEN + REWRITE_TAC[ETA_AX]);; + +(* ========================================================================= *) +(* BACKWARD (REVERSED) SIMPLE_MARTINGALES *) +(* A backward simple_martingale uses a decreasing filtration FF_n >= FF_{n+1} *) +(* with E[X_n | FF_{n+1}] = X_{n+1}. *) +(* ========================================================================= *) + +let decreasing_filtration = new_definition + `decreasing_filtration (p:A prob_space) (FF:num->(A->bool)->bool) <=> + (!n. sub_sigma_algebra p (FF n)) /\ + (!m n. m <= n ==> FF n SUBSET FF m)`;; + +let simple_backward_martingale = new_definition + `simple_backward_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> + decreasing_filtration p FF /\ + simple_adapted p FF X /\ + (!n. simple_rv p (X n)) /\ + (!n a. a IN FF (SUC n) ==> + simple_expectation p (\x. X n x * indicator_fn a x) = + simple_expectation p (\x. X (SUC n) x * indicator_fn a x))`;; + +(* ========================================================================= *) +(* GENERAL (INTEGRABLE) MARTINGALE DEFINITIONS *) +(* These use integrable + expectation instead of simple_rv + simple_expectation *) +(* Every simple_martingale is a martingale (bridge lemmas below). *) +(* ========================================================================= *) + +let martingale = new_definition + `martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> + filtration p FF /\ + adapted p FF X /\ + (!n. integrable p (X n)) /\ + (!n a. a IN FF n + ==> expectation p (\x. X (SUC n) x * indicator_fn a x) = + expectation p (\x. X n x * indicator_fn a x))`;; + +let submartingale = new_definition + `submartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> + filtration p FF /\ + adapted p FF X /\ + (!n. integrable p (X n)) /\ + (!n a. a IN FF n + ==> expectation p (\x. X n x * indicator_fn a x) <= + expectation p (\x. X (SUC n) x * indicator_fn a x))`;; + +let supermartingale = new_definition + `supermartingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> + filtration p FF /\ + adapted p FF X /\ + (!n. integrable p (X n)) /\ + (!n a. a IN FF n + ==> expectation p (\x. X (SUC n) x * indicator_fn a x) <= + expectation p (\x. X n x * indicator_fn a x))`;; + +let backward_martingale = new_definition + `backward_martingale (p:A prob_space) (FF:num->(A->bool)->bool) (X:num->A->real) <=> + decreasing_filtration p FF /\ + adapted p FF X /\ + (!n. integrable p (X n)) /\ + (!n a. a IN FF (SUC n) ==> + expectation p (\x. X n x * indicator_fn a x) = + expectation p (\x. X (SUC n) x * indicator_fn a x))`;; + +(* --- Infrastructure lemma --- *) + +let EXPECTATION_CARRIER_INDICATOR = prove + (`!p:A prob_space f. integrable p f + ==> expectation p (\x. f x * indicator_fn (prob_carrier p) x) = + expectation p f`, + REPEAT STRIP_TAC THEN REWRITE_TAC[expectation] THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. max (f x * indicator_fn (prob_carrier p) x) (&0)) = + nn_expectation p (\x. max (f x) (&0))` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; ALL_TAC] THEN + SUBGOAL_THEN `nn_expectation (p:A prob_space) + (\x. max (--(f x * indicator_fn (prob_carrier p) x)) (&0)) = + nn_expectation p (\x. max (--f x) (&0))` SUBST1_TAC THENL + [MATCH_MP_TAC NN_EXPECTATION_EXT THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[REAL_MUL_RID]; REWRITE_TAC[]]);; + +(* --- Bridge lemmas: simple => general --- *) + +let SIMPLE_IMP_MARTINGALE = prove + (`!p:A prob_space FF X. simple_martingale p FF X ==> martingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[simple_martingale; martingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X n x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE]]);; + +let SIMPLE_IMP_SUBMARTINGALE = prove + (`!p:A prob_space FF X. simple_submartingale p FF X ==> submartingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[simple_submartingale; submartingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X n x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE]]);; + +let SIMPLE_IMP_SUPERMARTINGALE = prove + (`!p:A prob_space FF X. simple_supermartingale p FF X ==> supermartingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[simple_supermartingale; supermartingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) n` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X n x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE]]);; + +let SIMPLE_IMP_BACKWARD_MARTINGALE = prove + (`!p:A prob_space FF X. + simple_backward_martingale p FF X ==> backward_martingale p FF X`, + REPEAT GEN_TAC THEN + REWRITE_TAC[simple_backward_martingale; backward_martingale; simple_adapted] THEN + STRIP_TAC THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC INTEGRABLE_SIMPLE THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `(a:A->bool) IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC SUB_SIGMA_ALGEBRA_IN_EVENTS THEN + EXISTS_TAC `(FF:num->(A->bool)->bool) (SUC n)` THEN ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `decreasing_filtration (p:A prob_space) FF` THEN + REWRITE_TAC[decreasing_filtration] THEN MESON_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `simple_rv (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (a:A->bool) x) /\ + simple_rv p (\x. X n x * indicator_fn a x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC SIMPLE_RV_MUL THEN + REWRITE_TAC[ETA_AX] THEN ASM_SIMP_TAC[SIMPLE_RV_INDICATOR]; + ASM_SIMP_TAC[EXPECTATION_SIMPLE_AGREE]]);; + +(* --- Structural relationships --- *) + +let MARTINGALE_IMP_SUBMARTINGALE = prove + (`!p:A prob_space FF X. + martingale p FF X ==> submartingale p FF X`, + REWRITE_TAC[martingale; submartingale] THEN + MESON_TAC[REAL_LE_REFL]);; + +let MARTINGALE_IMP_SUPERMARTINGALE = prove + (`!p:A prob_space FF X. + martingale p FF X ==> supermartingale p FF X`, + REWRITE_TAC[martingale; supermartingale] THEN + MESON_TAC[REAL_LE_REFL]);; + +let MARTINGALE_SUB_SUPER = prove + (`!p:A prob_space FF X. + martingale p FF X <=> + submartingale p FF X /\ supermartingale p FF X`, + REWRITE_TAC[martingale; submartingale; supermartingale] THEN + MESON_TAC[REAL_LE_ANTISYM; REAL_LE_REFL]);; + +(* --- Expectation monotonicity/constancy --- *) + +let SUBMARTINGALE_EXPECTATION_MONO = prove + (`!p:A prob_space FF X. submartingale p FF X + ==> !n. expectation p (X n) <= expectation p (X (SUC n))`, + REPEAT GEN_TAC THEN REWRITE_TAC[submartingale] THEN STRIP_TAC THEN + GEN_TAC THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) IN FF (n:num)` ASSUME_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration; sub_sigma_algebra; sigma_algebra] THEN + MESON_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `prob_carrier (p:A prob_space)`]) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. (X:num->A->real) n x * indicator_fn (prob_carrier p) x) = + expectation p (X n)` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CARRIER_INDICATOR THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (prob_carrier p) x) = + expectation p (X (SUC n))` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CARRIER_INDICATOR THEN + ASM_REWRITE_TAC[]; REAL_ARITH_TAC]);; + +let SUBMARTINGALE_EXPECTATION_INCREASING = prove + (`!p:A prob_space FF X. submartingale p FF X + ==> !m n. m <= n ==> expectation p (X m) <= expectation p (X n)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP SUBMARTINGALE_EXPECTATION_MONO) THEN + DISCH_TAC THEN + SUBGOAL_THEN `?k. n = m + k:num` (CHOOSE_THEN SUBST_ALL_TAC) THENL + [EXISTS_TAC `n - m:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `m:num <= m + k` THEN DISCH_THEN(K ALL_TAC) THEN + SPEC_TAC(`k:num`,`k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES; REAL_LE_REFL]; + REWRITE_TAC[ADD_CLAUSES] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) ((X:num->A->real) (m + k))` THEN + ASM_MESON_TAC[]]);; + +let SUPERMARTINGALE_EXPECTATION_MONO = prove + (`!p:A prob_space FF X. supermartingale p FF X + ==> !n. expectation p (X (SUC n)) <= expectation p (X n)`, + REPEAT GEN_TAC THEN REWRITE_TAC[supermartingale] THEN STRIP_TAC THEN + GEN_TAC THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) IN FF (n:num)` ASSUME_TAC THENL + [UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration; sub_sigma_algebra; sigma_algebra] THEN + MESON_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `prob_carrier (p:A prob_space)`]) THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. (X:num->A->real) n x * indicator_fn (prob_carrier p) x) = + expectation p (X n)` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CARRIER_INDICATOR THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `expectation (p:A prob_space) + (\x. (X:num->A->real) (SUC n) x * indicator_fn (prob_carrier p) x) = + expectation p (X (SUC n))` SUBST1_TAC THENL + [REWRITE_TAC[ETA_AX] THEN MATCH_MP_TAC EXPECTATION_CARRIER_INDICATOR THEN + ASM_REWRITE_TAC[]; REAL_ARITH_TAC]);; + +let SUPERMARTINGALE_EXPECTATION_DECREASING = prove + (`!p:A prob_space FF X. supermartingale p FF X + ==> !m n. m <= n ==> expectation p (X n) <= expectation p (X m)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP SUPERMARTINGALE_EXPECTATION_MONO) THEN + DISCH_TAC THEN + SUBGOAL_THEN `?k. n = m + k:num` (CHOOSE_THEN SUBST_ALL_TAC) THENL + [EXISTS_TAC `n - m:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `m:num <= m + k` THEN DISCH_THEN(K ALL_TAC) THEN + SPEC_TAC(`k:num`,`k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES; REAL_LE_REFL]; + REWRITE_TAC[ADD_CLAUSES] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) ((X:num->A->real) (m + k))` THEN + ASM_MESON_TAC[]]);; + +let MARTINGALE_EXPECTATION_CONST = prove + (`!p:A prob_space FF X. martingale p FF X + ==> !m n. expectation p (X m) = expectation p (X n)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP MARTINGALE_IMP_SUBMARTINGALE) THEN + DISCH_THEN(MP_TAC o MATCH_MP SUBMARTINGALE_EXPECTATION_INCREASING) THEN + FIRST_ASSUM(MP_TAC o MATCH_MP MARTINGALE_IMP_SUPERMARTINGALE) THEN + DISCH_THEN(MP_TAC o MATCH_MP SUPERMARTINGALE_EXPECTATION_DECREASING) THEN + DISCH_TAC THEN DISCH_TAC THEN + DISJ_CASES_TAC(SPECL [`m:num`; `n:num`] LE_CASES) THEN + REWRITE_TAC[GSYM REAL_LE_ANTISYM] THEN ASM_MESON_TAC[]);; + +(* --- Constant process is a martingale --- *) + +let MARTINGALE_CONST = prove + (`!p:A prob_space FF c. filtration p FF + ==> martingale p FF (\n x. c)`, + REPEAT STRIP_TAC THEN MATCH_MP_TAC SIMPLE_IMP_MARTINGALE THEN + ASM_SIMP_TAC[SIMPLE_MARTINGALE_CONST]);; + +(* ================================================================== *) +(* Optional stopping theorems for general martingales *) +(* ================================================================== *) + +(* EXPECTATION_EXT: defined in expectation.ml *) + +(* --- Measurability of stopped process --- *) + +let RANDOM_VARIABLE_STOPPED_PROCESS = prove + (`!p:A prob_space FF X tau n. + adapted p FF X /\ filtration p FF /\ stopping_time p FF tau + ==> random_variable p (stopped_process X tau n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SPEC_TAC(`n:num`, `n:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[random_variable; stopped_process; MIN; LE_0] THEN + GEN_TAC THEN + UNDISCH_TAC `adapted (p:A prob_space) FF (X:num->A->real)` THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `0`) THEN + DISCH_THEN(MP_TAC o SPEC `a:real`) THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration; sub_sigma_algebra] THEN SET_TAC[]; + REWRITE_TAC[random_variable] THEN X_GEN_TAC `v:real` THEN + SUBGOAL_THEN + `{x:A | x IN prob_carrier p /\ stopped_process (X:num->A->real) (tau:A->num) (SUC n) x <= v} = + ({x | x IN prob_carrier p /\ tau x > n} INTER + {x | x IN prob_carrier p /\ X (SUC n) x <= v}) UNION + ({x | x IN prob_carrier p /\ tau x <= n} INTER + {x | x IN prob_carrier p /\ stopped_process X tau n x <= v})` + SUBST1_TAC THENL + [REWRITE_TAC[EXTENSION; IN_ELIM_THM; IN_INTER; IN_UNION] THEN + X_GEN_TAC `x:A` THEN + ASM_CASES_TAC `(x:A) IN prob_carrier p` THEN ASM_REWRITE_TAC[] THEN + REWRITE_TAC[stopped_process] THEN + ASM_CASES_TAC `(tau:A->num) x > n` THENL + [ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `MIN (SUC n) ((tau:A->num) x) = SUC n` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; ASM_ARITH_TAC]; + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `MIN (SUC n) ((tau:A->num) x) = tau x` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `MIN n ((tau:A->num) x) = tau x` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; ASM_ARITH_TAC]]; + ALL_TAC] THEN + MATCH_MP_TAC PROB_UNION_IN_EVENTS THEN CONJ_TAC THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN CONJ_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `FF:num->(A->bool)->bool`; `tau:A->num`; `n:num`] + STOPPING_TIME_GT_IN_FF) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; + UNDISCH_TAC `adapted (p:A prob_space) FF (X:num->A->real)` THEN + REWRITE_TAC[adapted; measurable_wrt] THEN + DISCH_THEN(MP_TAC o SPEC `SUC n`) THEN DISCH_THEN(MP_TAC o SPEC `v:real`) THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration; sub_sigma_algebra] THEN SET_TAC[]; + UNDISCH_TAC `stopping_time (p:A prob_space) FF tau` THEN + REWRITE_TAC[stopping_time] THEN DISCH_THEN(MP_TAC o SPEC `n:num`) THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration; sub_sigma_algebra] THEN SET_TAC[]; + UNDISCH_TAC `random_variable (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` THEN + REWRITE_TAC[random_variable] THEN DISCH_THEN(MP_TAC o SPEC `v:real`) THEN + REWRITE_TAC[]]]);; + +(* --- Integrability of stopped process --- *) + +let INTEGRABLE_STOPPED_PROCESS = prove + (`!p:A prob_space FF X tau N n. + adapted p FF X /\ filtration p FF /\ + bounded_stopping_time p FF tau N /\ + (!k. integrable p (X k)) + ==> integrable p (stopped_process X tau n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL + [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN + SPEC_TAC(`n:num`, `n:num`) THEN INDUCT_TAC THENL + [SUBGOAL_THEN `stopped_process (X:num->A->real) (tau:A->num) 0 = X 0` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_ZERO]; ASM_REWRITE_TAC[]]; + MATCH_MP_TAC INTEGRABLE_DOMINATED THEN + EXISTS_TAC `\x:A. abs((X:num->A->real) (SUC n) x) + abs(stopped_process X (tau:A->num) n x)` THEN + REPEAT CONJ_TAC THENL + [MATCH_MP_TAC RANDOM_VARIABLE_STOPPED_PROCESS THEN + EXISTS_TAC `FF:num->(A->bool)->bool` THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC INTEGRABLE_ADD THEN CONJ_TAC THEN + MATCH_MP_TAC INTEGRABLE_ABS THEN REWRITE_TAC[ETA_AX] THEN ASM_REWRITE_TAC[]; + X_GEN_TAC `x:A` THEN DISCH_TAC THEN + REWRITE_TAC[stopped_process] THEN + ASM_CASES_TAC `(tau:A->num) x > n` THENL + [SUBGOAL_THEN `MIN (SUC n) ((tau:A->num) x) = SUC n` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; REAL_ARITH_TAC]; + SUBGOAL_THEN `MIN (SUC n) ((tau:A->num) x) = tau x` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `MIN n ((tau:A->num) x) = tau x` SUBST1_TAC THENL + [REWRITE_TAC[MIN] THEN ASM_ARITH_TAC; REAL_ARITH_TAC]]]]);; + +(* --- Doob Optional Stopping Theorem (martingale) --- *) + +let DOOB_OPTIONAL_STOPPING = prove + (`!p:A prob_space FF X tau N. + martingale p FF X /\ bounded_stopping_time p FF tau N + ==> !n. expectation p (stopped_process X tau n) = expectation p (X 0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `!k. integrable (p:A prob_space) ((X:num->A->real) k)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL + [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN + SUBGOAL_THEN `!n a. a IN (FF:num->(A->bool)->bool) n + ==> expectation (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn a x) = + expectation p (\x. X n x * indicator_fn a x)` ASSUME_TAC THENL + [ASM_MESON_TAC[martingale]; ALL_TAC] THEN + INDUCT_TAC THENL + [AP_TERM_TAC THEN REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_ZERO]; + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ (tau:A->num) x > n}` THEN + SUBGOAL_THEN `(A:A->bool) IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN ASM_SIMP_TAC[STOPPING_TIME_GT_IN_FF]; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_STOPPED_PROCESS THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `N:num`] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) (SUC n)) = + expectation p (\x. stopped_process X tau n x + ((X (SUC n) x - X n x) * indicator_fn (A:A->bool) x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + BETA_TAC THEN + MP_TAC(SPECL [`(X:num->A->real)`; `(tau:A->num)`; `n:num`; `x:A`] + STOPPED_PROCESS_INCREMENT) THEN + EXPAND_TAC "A" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `stopped_process (X:num->A->real) (tau:A->num) n`; + `\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x`] + EXPECTATION_ADD)) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = &0` + (fun th -> REWRITE_TAC[th] THEN REAL_ARITH_TAC) THEN + SUBGOAL_THEN + `(\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = + (\x. X (SUC n) x * indicator_fn A x - X n x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn (A:A->bool) x) /\ + integrable p (\x. X n x * indicator_fn A x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SUB] THEN REAL_ARITH_TAC]);; + +(* --- Submartingale optional stopping (general) --- *) + +let SUBMARTINGALE_OPTIONAL_STOPPING_GE = prove + (`!p:A prob_space FF X tau N. + submartingale p FF X /\ bounded_stopping_time p FF tau N + ==> !n. expectation p (X 0) <= expectation p (stopped_process X tau n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!k. integrable (p:A prob_space) ((X:num->A->real) k)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL + [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN + SUBGOAL_THEN `!n a. a IN (FF:num->(A->bool)->bool) n + ==> expectation (p:A prob_space) (\x. (X:num->A->real) n x * indicator_fn a x) <= + expectation p (\x. X (SUC n) x * indicator_fn a x)` ASSUME_TAC THENL + [ASM_MESON_TAC[submartingale]; ALL_TAC] THEN + INDUCT_TAC THENL + [SUBGOAL_THEN `stopped_process (X:num->A->real) (tau:A->num) 0 = X 0` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_ZERO]; REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ (tau:A->num) x > n}` THEN + SUBGOAL_THEN `(A:A->bool) IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN ASM_SIMP_TAC[STOPPING_TIME_GT_IN_FF]; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_STOPPED_PROCESS THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `N:num`] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) (SUC n)) = + expectation p (\x. stopped_process X tau n x + ((X (SUC n) x - X n x) * indicator_fn (A:A->bool) x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + BETA_TAC THEN + MP_TAC(SPECL [`(X:num->A->real)`; `(tau:A->num)`; `n:num`; `x:A`] + STOPPED_PROCESS_INCREMENT) THEN + EXPAND_TAC "A" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `stopped_process (X:num->A->real) (tau:A->num) n`; + `\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x`] + EXPECTATION_ADD)) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `A:A->bool`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn (A:A->bool) x) /\ + integrable p (\x. X n x * indicator_fn A x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = + expectation p (\x. X (SUC n) x * indicator_fn A x) - + expectation p (\x. X n x * indicator_fn A x)` SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = + (\x. X (SUC n) x * indicator_fn A x - X n x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SUB]; + ASM_REAL_ARITH_TAC]]);; + +(* --- Supermartingale optional stopping (general) --- *) + +let SUPERMARTINGALE_OPTIONAL_STOPPING_LE = prove + (`!p:A prob_space FF X tau N. + supermartingale p FF X /\ bounded_stopping_time p FF tau N + ==> !n. expectation p (stopped_process X tau n) <= expectation p (X 0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `filtration (p:A prob_space) FF` ASSUME_TAC THENL + [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + SUBGOAL_THEN `adapted (p:A prob_space) FF (X:num->A->real)` ASSUME_TAC THENL + [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + SUBGOAL_THEN `!k. integrable (p:A prob_space) ((X:num->A->real) k)` ASSUME_TAC THENL + [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + SUBGOAL_THEN `stopping_time (p:A prob_space) FF (tau:A->num)` ASSUME_TAC THENL + [ASM_MESON_TAC[bounded_stopping_time]; ALL_TAC] THEN + SUBGOAL_THEN `!n a. a IN (FF:num->(A->bool)->bool) n + ==> expectation (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn a x) <= + expectation p (\x. X n x * indicator_fn a x)` ASSUME_TAC THENL + [ASM_MESON_TAC[supermartingale]; ALL_TAC] THEN + INDUCT_TAC THENL + [SUBGOAL_THEN `stopped_process (X:num->A->real) (tau:A->num) 0 = X 0` SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM; STOPPED_PROCESS_ZERO]; REAL_ARITH_TAC]; + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `A = {x:A | x IN prob_carrier p /\ (tau:A->num) x > n}` THEN + SUBGOAL_THEN `(A:A->bool) IN (FF:num->(A->bool)->bool) n` ASSUME_TAC THENL + [EXPAND_TAC "A" THEN ASM_SIMP_TAC[STOPPING_TIME_GT_IN_FF]; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_MESON_TAC[filtration; sub_sigma_algebra; SUBSET]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC INTEGRABLE_SUB THEN ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN `integrable (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) n)` ASSUME_TAC THENL + [MATCH_MP_TAC INTEGRABLE_STOPPED_PROCESS THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `N:num`] THEN + ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (stopped_process (X:num->A->real) (tau:A->num) (SUC n)) = + expectation p (\x. stopped_process X tau n x + ((X (SUC n) x - X n x) * indicator_fn (A:A->bool) x))` + SUBST1_TAC THENL + [MATCH_MP_TAC EXPECTATION_EXT THEN X_GEN_TAC `x:A` THEN DISCH_TAC THEN + BETA_TAC THEN + MP_TAC(SPECL [`(X:num->A->real)`; `(tau:A->num)`; `n:num`; `x:A`] + STOPPED_PROCESS_INCREMENT) THEN + EXPAND_TAC "A" THEN REWRITE_TAC[indicator_fn; IN_ELIM_THM] THEN + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + MP_TAC(BETA_RULE(ISPECL [`p:A prob_space`; + `stopped_process (X:num->A->real) (tau:A->num) n`; + `\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x`] + EXPECTATION_ADD)) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `A:A->bool`]) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `integrable (p:A prob_space) (\x. (X:num->A->real) (SUC n) x * indicator_fn (A:A->bool) x) /\ + integrable p (\x. X n x * indicator_fn A x)` STRIP_ASSUME_TAC THENL + [CONJ_TAC THEN MATCH_MP_TAC INTEGRABLE_MUL_INDICATOR_FN THEN + ASM_REWRITE_TAC[ETA_AX]; ALL_TAC] THEN + SUBGOAL_THEN + `expectation (p:A prob_space) (\x. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = + expectation p (\x. X (SUC n) x * indicator_fn A x) - + expectation p (\x. X n x * indicator_fn A x)` SUBST1_TAC THENL + [SUBGOAL_THEN + `(\x:A. ((X:num->A->real) (SUC n) x - X n x) * indicator_fn (A:A->bool) x) = + (\x. X (SUC n) x * indicator_fn A x - X n x * indicator_fn A x)` + SUBST1_TAC THENL + [REWRITE_TAC[FUN_EQ_THM] THEN GEN_TAC THEN REAL_ARITH_TAC; ALL_TAC] THEN + ASM_SIMP_TAC[EXPECTATION_SUB]; + ASM_REAL_ARITH_TAC]]);; + +(* --- Bridge: simple_submartingale => submartingale optional stopping --- *) + +let SIMPLE_SUBMARTINGALE_OPTIONAL_STOPPING_GE_GENERAL = prove + (`!p:A prob_space FF X tau N. + simple_submartingale p FF X /\ bounded_stopping_time p FF tau N + ==> !n. expectation p (X 0) <= expectation p (stopped_process X tau n)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN + MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP] + SUBMARTINGALE_OPTIONAL_STOPPING_GE) THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `N:num`] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_IMP_SUBMARTINGALE THEN ASM_REWRITE_TAC[]);; + +(* --- Bridge: simple_supermartingale => supermartingale optional stopping --- *) + +let SIMPLE_SUPERMARTINGALE_OPTIONAL_STOPPING_LE_GENERAL = prove + (`!p:A prob_space FF X tau N. + simple_supermartingale p FF X /\ bounded_stopping_time p FF tau N + ==> !n. expectation p (stopped_process X tau n) <= expectation p (X 0)`, + REPEAT GEN_TAC THEN STRIP_TAC THEN GEN_TAC THEN + MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM; IMP_IMP] + SUPERMARTINGALE_OPTIONAL_STOPPING_LE) THEN + MAP_EVERY EXISTS_TAC [`FF:num->(A->bool)->bool`; `N:num`] THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC SIMPLE_IMP_SUPERMARTINGALE THEN ASM_REWRITE_TAC[]);; + +(* ================================================================== *) +(* Conditional expectation tower property *) +(* ================================================================== *) + +(* Multi-step simple_martingale property: for a IN FF m and m <= n, + E[X_n * 1_a] = E[X_m * 1_a]. This is the integral form of + E[X_n | FF_m] = X_m (a.e.). *) + +let MARTINGALE_TOWER = prove + (`!p:A prob_space FF X. martingale p FF X + ==> !m n a. m <= n /\ a IN FF m + ==> expectation p (\x. X n x * indicator_fn a x) = + expectation p (\x. X m x * indicator_fn a x)`, + REPEAT GEN_TAC THEN REWRITE_TAC[martingale] THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `?k. n = m + k:num` (CHOOSE_THEN SUBST_ALL_TAC) THENL + [EXISTS_TAC `n - m:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `m:num <= m + k` THEN DISCH_THEN(K ALL_TAC) THEN + SPEC_TAC(`k:num`,`k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES]; + REWRITE_TAC[ADD_CLAUSES] THEN + SUBGOAL_THEN `(a:A->bool) IN (FF:num->(A->bool)->bool) (m + k)` ASSUME_TAC THENL + [UNDISCH_TAC `(a:A->bool) IN (FF:num->(A->bool)->bool) m` THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN(MP_TAC o SPECL [`m:num`; `m + k:num`]) THEN + REWRITE_TAC[LE_ADD] THEN SET_TAC[]; + ASM_MESON_TAC[]]]);; + +(* Multi-step simple_submartingale property *) + +let SUBMARTINGALE_TOWER = prove + (`!p:A prob_space FF X. submartingale p FF X + ==> !m n a. m <= n /\ a IN FF m + ==> expectation p (\x. X m x * indicator_fn a x) <= + expectation p (\x. X n x * indicator_fn a x)`, + REPEAT GEN_TAC THEN REWRITE_TAC[submartingale] THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `?k. n = m + k:num` (CHOOSE_THEN SUBST_ALL_TAC) THENL + [EXISTS_TAC `n - m:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `m:num <= m + k` THEN DISCH_THEN(K ALL_TAC) THEN + SPEC_TAC(`k:num`,`k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES; REAL_LE_REFL]; + REWRITE_TAC[ADD_CLAUSES] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x. (X:num->A->real) (m + k) x * indicator_fn (a:A->bool) x)` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(a:A->bool) IN (FF:num->(A->bool)->bool) (m + k)` ASSUME_TAC THENL + [UNDISCH_TAC `(a:A->bool) IN (FF:num->(A->bool)->bool) m` THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN(MP_TAC o SPECL [`m:num`; `m + k:num`]) THEN + REWRITE_TAC[LE_ADD] THEN SET_TAC[]; + ASM_MESON_TAC[]]]);; + +(* Multi-step simple_supermartingale property *) + +let SUPERMARTINGALE_TOWER = prove + (`!p:A prob_space FF X. supermartingale p FF X + ==> !m n a. m <= n /\ a IN FF m + ==> expectation p (\x. X n x * indicator_fn a x) <= + expectation p (\x. X m x * indicator_fn a x)`, + REPEAT GEN_TAC THEN REWRITE_TAC[supermartingale] THEN STRIP_TAC THEN + REPEAT GEN_TAC THEN STRIP_TAC THEN + SUBGOAL_THEN `?k. n = m + k:num` (CHOOSE_THEN SUBST_ALL_TAC) THENL + [EXISTS_TAC `n - m:num` THEN ASM_ARITH_TAC; ALL_TAC] THEN + UNDISCH_TAC `m:num <= m + k` THEN DISCH_THEN(K ALL_TAC) THEN + SPEC_TAC(`k:num`,`k:num`) THEN INDUCT_TAC THENL + [REWRITE_TAC[ADD_CLAUSES; REAL_LE_REFL]; + REWRITE_TAC[ADD_CLAUSES] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `expectation (p:A prob_space) (\x. (X:num->A->real) (m + k) x * indicator_fn (a:A->bool) x)` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `(a:A->bool) IN (FF:num->(A->bool)->bool) (m + k)` ASSUME_TAC THENL + [UNDISCH_TAC `(a:A->bool) IN (FF:num->(A->bool)->bool) m` THEN + UNDISCH_TAC `filtration (p:A prob_space) FF` THEN + REWRITE_TAC[filtration] THEN + DISCH_THEN(MP_TAC o CONJUNCT2) THEN + DISCH_THEN(MP_TAC o SPECL [`m:num`; `m + k:num`]) THEN + REWRITE_TAC[LE_ADD] THEN SET_TAC[]; + ASM_MESON_TAC[]]]);; + +(* Tower property without m <= n restriction *) + +let MARTINGALE_TOWER_EQ = prove + (`!p:A prob_space FF X. martingale p FF X + ==> !m n a. a IN FF (MIN m n) + ==> expectation p (\x. X n x * indicator_fn a x) = + expectation p (\x. X m x * indicator_fn a x)`, + REPEAT STRIP_TAC THEN + FIRST_ASSUM(MP_TAC o MATCH_MP MARTINGALE_TOWER) THEN + DISCH_TAC THEN + DISJ_CASES_TAC(SPECL [`m:num`; `n:num`] LE_CASES) THENL + [SUBGOAL_THEN `MIN m n = m` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`m:num`; `n:num`; `a:A->bool`]) THEN + ASM_REWRITE_TAC[]; + SUBGOAL_THEN `MIN m n = n` SUBST_ALL_TAC THENL + [ASM_ARITH_TAC; ALL_TAC] THEN + CONV_TAC SYM_CONV THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `m:num`; `a:A->bool`]) THEN + ASM_REWRITE_TAC[]]);; + +(* Characterization: martingale iff tower property holds *) + +let MARTINGALE_CHARACTERIZATION = prove + (`!p:A prob_space FF X. + martingale p FF X <=> + filtration p FF /\ adapted p FF X /\ (!n. integrable p (X n)) /\ + (!m n a. m <= n /\ a IN FF m + ==> expectation p (\x. X n x * indicator_fn a x) = + expectation p (\x. X m x * indicator_fn a x))`, + REPEAT GEN_TAC THEN EQ_TAC THENL + [DISCH_TAC THEN + FIRST_ASSUM(STRIP_ASSUME_TAC o REWRITE_RULE[martingale]) THEN + ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC MARTINGALE_TOWER THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[martingale] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`n:num`; `SUC n`; `a:A->bool`]) THEN + ASM_REWRITE_TAC[LE; LE_REFL]]);; diff --git a/Probability/measure.ml b/Probability/measure.ml index e34dbf58..4f378274 100644 --- a/Probability/measure.ml +++ b/Probability/measure.ml @@ -804,3 +804,1287 @@ let PROB_SYMMETRIC_DIFFERENCE = prove DISCH_TAC THEN ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC);; +(* ========================================================================= *) +(* Signed measures and positive/negative sets *) +(* ========================================================================= *) + +(* A signed measure is a countably additive real-valued set function with *) +(* mu({}) = 0. Unlike a probability measure, it can take negative values. *) + +let signed_measure = new_definition + `signed_measure (p:A prob_space) (mu:(A->bool)->real) <=> + mu {} = &0 /\ + (!A. (!n. A n IN prob_events p) /\ + (!i j. ~(i = j) ==> DISJOINT (A i) (A j)) + ==> ((\n. mu(A n)) real_sums mu(UNIONS {A n | n IN (:num)})) (from 0))`;; + +(* A positive set for mu: every measurable subset has nonneg mu-measure *) +let positive_set = new_definition + `positive_set (p:A prob_space) (mu:(A->bool)->real) (A:A->bool) <=> + A IN prob_events p /\ + (!B. B IN prob_events p /\ B SUBSET A ==> &0 <= mu B)`;; + +(* A negative set for mu: every measurable subset has nonpos mu-measure *) +let negative_set = new_definition + `negative_set (p:A prob_space) (mu:(A->bool)->real) (A:A->bool) <=> + A IN prob_events p /\ + (!B. B IN prob_events p /\ B SUBSET A ==> mu B <= &0)`;; + +let SIGNED_MEASURE_EMPTY = prove + (`!p:A prob_space mu. signed_measure p mu ==> mu {} = &0`, + SIMP_TAC[signed_measure]);; + +(* Finite additivity for signed measures - follows PROB_ADDITIVE pattern *) +let SIGNED_MEASURE_FINITELY_ADDITIVE = prove + (`!p:A prob_space mu a b. + signed_measure p mu /\ + a IN prob_events p /\ b IN prob_events p /\ DISJOINT a b + ==> mu(a UNION b) = mu a + mu b`, + REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC + `(\n. if n = 0 then a + else if n = 1 then b + else ({}:A->bool)):num->A->bool`) THEN + TRY BETA_TAC THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [X_GEN_TAC `n:num` THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN ASM_REWRITE_TAC[PROB_EMPTY_IN_EVENTS]; + MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN DISCH_TAC THEN + ASM_CASES_TAC `i = 0` THEN ASM_CASES_TAC `j = 0` THENL + [ASM_MESON_TAC[]; + ASM_CASES_TAC `j = 1` THEN ASM_REWRITE_TAC[DISJOINT_EMPTY] THEN + ASM_REWRITE_TAC[]; + ASM_CASES_TAC `i = 1` THEN ASM_REWRITE_TAC[DISJOINT_EMPTY] THEN + ONCE_REWRITE_TAC[DISJOINT_SYM] THEN ASM_REWRITE_TAC[]; + ASM_CASES_TAC `i = 1` THENL + [ASM_CASES_TAC `j = 1` THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[DISJOINT_EMPTY]; + ASM_CASES_TAC `j = 1` THENL + [ASM_REWRITE_TAC[DISJOINT_EMPTY]; ASM_REWRITE_TAC[DISJOINT_EMPTY]]]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `UNIONS {(if n = 0 then a + else if n = 1 then b + else ({}:A->bool)) | n IN (:num)} = a UNION b` + (fun th -> REWRITE_TAC[th]) THENL + [REWRITE_TAC[UNIONS_GSPEC; IN_UNIV; EXTENSION; IN_ELIM_THM; IN_UNION; + NOT_IN_EMPTY] THEN + GEN_TAC THEN EQ_TAC THENL + [DISCH_THEN(X_CHOOSE_THEN `n:num` MP_TAC) THEN + COND_CASES_TAC THENL + [MESON_TAC[]; + COND_CASES_TAC THENL + [MESON_TAC[]; + REWRITE_TAC[NOT_IN_EMPTY]]]; + STRIP_TAC THENL + [EXISTS_TAC `0` THEN ASM_REWRITE_TAC[]; + EXISTS_TAC `1` THEN ASM_REWRITE_TAC[ARITH_EQ]]]; + ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN + `((\n. (mu:(A->bool)->real) (if n = 0 then a + else if n = 1 then b + else ({}:A->bool))) real_sums + (mu a + mu b)) (from 0)` + (fun h2 -> FIRST_X_ASSUM(fun h1 -> + ACCEPT_TAC(MATCH_MP REAL_SERIES_UNIQUE (CONJ h1 h2)))) THEN + REWRITE_TAC[real_sums; FROM_0; INTER_UNIV] THEN + MATCH_MP_TAC REALLIM_EVENTUALLY THEN + REWRITE_TAC[EVENTUALLY_SEQUENTIALLY] THEN + EXISTS_TAC `1` THEN X_GEN_TAC `N:num` THEN DISCH_TAC THEN + MP_TAC(SPECL [`\n. (mu:(A->bool)->real) (if n = 0 then a + else if n = 1 then b else ({}:A->bool))`; + `0`; `N:num`] SUM_CLAUSES_LEFT) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + TRY BETA_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[] THEN + MP_TAC(SPECL [`\n. (mu:(A->bool)->real) (if n = 0 then a + else if n = 1 then b else ({}:A->bool))`; + `1`; `N:num`] SUM_CLAUSES_LEFT) THEN + ASM_REWRITE_TAC[] THEN DISCH_THEN SUBST1_TAC THEN + TRY BETA_TAC THEN CONV_TAC NUM_REDUCE_CONV THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN `sum (2..N) (\n. (mu:(A->bool)->real) + (if n = 0 then a else if n = 1 then b else ({}:A->bool))) = &0` + SUBST1_TAC THENL + [MATCH_MP_TAC SUM_EQ_0_NUMSEG THEN + X_GEN_TAC `i:num` THEN STRIP_TAC THEN + SUBGOAL_THEN `~(i = 0) /\ ~(i = 1)` (fun th -> REWRITE_TAC[th]) THENL + [ASM_ARITH_TAC; ASM_REWRITE_TAC[]]; + REAL_ARITH_TAC]);; + +(* Difference formula for signed measures *) +let SIGNED_MEASURE_DIFF = prove + (`!p:A prob_space mu a b. + signed_measure p mu /\ + a IN prob_events p /\ b IN prob_events p /\ b SUBSET a + ==> mu(a DIFF b) = mu a - mu b`, + REPEAT STRIP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `b:A->bool`; `a DIFF b:A->bool`] + SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + SUBGOAL_THEN `b UNION (a DIFF b) = a:A->bool` SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + ANTS_TAC THENL + [ASM_SIMP_TAC[PROB_DIFF_IN_EVENTS] THEN SET_TAC[]; + DISCH_THEN(fun th -> MP_TAC th) THEN REAL_ARITH_TAC]);; + +(* Every probability measure is a signed measure *) +let PROB_IS_SIGNED_MEASURE = prove + (`!p:A prob_space. signed_measure p (prob p)`, + GEN_TAC THEN REWRITE_TAC[signed_measure; PROB_EMPTY] THEN + REPEAT STRIP_TAC THEN + MATCH_MP_TAC(REWRITE_RULE[] + (ISPEC `p:A prob_space` PROB_COUNTABLY_ADDITIVE)) THEN + ASM_REWRITE_TAC[]);; + +let POSITIVE_SET_EMPTY = prove + (`!p:A prob_space mu. signed_measure p mu ==> positive_set p mu {}`, + REWRITE_TAC[positive_set; PROB_EMPTY_IN_EVENTS] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `B = {}:A->bool` SUBST1_TAC THENL + [ASM SET_TAC[]; ASM_MESON_TAC[signed_measure; REAL_LE_REFL]]);; + +let NEGATIVE_SET_EMPTY = prove + (`!p:A prob_space mu. signed_measure p mu ==> negative_set p mu {}`, + REWRITE_TAC[negative_set; PROB_EMPTY_IN_EVENTS] THEN + REPEAT STRIP_TAC THEN + SUBGOAL_THEN `B = {}:A->bool` SUBST1_TAC THENL + [ASM SET_TAC[]; ASM_MESON_TAC[signed_measure; REAL_LE_REFL]]);; + +let POSITIVE_SET_SUBSET = prove + (`!p:A prob_space mu A B. + positive_set p mu A /\ B IN prob_events p /\ B SUBSET A + ==> positive_set p mu B`, + REWRITE_TAC[positive_set] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);; + +let NEGATIVE_SET_SUBSET = prove + (`!p:A prob_space mu A B. + negative_set p mu A /\ B IN prob_events p /\ B SUBSET A + ==> negative_set p mu B`, + REWRITE_TAC[negative_set] THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN ASM SET_TAC[]);; + +(* Union of two positive sets is positive *) +let POSITIVE_SET_UNION = prove + (`!p:A prob_space mu A B. + signed_measure p mu /\ positive_set p mu A /\ positive_set p mu B + ==> positive_set p mu (A UNION B)`, + REWRITE_TAC[positive_set] THEN REPEAT STRIP_TAC THENL + [ASM_SIMP_TAC[PROB_UNION_IN_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN + `B' = (B' INTER A) UNION (B' INTER (B DIFF A)):A->bool` SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `B' INTER A IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_SIMP_TAC[PROB_INTER_IN_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN `B' INTER (B DIFF A) IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[PROB_INTER_IN_EVENTS; PROB_DIFF_IN_EVENTS]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `B' INTER A:A->bool`; `B' INTER (B DIFF A):A->bool`] + SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC REAL_LE_ADD THEN CONJ_TAC THENL + [SUBGOAL_THEN `B' INTER A SUBSET A:A->bool` + (fun th -> ASM_MESON_TAC[th]) THEN SET_TAC[]; + SUBGOAL_THEN `B' INTER (B DIFF A) SUBSET B:A->bool` + (fun th -> ASM_MESON_TAC[th]) THEN SET_TAC[]]);; + +(* Union of two negative sets is negative *) +let NEGATIVE_SET_UNION = prove + (`!p:A prob_space mu A B. + signed_measure p mu /\ negative_set p mu A /\ negative_set p mu B + ==> negative_set p mu (A UNION B)`, + REWRITE_TAC[negative_set] THEN REPEAT STRIP_TAC THENL + [ASM_SIMP_TAC[PROB_UNION_IN_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN + `B' = (B' INTER A) UNION (B' INTER (B DIFF A)):A->bool` SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `B' INTER A IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [ASM_SIMP_TAC[PROB_INTER_IN_EVENTS]; ALL_TAC] THEN + SUBGOAL_THEN `B' INTER (B DIFF A) IN prob_events (p:A prob_space)` + ASSUME_TAC THENL + [ASM_SIMP_TAC[PROB_INTER_IN_EVENTS; PROB_DIFF_IN_EVENTS]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `B' INTER A:A->bool`; `B' INTER (B DIFF A):A->bool`] + SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL [SET_TAC[]; ALL_TAC] THEN + DISCH_THEN SUBST1_TAC THEN + MATCH_MP_TAC(REAL_ARITH `a <= &0 /\ b <= &0 ==> a + b <= &0`) THEN + CONJ_TAC THENL + [SUBGOAL_THEN `B' INTER A SUBSET A:A->bool` + (fun th -> ASM_MESON_TAC[th]) THEN SET_TAC[]; + SUBGOAL_THEN `B' INTER (B DIFF A) SUBSET B:A->bool` + (fun th -> ASM_MESON_TAC[th]) THEN SET_TAC[]]);; + +(* ---------------------------------------------------------------------- *) +(* Phase 2: Countable union of positive sets, monotonicity, extraction *) +(* ---------------------------------------------------------------------- *) + +let IMAGE_NUMSEG_IN_EVENTS = prove + (`!p:A prob_space A n. + (!m. A m IN prob_events p) + ==> UNIONS(IMAGE A (0..n)) IN prob_events p`, + REPEAT STRIP_TAC THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_IMAGE] THEN ASM_REWRITE_TAC[]; + SIMP_TAC[FINITE_IMAGE; FINITE_NUMSEG]]);; + +let POSITIVE_SET_COUNTABLE_UNION = prove + (`!p:A prob_space mu A. + signed_measure p mu /\ (!n. positive_set p mu (A n)) + ==> positive_set p mu (UNIONS {A n | n IN (:num)})`, + REWRITE_TAC[positive_set] THEN REPEAT STRIP_TAC THENL + [MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_UNIV] THEN ASM_MESON_TAC[]; + REWRITE_TAC[SIMPLE_IMAGE] THEN + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]]; + ALL_TAC] THEN + SUBGOAL_THEN `!n:num. (A:num->A->bool) n IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + ABBREV_TAC + `D = \n:num. B INTER ((A:num->A->bool) n DIFF + UNIONS {A j | j:num < n}):A->bool` THEN + SUBGOAL_THEN `!n:num. (D:num->A->bool) n IN prob_events p` ASSUME_TAC THENL + [X_GEN_TAC `n:num` THEN EXPAND_TAC "D" THEN + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_FINITE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC] THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC FINITE_SUBSET THEN + EXISTS_TAC `IMAGE (A:num->A->bool) {j:num | j < n}` THEN + CONJ_TAC THENL + [MATCH_MP_TAC FINITE_IMAGE THEN REWRITE_TAC[FINITE_NUMSEG_LT]; + REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_IMAGE; IN_ELIM_THM] THEN + MESON_TAC[]]]; + ALL_TAC] THEN + SUBGOAL_THEN + `!i j. ~(i = j) ==> DISJOINT ((D:num->A->bool) i) (D j)` ASSUME_TAC THENL + [MAP_EVERY X_GEN_TAC [`i:num`; `j:num`] THEN DISCH_TAC THEN + EXPAND_TAC "D" THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY; IN_DIFF; + UNIONS_GSPEC; IN_ELIM_THM] THEN + X_GEN_TAC `x:A` THEN + REWRITE_TAC[TAUT `~((a /\ b /\ ~c) /\ d /\ e /\ ~f) <=> + a /\ b /\ d /\ e ==> c \/ f`] THEN + STRIP_TAC THEN + DISJ_CASES_TAC(SPECL [`i:num`; `j:num`] LT_CASES) THENL + [DISJ2_TAC THEN EXISTS_TAC `i:num` THEN ASM_REWRITE_TAC[]; + FIRST_X_ASSUM DISJ_CASES_TAC THENL + [DISJ1_TAC THEN EXISTS_TAC `j:num` THEN ASM_REWRITE_TAC[]; + ASM_MESON_TAC[]]]; + ALL_TAC] THEN + SUBGOAL_THEN `UNIONS {(D:num->A->bool) n | n IN (:num)} = B` ASSUME_TAC THENL + [EXPAND_TAC "D" THEN + REWRITE_TAC[EXTENSION; UNIONS_GSPEC; IN_ELIM_THM; IN_UNIV; + IN_INTER; IN_DIFF] THEN + X_GEN_TAC `x:A` THEN EQ_TAC THENL + [MESON_TAC[]; ALL_TAC] THEN + DISCH_TAC THEN + SUBGOAL_THEN `?m:num. (x:A) IN A m` MP_TAC THENL + [UNDISCH_TAC `B SUBSET UNIONS {(A:num->A->bool) n | n IN (:num)}` THEN + UNDISCH_TAC `(x:A) IN B` THEN + REWRITE_TAC[SUBSET; UNIONS_GSPEC; IN_ELIM_THM; IN_UNIV] THEN + MESON_TAC[]; + ALL_TAC] THEN + DISCH_TAC THEN + MP_TAC(SPEC `\n:num. (x:A) IN A n` MINIMAL) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(fun th -> + EXISTS_TAC `(minimal) (\n:num. (x:A) IN A n)` THEN MP_TAC th) THEN + REWRITE_TAC[] THEN STRIP_TAC THEN ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `r:num` STRIP_ASSUME_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `r:num`) THEN + ASM_MESON_TAC[NOT_LT]; + ALL_TAC] THEN + SUBGOAL_THEN `!n. (D:num->A->bool) n SUBSET A n` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "D" THEN SET_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `!n:num. &0 <= mu((D:num->A->bool) n)` ASSUME_TAC THENL + [GEN_TAC THEN + FIRST_ASSUM(MP_TAC o CONJUNCT2 o SPEC `n:num`) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `D:num->A->bool`) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(ISPECL [`\n:num. &0:real`; `\n:num. mu((D:num->A->bool) n):real`; + `from 0`; `&0:real`; `mu(B:A->bool):real`] + REAL_SERIES_LE) THEN + ASM_REWRITE_TAC[REAL_SERIES_0] THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_FROM] THEN GEN_TAC THEN DISCH_TAC THEN ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]);; + +let POSITIVE_SET_MONOTONE = prove + (`!p:A prob_space mu A B. + signed_measure p mu /\ positive_set p mu A /\ + B IN prob_events p /\ B SUBSET A + ==> &0 <= mu B /\ mu B <= mu A`, + REWRITE_TAC[positive_set] THEN REPEAT STRIP_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `A:A->bool`; `B:A->bool`] SIGNED_MEASURE_DIFF) THEN + ASM_REWRITE_TAC[] THEN DISCH_TAC THEN + SUBGOAL_THEN `&0 <= mu(A DIFF B:A->bool)` MP_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_SIMP_TAC[PROB_DIFF_IN_EVENTS] THEN SET_TAC[]; + ASM_REAL_ARITH_TAC]);; + +(* If S is not a positive set, there exists a measurable subset with measure + bounded below by -inv(&(k+1)) for some k. *) +let NOT_POSITIVE_HAS_NEG_INV = prove + (`!p:A prob_space mu S. + S IN prob_events p /\ ~(positive_set p mu S) + ==> ?k D:A->bool. D IN prob_events p /\ D SUBSET S /\ + (mu:(A->bool)->real) D <= --inv(&(k + 1))`, + REWRITE_TAC[positive_set] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o + REWRITE_RULE[DE_MORGAN_THM; NOT_FORALL_THM; NOT_IMP]) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[REAL_NOT_LE] THEN STRIP_TAC THEN + SUBGOAL_THEN `&0 < --((mu:(A->bool)->real) B)` MP_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `n:num` STRIP_ASSUME_TAC) THEN + EXISTS_TAC `n - 1` THEN EXISTS_TAC `B:A->bool` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&(n - 1 + 1) = &n` SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUB; + ARITH_RULE `~(n = 0) ==> 1 <= n`] THEN + REAL_ARITH_TAC; + ASM_REAL_ARITH_TAC]);; + +(* Key extraction lemma: from any set A with mu(A) > 0, we can extract a + positive subset B with mu(B) > 0. Uses recursive construction with + the "minimal k" trick to ensure the extracted subsets are bounded. *) +let EXTRACT_POSITIVE_SUBSET = prove + (`!p:A prob_space mu A. + signed_measure p mu /\ A IN prob_events p /\ &0 < mu A + ==> ?B. B IN prob_events p /\ B SUBSET A /\ + positive_set p mu B /\ &0 < mu B`, + REPEAT GEN_TAC THEN STRIP_TAC THEN + ASM_CASES_TAC `positive_set (p:A prob_space) mu (A:A->bool)` THENL + [EXISTS_TAC `A:A->bool` THEN ASM_REWRITE_TAC[SUBSET_REFL] THEN + ASM_MESON_TAC[positive_set]; + ALL_TAC] THEN + (* Build recursive sequence R(0)=A, R(n+1) = R(n) minus extracted neg set *) + MP_TAC(ISPECL + [`A:A->bool`; + `\(S:A->bool) (n:num). + if (?k:num. ?C:A->bool. C IN prob_events (p:A prob_space) /\ + C SUBSET S /\ (mu:(A->bool)->real) C <= --inv(&(k + 1))) + then S DIFF (@D:A->bool. D IN prob_events p /\ D SUBSET S /\ + mu D <= --inv(&((minimal) + (\k:num. ?E:A->bool. E IN prob_events p /\ + E SUBSET S /\ mu E <= --inv(&(k + 1))) + 1))) + else S`] + num_RECURSION) THEN + REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `R:num->A->bool` STRIP_ASSUME_TAC) THEN + (* Abbreviate the "bad predicate" for set S *) + ABBREV_TAC + `hasneg = \S:A->bool. + ?k:num. ?C:A->bool. C IN prob_events (p:A prob_space) /\ + C SUBSET S /\ (mu:(A->bool)->real) C <= --inv(&(k + 1))` THEN + (* Key property: when hasneg(R n), the @-selected set satisfies specs *) + SUBGOAL_THEN + `!n:num. (hasneg:(A->bool)->bool)((R:num->A->bool) n) + ==> (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + (mu:(A->bool)->real) D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))) + IN prob_events p /\ + (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + mu D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))) + SUBSET R n /\ + mu(@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + mu D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))) + <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "hasneg" THEN REWRITE_TAC[] THEN DISCH_TAC THEN + MP_TAC(fst(EQ_IMP_RULE(REWRITE_RULE[] + (SPEC `\k:num. ?E:A->bool. E IN prob_events (p:A prob_space) /\ + E SUBSET (R:num->A->bool) n /\ + (mu:(A->bool)->real) E <= --inv(&(k + 1))` MINIMAL)))) THEN + ANTS_TAC THENL [ASM_MESON_TAC[]; ALL_TAC] THEN + STRIP_TAC THEN + MP_TAC(ISPECL + [`\D:A->bool. D IN prob_events (p:A prob_space) /\ + D SUBSET (R:num->A->bool) n /\ + (mu:(A->bool)->real) D <= --inv(&((minimal) + (\k:num. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))`; + `E:A->bool`] SELECT_AX) THEN + REWRITE_TAC[] THEN + DISCH_THEN MATCH_MP_TAC THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* R(n) in events and R(n) SUBSET A *) + SUBGOAL_THEN + `!n:num. (R:num->A->bool) n IN prob_events p /\ R n SUBSET A` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[SUBSET_REFL]; + ASM_REWRITE_TAC[] THEN COND_CASES_TAC THENL + [SUBGOAL_THEN `hasneg((R:num->A->bool) n):bool` ASSUME_TAC THENL + [EXPAND_TAC "hasneg" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + CONJ_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_MESON_TAC[]; + MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `(R:num->A->bool) n` THEN + ASM_REWRITE_TAC[] THEN SET_TAC[]]; + ASM_REWRITE_TAC[]]]; + ALL_TAC] THEN + (* R(SUC n) SUBSET R n *) + SUBGOAL_THEN `!n:num. (R:num->A->bool)(SUC n) SUBSET R n` + ASSUME_TAC THENL + [GEN_TAC THEN ASM_REWRITE_TAC[] THEN + COND_CASES_TAC THEN REWRITE_TAC[SUBSET_REFL] THEN SET_TAC[]; + ALL_TAC] THEN + (* Monotonicity: m <= n ==> R n SUBSET R m *) + SUBGOAL_THEN `!m n:num. m <= n ==> (R:num->A->bool) n SUBSET R m` + ASSUME_TAC THENL + [GEN_TAC THEN INDUCT_TAC THENL + [REWRITE_TAC[LE] THEN DISCH_TAC THEN ASM_REWRITE_TAC[SUBSET_REFL]; + REWRITE_TAC[LE] THEN STRIP_TAC THENL + [ASM_REWRITE_TAC[SUBSET_REFL]; + MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `(R:num->A->bool) n` THEN ASM_SIMP_TAC[]]]; + ALL_TAC] THEN + (* Define C(n) = R(n) \ R(n+1) *) + ABBREV_TAC `C = \n:num. (R:num->A->bool) n DIFF R(SUC n)` THEN + (* C(n) in events *) + SUBGOAL_THEN `!n:num. (C:num->A->bool) n IN prob_events p` + ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "C" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* C(i), C(j) pairwise disjoint *) + SUBGOAL_THEN + `!i j:num. ~(i = j) ==> DISJOINT ((C:num->A->bool) i) (C j)` + ASSUME_TAC THENL + [REPEAT GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "C" THEN REWRITE_TAC[] THEN + REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; IN_DIFF; NOT_IN_EMPTY] THEN + X_GEN_TAC `x:A` THEN + REWRITE_TAC[TAUT `~((a /\ ~b) /\ c /\ ~d) <=> a /\ c ==> b \/ d`] THEN + STRIP_TAC THEN + DISJ_CASES_TAC(SPECL [`i:num`; `j:num`] LT_CASES) THENL + [DISJ1_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`SUC i`; `j:num`]) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ASM SET_TAC[]]; + FIRST_X_ASSUM DISJ_CASES_TAC THENL + [DISJ2_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`SUC j`; `i:num`]) THEN + ANTS_TAC THENL [ASM_ARITH_TAC; ASM SET_TAC[]]; + ASM_MESON_TAC[]]]; + ALL_TAC] THEN + (* C(n) SUBSET A *) + SUBGOAL_THEN `!n:num. (C:num->A->bool) n SUBSET A` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "C" THEN REWRITE_TAC[] THEN + MATCH_MP_TAC SUBSET_TRANS THEN EXISTS_TAC `(R:num->A->bool) n` THEN + ASM_REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + (* Series convergence: sum(mu(C n)) = mu(UNIONS{C n}) *) + SUBGOAL_THEN + `((\n. (mu:(A->bool)->real)((C:num->A->bool) n)) + real_sums mu(UNIONS {C n | n IN (:num)})) (from 0)` + ASSUME_TAC THENL + [FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + STRIP_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `C:num->A->bool`) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* UNIONS{C n} in events *) + ABBREV_TAC `UC = UNIONS {(C:num->A->bool) n | n IN (:num)}` THEN + SUBGOAL_THEN `(UC:A->bool) IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "UC" THEN + MATCH_MP_TAC PROB_COUNTABLE_UNION_IN_EVENTS THEN + CONJ_TAC THENL + [REWRITE_TAC[SUBSET; FORALL_IN_GSPEC; IN_UNIV] THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[SIMPLE_IMAGE] THEN + MATCH_MP_TAC COUNTABLE_IMAGE THEN REWRITE_TAC[NUM_COUNTABLE]]; + ALL_TAC] THEN + SUBGOAL_THEN `UC SUBSET A:A->bool` ASSUME_TAC THENL + [EXPAND_TAC "UC" THEN REWRITE_TAC[UNIONS_SUBSET; FORALL_IN_GSPEC; IN_UNIV] THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* A DIFF UC is in events *) + SUBGOAL_THEN `A DIFF UC IN prob_events (p:A prob_space)` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_DIFF_IN_EVENTS THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* A DIFF UC SUBSET R(n) for all n *) + SUBGOAL_THEN `!n:num. A DIFF UC SUBSET (R:num->A->bool) n` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [ASM_REWRITE_TAC[] THEN SET_TAC[]; + REWRITE_TAC[SUBSET] THEN X_GEN_TAC `x:A` THEN + REWRITE_TAC[IN_DIFF] THEN STRIP_TAC THEN + SUBGOAL_THEN `(x:A) IN R(n:num)` ASSUME_TAC THENL + [FIRST_X_ASSUM(MP_TAC o GEN_REWRITE_RULE I [SUBSET]) THEN + DISCH_THEN MATCH_MP_TAC THEN ASM_REWRITE_TAC[IN_DIFF]; + ALL_TAC] THEN + ASM_CASES_TAC `(x:A) IN R(SUC n):A->bool` THEN + ASM_REWRITE_TAC[] THEN + UNDISCH_TAC `~((x:A) IN UC:A->bool)` THEN REWRITE_TAC[] THEN + EXPAND_TAC "UC" THEN + REWRITE_TAC[UNIONS_GSPEC; IN_ELIM_THM; IN_UNIV] THEN + EXISTS_TAC `n:num` THEN + SUBGOAL_THEN `(C:num->A->bool) n = R n DIFF R(SUC n)` + SUBST1_TAC THENL + [EXPAND_TAC "C" THEN REWRITE_TAC[]; ALL_TAC] THEN + ASM_REWRITE_TAC[IN_DIFF]]; + ALL_TAC] THEN + (* mu(C n) <= 0 for all n *) + SUBGOAL_THEN `!n:num. (mu:(A->bool)->real)((C:num->A->bool) n) <= &0` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `(C:num->A->bool) n = R n DIFF R(SUC n)` SUBST1_TAC THENL + [EXPAND_TAC "C" THEN REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> is_forall(concl th) && is_eq(snd(dest_forall(concl th))))) THEN + REWRITE_TAC[] THEN + COND_CASES_TAC THENL + [DISCH_TAC THEN + FIRST_X_ASSUM(SUBST1_TAC) THEN + SUBGOAL_THEN `hasneg((R:num->A->bool) n):bool` ASSUME_TAC THENL + [EXPAND_TAC "hasneg" THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `(R:num->A->bool) n DIFF (R n DIFF (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + (mu:(A->bool)->real) D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1)))) = + R n INTER (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + mu D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1)))` + SUBST1_TAC THENL + [SET_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> can (find_term + (fun t -> is_var t && fst(dest_var t) = "hasneg")) (concl th) && + is_forall(concl th))) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN + `(R:num->A->bool) n INTER (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + (mu:(A->bool)->real) D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1))) = + (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + mu D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1)))` + SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC) THEN + MATCH_MP_TAC(REAL_ARITH `&0 < y ==> x <= --y ==> x <= &0`) THEN + MATCH_MP_TAC REAL_LT_INV THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC; + DISCH_TAC THEN + FIRST_X_ASSUM(SUBST1_TAC) THEN + SUBGOAL_THEN `(R:num->A->bool) n DIFF R n = {}:A->bool` + SUBST1_TAC THENL + [SET_TAC[]; ALL_TAC] THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + SIMP_TAC[] THEN REAL_ARITH_TAC]; + ALL_TAC] THEN + (* mu(UC) <= 0 *) + SUBGOAL_THEN `(mu:(A->bool)->real) UC <= &0` ASSUME_TAC THENL + [MP_TAC(ISPECL + [`\n:num. (mu:(A->bool)->real)((C:num->A->bool) n)`; + `\n:num. &0:real`; + `from 0`; `(mu:(A->bool)->real)(UC:A->bool)`; `&0:real`] + REAL_SERIES_LE) THEN + ASM_REWRITE_TAC[REAL_SERIES_0] THEN + ANTS_TAC THENL + [REWRITE_TAC[IN_FROM] THEN GEN_TAC THEN DISCH_TAC THEN + ASM_REWRITE_TAC[]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* mu(A DIFF UC) = mu(A) - mu(UC) *) + SUBGOAL_THEN `(mu:(A->bool)->real)(A DIFF UC:A->bool) = mu(A:A->bool) - mu(UC:A->bool)` + ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `A:A->bool`; `UC:A->bool`] SIGNED_MEASURE_DIFF) THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Now prove B = A DIFF UC satisfies all conditions *) + EXISTS_TAC `A DIFF UC:A->bool` THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL [SET_TAC[]; ALL_TAC] THEN + (* mu(B) > 0 *) + CONJ_TAC THENL + [ALL_TAC; ASM_REAL_ARITH_TAC] THEN + (* B is positive: proof by contradiction *) + REWRITE_TAC[positive_set] THEN ASM_REWRITE_TAC[] THEN + X_GEN_TAC `E:A->bool` THEN STRIP_TAC THEN + (* Assume mu(E) < 0 and derive contradiction *) + REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + (* E SUBSET R(n) for all n *) + SUBGOAL_THEN `!n:num. (E:A->bool) SUBSET (R:num->A->bool) n` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC SUBSET_TRANS THEN + EXISTS_TAC `A DIFF UC:A->bool` THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* Find m with mu(E) <= -inv(&(m+1)) *) + SUBGOAL_THEN `&0 < --((mu:(A->bool)->real) E)` MP_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + GEN_REWRITE_TAC LAND_CONV [REAL_ARCH_INV] THEN + DISCH_THEN(X_CHOOSE_THEN `m:num` STRIP_ASSUME_TAC) THEN + SUBGOAL_THEN `(mu:(A->bool)->real) E <= --inv(&m)` ASSUME_TAC THENL + [ASM_REAL_ARITH_TAC; ALL_TAC] THEN + (* For all n: hasneg(R n) because E SUBSET R(n) and mu(E) < 0 *) + SUBGOAL_THEN `!n:num. hasneg((R:num->A->bool) n):bool` ASSUME_TAC THENL + [GEN_TAC THEN EXPAND_TAC "hasneg" THEN REWRITE_TAC[] THEN + EXISTS_TAC `m - 1` THEN EXISTS_TAC `E:A->bool` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&(m - 1 + 1) = &m` SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUB; + ARITH_RULE `~(m = 0) ==> 1 <= m`] THEN + REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* For all n: the minimal k for R(n) is <= m-1 *) + SUBGOAL_THEN + `!n:num. (minimal)(\k. ?D:A->bool. D IN prob_events (p:A prob_space) /\ + D SUBSET (R:num->A->bool) n /\ + (mu:(A->bool)->real) D <= --inv(&(k + 1))) <= m - 1` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(fst(EQ_IMP_RULE(REWRITE_RULE[] + (SPEC `\k:num. ?D:A->bool. D IN prob_events (p:A prob_space) /\ + D SUBSET (R:num->A->bool) n /\ + (mu:(A->bool)->real) D <= --inv(&(k + 1))` MINIMAL)))) THEN + ANTS_TAC THENL + [EXISTS_TAC `m - 1` THEN EXISTS_TAC `E:A->bool` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&(m - 1 + 1) = &m` SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUB; + ARITH_RULE `~(m = 0) ==> 1 <= m`] THEN + REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + STRIP_TAC THEN + REWRITE_TAC[GSYM NOT_LT] THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPEC `m - 1`) THEN + ASM_REWRITE_TAC[] THEN + EXISTS_TAC `E:A->bool` THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&(m - 1 + 1) = &m` SUBST1_TAC THENL + [ASM_SIMP_TAC[GSYM REAL_OF_NUM_ADD; GSYM REAL_OF_NUM_SUB; + ARITH_RULE `~(m = 0) ==> 1 <= m`] THEN + REAL_ARITH_TAC; + ASM_REWRITE_TAC[]]; + ALL_TAC] THEN + (* So mu(C n) <= -inv(&m) for all n *) + SUBGOAL_THEN + `!n:num. (mu:(A->bool)->real)((C:num->A->bool) n) <= --inv(&m)` + ASSUME_TAC THENL + [GEN_TAC THEN + SUBGOAL_THEN `(C:num->A->bool) n = R n DIFF R(SUC n)` SUBST1_TAC THENL + [EXPAND_TAC "C" THEN REWRITE_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> is_forall(concl th) && is_eq(snd(dest_forall(concl th))))) THEN + REWRITE_TAC[] THEN + SUBGOAL_THEN + `?k:num. ?C:A->bool. C IN prob_events (p:A prob_space) /\ + C SUBSET (R:num->A->bool) n /\ + (mu:(A->bool)->real) C <= --inv(&(k + 1))` + (fun th -> REWRITE_TAC[th]) THENL + [FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> can (find_term + (fun t -> is_var t && fst(dest_var t) = "hasneg")) (concl th))) THEN + EXPAND_TAC "hasneg" THEN REWRITE_TAC[]; + ALL_TAC] THEN + DISCH_TAC THEN + FIRST_X_ASSUM(SUBST1_TAC) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> + can (find_term + (fun t -> is_var t && fst(dest_var t) = "hasneg")) (concl th) && + is_forall(concl th))) THEN + ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN + `(R:num->A->bool) n DIFF (R n DIFF (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + (mu:(A->bool)->real) D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1)))) = + (@D:A->bool. D IN prob_events p /\ D SUBSET R n /\ + mu D <= --inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events p /\ E SUBSET R n /\ + mu E <= --inv(&(k + 1))) + 1)))` + SUBST1_TAC THENL + [ASM SET_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC REAL_LE_TRANS THEN + EXISTS_TAC `--inv(&((minimal) + (\k. ?E:A->bool. E IN prob_events (p:A prob_space) /\ E SUBSET + (R:num->A->bool) n /\ + (mu:(A->bool)->real) E <= --inv(&(k + 1))) + 1))` THEN + ASM_REWRITE_TAC[] THEN + CONJ_TAC THENL + [(* First conjunct: mu(@D...) <= --inv(minimal_k + 1) *) + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> + can (find_term + (fun t -> is_var t && fst(dest_var t) = "hasneg")) (concl th) && + is_forall(concl th))) THEN + ASM_REWRITE_TAC[] THEN REAL_ARITH_TAC; + (* Second conjunct: --inv(minimal_k + 1) <= --inv(&m) *) + REWRITE_TAC[REAL_LE_NEG2] THEN MATCH_MP_TAC REAL_LE_INV2 THEN + CONJ_TAC THENL [REWRITE_TAC[REAL_OF_NUM_LT] THEN ASM_ARITH_TAC; ALL_TAC] THEN + REWRITE_TAC[REAL_OF_NUM_LE] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `n:num` o + check(fun th -> can (find_term + (fun t -> is_const t && fst(dest_const t) = "minimal")) (concl th))) THEN + UNDISCH_TAC `~(m = 0)` THEN ARITH_TAC]; + ALL_TAC] THEN + (* But the series converges, and terms -> 0 *) + SUBGOAL_THEN `((\n:num. (mu:(A->bool)->real)((C:num->A->bool) n)) ---> &0) + sequentially` MP_TAC THENL + [MATCH_MP_TAC REAL_SERIES_TERMS_TOZERO THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[REALLIM_SEQUENTIALLY] THEN + DISCH_THEN(MP_TAC o SPEC `inv(&m)`) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` (MP_TAC o SPEC `N:num`)) THEN + REWRITE_TAC[LE_REFL] THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N:num` o + check(fun th -> can (find_term + (fun t -> is_var t && fst(dest_var t) = "m")) (concl th))) THEN + REAL_ARITH_TAC);; + +(* ---------------------------------------------------------------------- *) +(* Phase 3: Hahn decomposition theorem *) +(* ---------------------------------------------------------------------- *) + +(* The measure of any positive set is bounded above *) +let SUP_POSITIVE_MEASURE_BOUNDED = prove + (`!p:A prob_space mu. signed_measure p mu + ==> ?B. !E:A->bool. positive_set p mu E ==> mu E <= B`, + REPEAT STRIP_TAC THEN + (* By contradiction: suppose no bound *) + MATCH_MP_TAC(TAUT `(~p ==> F) ==> p`) THEN + DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[NOT_EXISTS_THM; NOT_FORALL_THM; + NOT_IMP; REAL_NOT_LE]) THEN + DISCH_TAC THEN + (* For each n, get E_n positive with mu(E_n) > n *) + SUBGOAL_THEN `!n:num. ?E:A->bool. positive_set (p:A prob_space) mu E /\ + &n < mu E` ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + FIRST_X_ASSUM(MP_TAC o REWRITE_RULE[SKOLEM_THM]) THEN + DISCH_THEN(X_CHOOSE_TAC `E:num->A->bool`) THEN + (* P = UNIONS{E_n | n} is positive *) + ABBREV_TAC `P = UNIONS {(E:num->A->bool) n | n IN (:num)}` THEN + SUBGOAL_THEN `positive_set (p:A prob_space) mu P` ASSUME_TAC THENL + [EXPAND_TAC "P" THEN MATCH_MP_TAC POSITIVE_SET_COUNTABLE_UNION THEN + ASM_MESON_TAC[]; ALL_TAC] THEN + (* mu(E_n) <= mu(P) for all n *) + SUBGOAL_THEN `!n:num. (mu:(A->bool)->real)((E:num->A->bool) n) <= + mu(P:A->bool)` ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `P:A->bool`; `(E:num->A->bool) n`] POSITIVE_SET_MONOTONE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM_MESON_TAC[positive_set]; + EXPAND_TAC "P" THEN + REWRITE_TAC[SUBSET; UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + MESON_TAC[]]; + REAL_ARITH_TAC]; ALL_TAC] THEN + (* &n < mu(P) for all n *) + SUBGOAL_THEN `!n:num. &n < (mu:(A->bool)->real)(P:A->bool)` + ASSUME_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC REAL_LTE_TRANS THEN + EXISTS_TAC `(mu:(A->bool)->real)((E:num->A->bool) n)` THEN + CONJ_TAC THENL [ASM_MESON_TAC[]; ASM_MESON_TAC[]]; ALL_TAC] THEN + (* Contradiction: mu(P) is a fixed real but > n for all n *) + MP_TAC(SPEC `(mu:(A->bool)->real)(P:A->bool)` REAL_ARCH_SIMPLE) THEN + DISCH_THEN(X_CHOOSE_TAC `N:num`) THEN + FIRST_X_ASSUM(MP_TAC o SPEC `N:num`) THEN + UNDISCH_TAC `(mu:(A->bool)->real)(P:A->bool) <= &N` THEN + REAL_ARITH_TAC);; + +(* ---------------------------------------------------------------------- *) +(* Hahn decomposition: prob_carrier = P UNION N, P positive, N negative *) +(* ---------------------------------------------------------------------- *) + +let HAHN_DECOMPOSITION = prove + (`!p:A prob_space mu. + signed_measure p mu + ==> ?P N. positive_set p mu P /\ negative_set p mu N /\ + DISJOINT P N /\ P UNION N = prob_carrier p`, + REPEAT STRIP_TAC THEN + (* s = sup{mu(E) | E | positive_set p mu E} -- two-bar syntax keeps mu free *) + ABBREV_TAC `s = sup {mu(E:A->bool) | E | positive_set (p:A prob_space) mu E}` THEN + (* s is well-defined: set is nonempty (empty set) and bounded above *) + SUBGOAL_THEN `~({mu(E:A->bool) | E | positive_set (p:A prob_space) mu E} = {})` + ASSUME_TAC THENL + [REWRITE_TAC[GSYM MEMBER_NOT_EMPTY; IN_ELIM_THM] THEN + EXISTS_TAC `&0` THEN EXISTS_TAC `{}:A->bool` THEN + ASM_MESON_TAC[POSITIVE_SET_EMPTY; SIGNED_MEASURE_EMPTY]; + ALL_TAC] THEN + SUBGOAL_THEN `?B. !x:real. x IN {mu(E:A->bool) | E | positive_set (p:A prob_space) mu E} + ==> x <= B` ASSUME_TAC THENL + [MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + SUP_POSITIVE_MEASURE_BOUNDED) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_TAC `B:real`) THEN + EXISTS_TAC `B:real` THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + (* Properties of s *) + SUBGOAL_THEN `!E:A->bool. positive_set (p:A prob_space) mu E ==> mu E <= s` + ASSUME_TAC THENL + [GEN_TAC THEN DISCH_TAC THEN EXPAND_TAC "s" THEN + MATCH_MP_TAC(REWRITE_RULE[RIGHT_IMP_FORALL_THM] ELEMENT_LE_SUP) THEN + CONJ_TAC THENL + [ASM_MESON_TAC[IN_ELIM_THM]; REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]]; + ALL_TAC] THEN + SUBGOAL_THEN `&0 <= s` ASSUME_TAC THENL + [ASM_MESON_TAC[POSITIVE_SET_EMPTY; SIGNED_MEASURE_EMPTY; REAL_LE_TRANS; + REAL_LE_REFL]; + ALL_TAC] THEN + (* Approximating sequence: positive E_n with mu(E_n) > s - inv(n+1) *) + SUBGOAL_THEN + `!n:num. ?E:A->bool. positive_set (p:A prob_space) mu E /\ + s - inv(&(n + 1)) < mu E` + MP_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`{mu(E:A->bool) | E | positive_set (p:A prob_space) mu E}`; + `s - inv(&(n + 1))`] SUP_APPROACH) THEN + ASM_REWRITE_TAC[] THEN + ANTS_TAC THENL + [SUBGOAL_THEN `s - inv(&(n + 1)) < s` (fun th -> REWRITE_TAC[th]) THEN + REWRITE_TAC[REAL_ARITH `s - x < s <=> &0 < x`] THEN + MATCH_MP_TAC REAL_LT_INV THEN + REWRITE_TAC[REAL_OF_NUM_LT] THEN ARITH_TAC; + ALL_TAC] THEN + REWRITE_TAC[IN_ELIM_THM] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[SKOLEM_THM; LEFT_IMP_EXISTS_THM] THEN + X_GEN_TAC `E:num->A->bool` THEN DISCH_TAC THEN + (* Build cumulative unions P_n = UNIONS(IMAGE E (0..n)) *) + ABBREV_TAC `Pn = \n:num. UNIONS(IMAGE (E:num->A->bool) (0..n))` THEN + (* Each P_n is positive (by induction, using POSITIVE_SET_UNION) *) + SUBGOAL_THEN `!n:num. positive_set (p:A prob_space) mu ((Pn:num->A->bool) n)` + ASSUME_TAC THENL + [INDUCT_TAC THENL + [EXPAND_TAC "Pn" THEN REWRITE_TAC[NUMSEG_SING; IMAGE_CLAUSES] THEN + REWRITE_TAC[UNIONS_1] THEN ASM_MESON_TAC[]; + ALL_TAC] THEN + EXPAND_TAC "Pn" THEN + SIMP_TAC[NUMSEG_CLAUSES; LE_0] THEN + REWRITE_TAC[IMAGE_CLAUSES; UNIONS_INSERT] THEN + MATCH_MP_TAC POSITIVE_SET_UNION THEN + SUBGOAL_THEN `UNIONS(IMAGE (E:num->A->bool) (0..n)) = (Pn:num->A->bool) n` + SUBST1_TAC THENL + [EXPAND_TAC "Pn" THEN REWRITE_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[]; + ALL_TAC] THEN + (* P = UNIONS{P_n | n} is positive *) + SUBGOAL_THEN + `UNIONS {(Pn:num->A->bool) n | n IN (:num)} = + UNIONS {(E:num->A->bool) n | n IN (:num)}` + ASSUME_TAC THENL + [EXPAND_TAC "Pn" THEN + REWRITE_TAC[UNIONS_GSPEC; IN_UNIV] THEN + GEN_REWRITE_TAC I [EXTENSION] THEN + X_GEN_TAC `x:A` THEN REWRITE_TAC[IN_ELIM_THM] THEN + REWRITE_TAC[IN_UNIONS; IN_IMAGE; IN_NUMSEG] THEN + MESON_TAC[LE_REFL; LE_0]; + ALL_TAC] THEN + ABBREV_TAC `P = UNIONS {(E:num->A->bool) n | n IN (:num)}` THEN + SUBGOAL_THEN `positive_set (p:A prob_space) mu P` ASSUME_TAC THENL + [EXPAND_TAC "P" THEN + SUBGOAL_THEN `UNIONS {(E:num->A->bool) n | n IN (:num)} = + UNIONS {(Pn:num->A->bool) n | n IN (:num)}` SUBST1_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + MATCH_MP_TAC POSITIVE_SET_COUNTABLE_UNION THEN + ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* mu(P) = s *) + SUBGOAL_THEN `(mu:(A->bool)->real) P = s` ASSUME_TAC THENL + [MATCH_MP_TAC(REAL_ARITH `a <= b /\ b <= a ==> a = b`) THEN + CONJ_TAC THENL + [FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + (* s <= mu(P): by contradiction via approximating sequence *) + REWRITE_TAC[GSYM REAL_NOT_LT] THEN DISCH_TAC THEN + (* mu(E_N) <= mu(P) by monotonicity in positive set P *) + SUBGOAL_THEN `!n:num. (mu:(A->bool)->real)((E:num->A->bool) n) <= mu(P:A->bool)` + ASSUME_TAC THENL + [GEN_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; + `P:A->bool`; `(E:num->A->bool) n`] POSITIVE_SET_MONOTONE) THEN + ANTS_TAC THENL + [ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [ASM_MESON_TAC[positive_set]; + EXPAND_TAC "P" THEN + REWRITE_TAC[SUBSET; UNIONS_GSPEC; IN_UNIV; IN_ELIM_THM] THEN + MESON_TAC[]]; + REAL_ARITH_TAC]; + ALL_TAC] THEN + (* s - mu(P) > 0, find N with inv(N) < s - mu(P) *) + MP_TAC(fst(EQ_IMP_RULE(SPEC `s - (mu:(A->bool)->real)(P:A->bool)` + REAL_ARCH_INV))) THEN + ANTS_TAC THENL + [UNDISCH_TAC `(mu:(A->bool)->real)(P:A->bool) < s` THEN + REAL_ARITH_TAC; ALL_TAC] THEN + DISCH_THEN(X_CHOOSE_THEN `N:num` STRIP_ASSUME_TAC) THEN + (* inv(N+1) <= inv(N) *) + SUBGOAL_THEN `inv(&(N + 1)) <= inv(&N)` ASSUME_TAC THENL + [MATCH_MP_TAC REAL_LE_INV2 THEN + REWRITE_TAC[REAL_OF_NUM_LT; REAL_OF_NUM_LE] THEN + UNDISCH_TAC `~(N = 0)` THEN ARITH_TAC; + ALL_TAC] THEN + (* s - inv(N+1) < mu(E_N) from approximating sequence *) + SUBGOAL_THEN `s - inv(&(N + 1)) < (mu:(A->bool)->real)((E:num->A->bool) N)` + ASSUME_TAC THENL + [ASM_MESON_TAC[]; ALL_TAC] THEN + (* Contradiction: inv(N+1) <= inv(N) < s - mu(P), so *) + (* s - inv(N+1) >= mu(P), but s - inv(N+1) < mu(E_N) <= mu(P) *) + FIRST_X_ASSUM(MP_TAC o SPEC `N:num`) THEN + UNDISCH_TAC `s - inv(&(N + 1)) < (mu:(A->bool)->real)((E:num->A->bool) N)` THEN + UNDISCH_TAC `inv(&(N + 1)) <= inv(&N)` THEN + UNDISCH_TAC `inv(&N) < s - (mu:(A->bool)->real)(P:A->bool)` THEN + REAL_ARITH_TAC; + ALL_TAC] THEN + (* N = prob_carrier p DIFF P *) + EXISTS_TAC `P:A->bool` THEN + EXISTS_TAC `prob_carrier (p:A prob_space) DIFF P` THEN + ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `P:A->bool IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[positive_set]; ALL_TAC] THEN + REPEAT CONJ_TAC THENL + [(* negative_set p mu N *) + REWRITE_TAC[negative_set] THEN CONJ_TAC THENL + [ASM_SIMP_TAC[PROB_COMPL_IN_EVENTS]; ALL_TAC] THEN + X_GEN_TAC `B:A->bool` THEN STRIP_TAC THEN + (* Suppose for contradiction mu(B) > 0 *) + REWRITE_TAC[REAL_ARITH `x <= &0 <=> ~(&0 < x)`] THEN DISCH_TAC THEN + (* By EXTRACT_POSITIVE_SUBSET, get Q subset B positive with mu(Q) > 0 *) + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`; `B:A->bool`] + EXTRACT_POSITIVE_SUBSET) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `Q:A->bool` STRIP_ASSUME_TAC) THEN + (* P UNION Q is positive *) + SUBGOAL_THEN `positive_set (p:A prob_space) mu (P UNION Q)` ASSUME_TAC THENL + [MATCH_MP_TAC POSITIVE_SET_UNION THEN ASM_REWRITE_TAC[]; + ALL_TAC] THEN + (* mu(P UNION Q) = mu(P) + mu(Q) since DISJOINT *) + SUBGOAL_THEN `DISJOINT P (Q:A->bool)` ASSUME_TAC THENL + [REWRITE_TAC[DISJOINT; EXTENSION; IN_INTER; NOT_IN_EMPTY] THEN + ASM SET_TAC[]; + ALL_TAC] THEN + SUBGOAL_THEN `(mu:(A->bool)->real)(P UNION Q) = mu P + mu Q` + ASSUME_TAC THENL + [MATCH_MP_TAC SIGNED_MEASURE_FINITELY_ADDITIVE THEN + ASM_MESON_TAC[positive_set]; + ALL_TAC] THEN + (* mu(P UNION Q) = s + mu(Q) > s, but mu(P UNION Q) <= s *) + SUBGOAL_THEN `(mu:(A->bool)->real)(P UNION Q) <= s` MP_TAC THENL + [FIRST_X_ASSUM(MATCH_MP_TAC o check(fun th -> + can (find_term (fun t -> is_var t && fst(dest_var t) = "s")) (concl th))) THEN + ASM_REWRITE_TAC[]; + UNDISCH_TAC `(mu:(A->bool)->real)(P UNION Q:A->bool) = mu P + mu Q` THEN + UNDISCH_TAC `(mu:(A->bool)->real)(P:A->bool) = s` THEN + UNDISCH_TAC `&0 < (mu:(A->bool)->real)(Q:A->bool)` THEN + REAL_ARITH_TAC]; + (* DISJOINT P N *) + REWRITE_TAC[DISJOINT] THEN SET_TAC[]; + (* P UNION N = carrier *) + SUBGOAL_THEN `(P:A->bool) SUBSET prob_carrier p` MP_TAC THENL + [ASM_MESON_TAC[PROB_EVENT_SUBSET]; SET_TAC[]]] + );; + +(* ---------------------------------------------------------------------- *) +(* Phase 4: Jordan decomposition and absolute continuity *) +(* ---------------------------------------------------------------------- *) + +(* Hahn positive set: a canonical choice of P from Hahn decomposition *) +let hahn_pos_set = new_definition + `hahn_pos_set (p:A prob_space) (mu:(A->bool)->real) = + @P. positive_set p mu P /\ + negative_set p mu (prob_carrier p DIFF P) /\ + P SUBSET prob_carrier p`;; + +let HAHN_POS_SET_WORKS = prove + (`!p:A prob_space mu. signed_measure p mu + ==> positive_set p mu (hahn_pos_set p mu) /\ + negative_set p mu (prob_carrier p DIFF hahn_pos_set p mu) /\ + hahn_pos_set p mu SUBSET prob_carrier p`, + GEN_TAC THEN GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[hahn_pos_set] THEN + CONV_TAC SELECT_CONV THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_DECOMPOSITION) THEN + ASM_REWRITE_TAC[] THEN + DISCH_THEN(X_CHOOSE_THEN `P:A->bool` + (X_CHOOSE_THEN `N:A->bool` STRIP_ASSUME_TAC)) THEN + EXISTS_TAC `P:A->bool` THEN ASM_REWRITE_TAC[] THEN CONJ_TAC THENL + [SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF P = N:A->bool` + SUBST1_TAC THENL + [ASM SET_TAC[]; ASM_REWRITE_TAC[]]; + ASM_MESON_TAC[positive_set; PROB_EVENT_SUBSET]]);; + +(* Jordan decomposition: positive and negative variation *) +let jordan_pos = new_definition + `jordan_pos (p:A prob_space) (mu:(A->bool)->real) (A:A->bool) = + mu(A INTER hahn_pos_set p mu)`;; + +let jordan_neg = new_definition + `jordan_neg (p:A prob_space) (mu:(A->bool)->real) (A:A->bool) = + --(mu(A INTER (prob_carrier p DIFF hahn_pos_set p mu)))`;; + +let JORDAN_POS_NONNEG = prove + (`!p:A prob_space mu A. + signed_measure p mu /\ A IN prob_events p + ==> &0 <= jordan_pos p mu A`, + REPEAT STRIP_TAC THEN REWRITE_TAC[jordan_pos] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_POS_SET_WORKS) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[positive_set] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_SIMP_TAC[PROB_INTER_IN_EVENTS] THEN SET_TAC[]);; + +let JORDAN_NEG_NONNEG = prove + (`!p:A prob_space mu A. + signed_measure p mu /\ A IN prob_events p + ==> &0 <= jordan_neg p mu A`, + REPEAT STRIP_TAC THEN REWRITE_TAC[jordan_neg] THEN + REWRITE_TAC[REAL_ARITH `&0 <= --x <=> x <= &0`] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_POS_SET_WORKS) THEN + ASM_REWRITE_TAC[] THEN + REWRITE_TAC[negative_set] THEN STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + ASM_SIMP_TAC[PROB_INTER_IN_EVENTS; PROB_COMPL_IN_EVENTS] THEN + SET_TAC[]);; + +let JORDAN_DECOMPOSITION = prove + (`!p:A prob_space mu A. + signed_measure p mu /\ A IN prob_events p + ==> mu A = jordan_pos p mu A - jordan_neg p mu A`, + REPEAT STRIP_TAC THEN + REWRITE_TAC[jordan_pos; jordan_neg; REAL_SUB_RNEG] THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_POS_SET_WORKS) THEN + ASM_REWRITE_TAC[] THEN + ABBREV_TAC `P = hahn_pos_set (p:A prob_space) mu` THEN + STRIP_TAC THEN + SUBGOAL_THEN `(P:A->bool) IN prob_events p` ASSUME_TAC THENL + [ASM_MESON_TAC[positive_set]; ALL_TAC] THEN + SUBGOAL_THEN `prob_carrier (p:A prob_space) DIFF P IN prob_events p` + ASSUME_TAC THENL + [ASM_MESON_TAC[negative_set]; ALL_TAC] THEN + SUBGOAL_THEN `(A:A->bool) = (A INTER P) UNION (A INTER (prob_carrier p DIFF P))` + (fun th -> CONV_TAC(LAND_CONV(ONCE_REWRITE_CONV[th]))) THENL + [SUBGOAL_THEN `(A:A->bool) SUBSET prob_carrier p` MP_TAC THENL + [ASM_MESON_TAC[PROB_EVENT_SUBSET]; SET_TAC[]]; + ALL_TAC] THEN + MATCH_MP_TAC(ISPECL [`p:A prob_space`] SIGNED_MEASURE_FINITELY_ADDITIVE) THEN + ASM_REWRITE_TAC[] THEN REPEAT CONJ_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + REWRITE_TAC[DISJOINT] THEN SET_TAC[]]);; + +(* Absolute continuity *) +let absolutely_continuous = new_definition + `absolutely_continuous (p:A prob_space) (mu:(A->bool)->real) <=> + signed_measure p mu /\ + (!A. A IN prob_events p /\ prob p A = &0 ==> mu A = &0)`;; + +let ABSOLUTELY_CONTINUOUS_SUBSET = prove + (`!p:A prob_space mu A. + absolutely_continuous p mu /\ A IN prob_events p /\ prob p A = &0 + ==> !B. B IN prob_events p /\ B SUBSET A ==> mu B = &0`, + REWRITE_TAC[absolutely_continuous] THEN REPEAT STRIP_TAC THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN ASM_REWRITE_TAC[] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) B` MP_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) B <= prob p A` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[]; ALL_TAC] THEN + UNDISCH_TAC `prob (p:A prob_space) A = &0` THEN REAL_ARITH_TAC);; + +let ABSOLUTELY_CONTINUOUS_JORDAN = prove + (`!p:A prob_space mu A. + absolutely_continuous p mu /\ A IN prob_events p /\ prob p A = &0 + ==> jordan_pos p mu A = &0 /\ jordan_neg p mu A = &0`, + REWRITE_TAC[absolutely_continuous] THEN REPEAT STRIP_TAC THENL + [REWRITE_TAC[jordan_pos] THEN + SUBGOAL_THEN `(mu:(A->bool)->real)(A INTER hahn_pos_set p mu) = &0` + (fun th -> REWRITE_TAC[th]) THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_POS_SET_WORKS) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN `(A:A->bool) INTER hahn_pos_set p mu IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_MESON_TAC[positive_set]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) (A INTER hahn_pos_set p mu)` + MP_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) (A INTER hahn_pos_set p mu) <= prob p A` + MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `prob (p:A prob_space) A = &0` THEN REAL_ARITH_TAC; + REWRITE_TAC[jordan_neg] THEN + REWRITE_TAC[REAL_ARITH `--x = &0 <=> x = &0`] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + MP_TAC(ISPECL [`p:A prob_space`; `mu:(A->bool)->real`] + HAHN_POS_SET_WORKS) THEN ASM_REWRITE_TAC[] THEN STRIP_TAC THEN + SUBGOAL_THEN + `(A:A->bool) INTER (prob_carrier p DIFF hahn_pos_set p mu) + IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_MESON_TAC[negative_set]; ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN + `&0 <= prob (p:A prob_space) + (A INTER (prob_carrier p DIFF hahn_pos_set p mu))` MP_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + SUBGOAL_THEN + `prob (p:A prob_space) + (A INTER (prob_carrier p DIFF hahn_pos_set p mu)) <= prob p A` + MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `prob (p:A prob_space) A = &0` THEN REAL_ARITH_TAC]);; + +(* ---------------------------------------------------------------------- *) +(* Phase 5: Jordan variations as signed measures + absolute continuity *) +(* ---------------------------------------------------------------------- *) + +let JORDAN_POS_SIGNED_MEASURE = prove + (`!p:A prob_space mu. signed_measure p mu + ==> signed_measure p (jordan_pos p mu)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[signed_measure; jordan_pos] THEN + CONJ_TAC THENL + [SUBGOAL_THEN `{} INTER hahn_pos_set (p:A prob_space) mu = {}:A->bool` + SUBST1_TAC THENL [SET_TAC[]; ALL_TAC] THEN + ASM_MESON_TAC[signed_measure]; + ALL_TAC] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN + ABBREV_TAC `H = hahn_pos_set (p:A prob_space) mu` THEN + SUBGOAL_THEN `H:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "H" THEN ASM_MESON_TAC[HAHN_POS_SET_WORKS; positive_set]; + ALL_TAC] THEN + SUBGOAL_THEN `UNIONS {(A:num->A->bool) n | n IN (:num)} INTER H = + UNIONS {A n INTER H | n IN (:num)}:A->bool` SUBST1_TAC THENL + [REWRITE_TAC[UNIONS_GSPEC; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN + SET_TAC[]; + ALL_TAC] THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o SPEC `\n:num. (A:num->A->bool) n INTER H`)) THEN + REWRITE_TAC[] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`i:num`; `j:num`]) THEN + ASM_REWRITE_TAC[DISJOINT] THEN SET_TAC[]]; + REWRITE_TAC[]]);; + +let JORDAN_NEG_SIGNED_MEASURE = prove + (`!p:A prob_space mu. signed_measure p mu + ==> signed_measure p (jordan_neg p mu)`, + REPEAT GEN_TAC THEN DISCH_TAC THEN + REWRITE_TAC[signed_measure; jordan_neg] THEN + CONJ_TAC THENL + [REWRITE_TAC[INTER_EMPTY; REAL_NEG_0] THEN + SUBGOAL_THEN `(mu:(A->bool)->real) {} = &0` SUBST1_TAC THENL + [ASM_MESON_TAC[signed_measure]; REWRITE_TAC[REAL_NEG_0]]; + ALL_TAC] THEN + X_GEN_TAC `A:num->A->bool` THEN STRIP_TAC THEN + ABBREV_TAC `N = prob_carrier (p:A prob_space) DIFF hahn_pos_set p mu` THEN + SUBGOAL_THEN `N:A->bool IN prob_events p` ASSUME_TAC THENL + [EXPAND_TAC "N" THEN ASM_MESON_TAC[HAHN_POS_SET_WORKS; negative_set]; + ALL_TAC] THEN + SUBGOAL_THEN `UNIONS {(A:num->A->bool) n | n IN (:num)} INTER N = + UNIONS {A n INTER N | n IN (:num)}:A->bool` SUBST1_TAC THENL + [REWRITE_TAC[UNIONS_GSPEC; IN_ELIM_THM; IN_INTER; IN_UNIV] THEN + SET_TAC[]; + ALL_TAC] THEN + REWRITE_TAC[real_sums; SUM_NEG] THEN + MATCH_MP_TAC REALLIM_NEG THEN + REWRITE_TAC[GSYM real_sums] THEN + FIRST_ASSUM(MP_TAC o GEN_REWRITE_RULE I [signed_measure]) THEN + DISCH_THEN(CONJUNCTS_THEN2 ASSUME_TAC + (MP_TAC o SPEC `\n:num. (A:num->A->bool) n INTER N`)) THEN + REWRITE_TAC[] THEN + ANTS_TAC THENL + [CONJ_TAC THENL + [GEN_TAC THEN MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN ASM_REWRITE_TAC[]; + REPEAT GEN_TAC THEN DISCH_TAC THEN + FIRST_X_ASSUM(MP_TAC o SPECL [`i:num`; `j:num`]) THEN + ASM_REWRITE_TAC[DISJOINT] THEN SET_TAC[]]; + REWRITE_TAC[]]);; + +let JORDAN_POS_ABSOLUTELY_CONTINUOUS = prove + (`!p:A prob_space mu. + absolutely_continuous p mu + ==> absolutely_continuous p (jordan_pos p mu)`, + REWRITE_TAC[absolutely_continuous] THEN REPEAT STRIP_TAC THENL + [ASM_MESON_TAC[JORDAN_POS_SIGNED_MEASURE]; + REWRITE_TAC[jordan_pos] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + SUBGOAL_THEN `(A:A->bool) INTER hahn_pos_set p mu IN prob_events p` + ASSUME_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_MESON_TAC[HAHN_POS_SET_WORKS; positive_set]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) + (A INTER hahn_pos_set p mu)` MP_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) (A INTER hahn_pos_set p mu) + <= prob p A` MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `prob (p:A prob_space) A = &0` THEN REAL_ARITH_TAC]);; + +let JORDAN_NEG_ABSOLUTELY_CONTINUOUS = prove + (`!p:A prob_space mu. + absolutely_continuous p mu + ==> absolutely_continuous p (jordan_neg p mu)`, + REWRITE_TAC[absolutely_continuous] THEN REPEAT STRIP_TAC THENL + [ASM_MESON_TAC[JORDAN_NEG_SIGNED_MEASURE]; + REWRITE_TAC[jordan_neg; REAL_ARITH `--x = &0 <=> x = &0`] THEN + FIRST_X_ASSUM MATCH_MP_TAC THEN + SUBGOAL_THEN `(A:A->bool) INTER (prob_carrier p DIFF hahn_pos_set p mu) + IN prob_events p` ASSUME_TAC THENL + [MATCH_MP_TAC PROB_INTER_IN_EVENTS THEN + ASM_MESON_TAC[HAHN_POS_SET_WORKS; negative_set]; + ALL_TAC] THEN + CONJ_TAC THENL [ASM_REWRITE_TAC[]; ALL_TAC] THEN + SUBGOAL_THEN `&0 <= prob (p:A prob_space) + (A INTER (prob_carrier p DIFF hahn_pos_set p mu))` MP_TAC THENL + [ASM_MESON_TAC[PROB_POSITIVE]; ALL_TAC] THEN + SUBGOAL_THEN `prob (p:A prob_space) + (A INTER (prob_carrier p DIFF hahn_pos_set p mu)) <= prob p A` + MP_TAC THENL + [MATCH_MP_TAC PROB_MONO THEN ASM_REWRITE_TAC[] THEN SET_TAC[]; + ALL_TAC] THEN + UNDISCH_TAC `prob (p:A prob_space) A = &0` THEN REAL_ARITH_TAC]);; diff --git a/calc_int.ml b/calc_int.ml index a8213105..03d0ee81 100644 --- a/calc_int.ml +++ b/calc_int.ml @@ -56,7 +56,7 @@ let term_of_rat = fun x -> let p,q = numdom x in let ptm = mk_realintconst p in - if q = num_1 then ptm + if q =/ num_1 then ptm else mk_comb(mk_comb(div_tm,ptm),mk_realintconst q);; (* ------------------------------------------------------------------------- *) diff --git a/calc_rat.ml b/calc_rat.ml index a7a80921..ef637baa 100644 --- a/calc_rat.ml +++ b/calc_rat.ml @@ -319,7 +319,7 @@ let REAL_RAT_MUL_CONV = and x2n = dest_realintconst x2' and y2n = dest_realintconst y2' in let d1n = gcd_num x1n y2n and d2n = gcd_num x2n y1n in - if d1n = num_1 && d2n = num_1 then + if d1n =/ num_1 && d2n =/ num_1 then let th0 = INST [x1',x1; y1',y1; x2',x2; y2',y2] pth_nocancel in let th1 = BINOP_CONV REAL_INT_MUL_CONV (rand(concl th0)) in TRANS th0 th1 diff --git a/holtest.mk b/holtest.mk index eb81ac56..2cc41e33 100644 --- a/holtest.mk +++ b/holtest.mk @@ -67,6 +67,7 @@ STANDALONE_EXAMPLES:=\ Examples/sos \ Examples/ste \ Examples/sylvester_gallai \ + Library/symmetric_group \ Examples/vitali \ Library/wo \ Library/words \ diff --git a/int.ml b/int.ml index ba8f86dc..c6649885 100755 --- a/int.ml +++ b/int.ml @@ -264,7 +264,7 @@ let is_intconst tm = match tm with Comb(Const("int_of_num",_),n) -> is_numeral n | Comb(Const("int_neg",_),Comb(Const("int_of_num",_),n)) -> - is_numeral n && not(dest_numeral n = num_0) + is_numeral n && not(dest_numeral n =/ num_0) | _ -> false;; let dest_intconst tm = diff --git a/iterate.ml b/iterate.ml index 67a502e6..98f19bd3 100644 --- a/iterate.ml +++ b/iterate.ml @@ -1960,7 +1960,7 @@ let EXPAND_NSUM_CONV = let th1 = INST [ftm,f_tm; mtm,m_tm; ntm,n_tm] pth_0 in MP th1 (EQT_ELIM(NUM_LT_CONV(lhand(concl th1)))) else if n =/ m then CONV_RULE (RAND_CONV(TRY_CONV BETA_CONV)) - (INST [ftm,f_tm; mtm,m_tm] pth_1) + (INST [ftm,f_tm; mtm,m_tm] pth_1) else let th1 = INST [ftm,f_tm; mtm,m_tm; ntm,n_tm] pth_2 in let th2 = MP th1 (EQT_ELIM(NUM_LE_CONV(lhand(concl th1)))) in @@ -2808,7 +2808,7 @@ let EXPAND_SUM_CONV = let th1 = INST [ftm,f_tm; mtm,m_tm; ntm,n_tm] pth_0 in MP th1 (EQT_ELIM(NUM_LT_CONV(lhand(concl th1)))) else if n =/ m then CONV_RULE (RAND_CONV(TRY_CONV BETA_CONV)) - (INST [ftm,f_tm; mtm,m_tm] pth_1) + (INST [ftm,f_tm; mtm,m_tm] pth_1) else let th1 = INST [ftm,f_tm; mtm,m_tm; ntm,n_tm] pth_2 in let th2 = MP th1 (EQT_ELIM(NUM_LE_CONV(lhand(concl th1)))) in diff --git a/printer.ml b/printer.ml index 32a236fa..021ee52b 100755 --- a/printer.ml +++ b/printer.ml @@ -456,7 +456,7 @@ let pp_print_term,pp_print_colored_term = let s_den = implode(tl(explode(string_of_num (n_den +/ (mod_num n_num n_den))))) in pp_print_string fmt - ("#"^s_num^(if n_den = num 1 then "" else ".")^s_den) + ("#"^s_num^(if n_den =/ num 1 then "" else ".")^s_den) with Failure _ -> try if s <> "_MATCH" || length args <> 2 then failwith "" else let cls = dest_clauses(hd(tl args)) in diff --git a/sets.ml b/sets.ml index f2d1994d..2b544388 100644 --- a/sets.ml +++ b/sets.ml @@ -2057,6 +2057,24 @@ let CARD_SING = prove (`!a:A. CARD {a} = 1`, SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; NOT_IN_EMPTY; ARITH]);; +let CARD_LE_2 = prove + (`!a (b:A). CARD{a,b} <= 2`, + SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; + IN_INSERT; NOT_IN_EMPTY] THEN + REPEAT(GEN_TAC ORELSE COND_CASES_TAC) THEN ARITH_TAC);; + +let CARD_LE_3 = prove + (`!a b (c:A). CARD{a,b,c} <= 3`, + SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; + IN_INSERT; NOT_IN_EMPTY] THEN + REPEAT(GEN_TAC ORELSE COND_CASES_TAC) THEN ARITH_TAC);; + +let CARD_LE_4 = prove + (`!a b c (d:A). CARD{a,b,c,d} <= 4`, + SIMP_TAC[CARD_CLAUSES; FINITE_INSERT; FINITE_EMPTY; + IN_INSERT; NOT_IN_EMPTY] THEN + REPEAT(GEN_TAC ORELSE COND_CASES_TAC) THEN ARITH_TAC);; + (* ------------------------------------------------------------------------- *) (* A stronger still form of induction where we get to choose the element. *) (* ------------------------------------------------------------------------- *)