probabilityScript.sml

1(* ------------------------------------------------------------------------- *)
2(* Probability Theory                                                        *)
3(* Authors: Tarek Mhamdi, Osman Hasan, Sofiene Tahar                         *)
4(* HVG Group, Concordia University, Montreal                                 *)
5(*                                                                           *)
6(* Further enriched by Chun Tian (2019 - 2025)                               *)
7(* ------------------------------------------------------------------------- *)
8(* Originally based on the work of Joe Hurd [7] and Aaron Coble [8]          *)
9(* Cambridge University.                                                     *)
10(* ========================================================================= *)
11Theory probability
12Ancestors
13  pair combin option prim_rec arithmetic pred_set topology real
14  iterate seq transc real_sigma real_topology metric extreal
15  sigma_algebra measure real_borel borel lebesgue martingale
16Libs
17  pred_setLib hurdUtils numLib realLib
18
19
20(* "... This task would have been a rather hopeless one before the
21    introduction of Lebesgue's theories of measure and integration. ...
22    But if probability theory was to be based on the above analogies, it
23    still was necessary to make the theories of measure and integration
24    independent of the geometric elements which were in the foreground
25    with Lebesgue. ...
26
27    I wish to call attention to those points of the present exposition
28    which are outside the above-mentioned range of ideas familiar to
29    the specialist. They are the following: Probability distributions
30    in infinite-dimensional spaces (Chapter III, 4); differentiation
31    and integration of mathematical expectations with respect to a
32    parameter (Chapter IV, 5); and especially the theory of conditional
33    probabilities and conditional expectations (Chapter V). ..."
34
35  -- A. N. Kolmogorov, "Foundations of the Theory of Probability." [1] *)
36
37val set_ss = std_ss ++ PRED_SET_ss;
38
39val _ = hide "S";
40val _ = hide "W";
41
42val _ = intLib.deprecate_int ();
43val _ = ratLib.deprecate_rat ();
44
45(* ------------------------------------------------------------------------- *)
46(* Basic probability theory definitions.                                     *)
47(* ------------------------------------------------------------------------- *)
48
49Type p_space = “:'a m_space”
50Type events  = “:'a set set”
51
52Definition p_space_def:   p_space = m_space
53End
54
55Definition events_def:   events = measurable_sets
56End
57
58Definition prob_def:   prob = measure
59End
60
61Definition prob_space_def:
62    prob_space p <=> measure_space p /\ (measure p (m_space p) = 1)
63End
64
65Definition probably_def:
66    probably p e <=> e IN events p /\ (prob p e = 1)
67End
68
69Definition possibly_def:
70    possibly p e <=> e IN events p /\ prob p e <> 0
71End
72
73Definition random_variable_def :
74    random_variable X p s <=> X IN measurable (p_space p, events p) s
75End
76
77(* `real_random_variable` is dedicated to Borel-measurable functions
78
79    NOTE: ‘x IN p_space p’ was wrongly removed in k14 release.
80 *)
81Definition real_random_variable_def :
82    real_random_variable X p <=>
83         random_variable X p Borel /\
84         !x. x IN p_space p ==> X x <> NegInf /\ X x <> PosInf
85End
86
87(* A (probability) distribution is a probability measure on `(p_space p,events p)`,
88
89   cf. lebesgueTheory.distr_def, of type ``:'a m_space``
90 *)
91Definition distribution_def:   (* was: pmf in [10] *)
92    distribution (p :'a p_space) X = (\s. prob p ((PREIMAGE X s) INTER p_space p))
93End
94
95(* c.f. [2, p.36], [4, p.206], [6, p.256], etc. *)
96Definition distribution_function_def:
97    distribution_function p X = (\x. prob p ({w | X w <= x} INTER p_space p))
98End
99
100(* NOTE (fixes after k14): changed ‘i IN J’ to ‘j IN J’ *)
101Definition identical_distribution_def :
102    identical_distribution p X E (J :'index set) =
103      !i j s. s IN subsets E /\ i IN J /\ j IN J ==>
104             (distribution p (X i) s = distribution p (X j) s)
105End
106
107Definition joint_distribution_def :
108    joint_distribution (p :'a p_space) X Y =
109      (\a. prob p (PREIMAGE (\x. (X x,Y x)) a INTER p_space p))
110End
111
112Definition joint_distribution3_def :
113    joint_distribution3 (p :'a p_space) X Y Z =
114      (\a. prob p (PREIMAGE (\x. (X x,Y x,Z x)) a INTER p_space p))
115End
116
117Definition conditional_distribution_def:
118    conditional_distribution (p :'a p_space) X Y a b =
119      joint_distribution p X Y (a CROSS b) / distribution p Y b
120End
121
122Definition expectation_def :
123    expectation = lebesgue$integral
124End
125
126(* not used *)
127Definition conditional_expectation_def:
128    conditional_expectation p X s =
129        @f. real_random_variable f p /\
130            !g. g IN s ==>
131               (expectation p (\x. f x * indicator_fn g x) =
132                expectation p (\x. X x * indicator_fn g x))
133End
134
135(* not used *)
136Definition conditional_prob_def:
137    conditional_prob p e1 e2 =
138    conditional_expectation p (indicator_fn e1) e2
139End
140
141Definition cond_prob_def:
142    cond_prob p e1 e2 = (prob p (e1 INTER e2)) / (prob p e2)
143End
144
145(* not used *)
146Definition rv_conditional_expectation_def:
147    rv_conditional_expectation (p :'a p_space) s X Y =
148       conditional_expectation p X (IMAGE (\a. (PREIMAGE Y a) INTER p_space p) (subsets s))
149End
150
151(* this only works in discrete probability spaces *)
152Definition uniform_distribution_def:
153    uniform_distribution (s :'a algebra) =
154      (\(a :'a set). (&CARD a / &CARD (space s)) :extreal)
155End
156
157(* ------------------------------------------------------------------------- *)
158(*  Basic probability theorems                                               *)
159(* ------------------------------------------------------------------------- *)
160
161Theorem PROB_SPACE_REDUCE :
162    !p. (p_space p,events p,prob p) = p
163Proof
164    RW_TAC std_ss [p_space_def, events_def, prob_def, MEASURE_SPACE_REDUCE]
165QED
166
167Theorem POSITIVE_PROB:
168    !p. positive p <=> (prob p {} = 0) /\ !s. s IN events p ==> 0 <= prob p s
169Proof
170    RW_TAC std_ss [positive_def, prob_def, events_def]
171QED
172
173Theorem INCREASING_PROB:
174    !p. increasing p <=> !s t. s IN events p /\ t IN events p /\ s SUBSET t ==>
175        prob p s <= prob p t
176Proof
177    RW_TAC std_ss [increasing_def, prob_def, events_def]
178QED
179
180Theorem ADDITIVE_PROB:
181    !p. additive p <=>
182        !s t. s IN events p /\ t IN events p /\ DISJOINT s t /\ s UNION t IN events p ==>
183              (prob p (s UNION t) = prob p s + prob p t)
184Proof
185    RW_TAC std_ss [additive_def, prob_def, events_def]
186QED
187
188Theorem COUNTABLY_ADDITIVE_PROB:
189    !p. countably_additive p <=>
190        !f. f IN (UNIV -> events p) /\ (!m n. m <> n ==> DISJOINT (f m) (f n)) /\
191            BIGUNION (IMAGE f UNIV) IN events p ==>
192           (prob p (BIGUNION (IMAGE f UNIV)) = suminf (prob p o f))
193Proof
194    RW_TAC std_ss [countably_additive_def, prob_def, events_def]
195QED
196
197Theorem PROB_SPACE:
198    !p. prob_space p <=> sigma_algebra (p_space p, events p) /\ positive p /\
199                         countably_additive p /\ (prob p (p_space p) = 1)
200Proof
201    RW_TAC std_ss [prob_space_def, prob_def, events_def, measure_space_def, p_space_def]
202 >> PROVE_TAC []
203QED
204
205Theorem EVENTS_SIGMA_ALGEBRA:   !p. prob_space p ==> sigma_algebra (p_space p, events p)
206Proof
207    RW_TAC std_ss [PROB_SPACE]
208QED
209
210Theorem EVENTS_ALGEBRA:   !p. prob_space p ==> algebra (p_space p, events p)
211Proof
212    PROVE_TAC [SIGMA_ALGEBRA_ALGEBRA, EVENTS_SIGMA_ALGEBRA]
213QED
214
215Theorem PROB_EMPTY:   !p. prob_space p ==> (prob p {} = 0)
216Proof
217    PROVE_TAC [PROB_SPACE, POSITIVE_PROB]
218QED
219
220Theorem PROB_UNIV:   !p. prob_space p ==> (prob p (p_space p) = 1)
221Proof
222    RW_TAC std_ss [PROB_SPACE]
223QED
224
225Theorem PROB_SPACE_NOT_EMPTY :
226    !p. prob_space p ==> p_space p <> {}
227Proof
228    METIS_TAC [PROB_EMPTY, PROB_UNIV, ne_01]
229QED
230
231Theorem PROB_SPACE_POSITIVE:   !p. prob_space p ==> positive p
232Proof
233    RW_TAC std_ss [PROB_SPACE]
234QED
235
236Theorem PROB_SPACE_COUNTABLY_ADDITIVE:   !p. prob_space p ==> countably_additive p
237Proof
238    RW_TAC std_ss [PROB_SPACE]
239QED
240
241Theorem PROB_SPACE_ADDITIVE:   !p. prob_space p ==> additive p
242Proof
243    rpt STRIP_TAC
244 >> MATCH_MP_TAC (REWRITE_RULE [premeasure_def] ALGEBRA_PREMEASURE_ADDITIVE)
245 >> IMP_RES_TAC EVENTS_ALGEBRA
246 >> fs [events_def, p_space_def]
247 >> PROVE_TAC [PROB_SPACE_COUNTABLY_ADDITIVE, PROB_SPACE_POSITIVE]
248QED
249
250Theorem PROB_SPACE_INCREASING:
251    !p. prob_space p ==> increasing p
252Proof
253    PROVE_TAC [ADDITIVE_INCREASING, EVENTS_ALGEBRA, PROB_SPACE_ADDITIVE,
254               PROB_SPACE_POSITIVE, events_def, p_space_def]
255QED
256
257Theorem PROB_POSITIVE:
258    !p s. prob_space p /\ s IN events p ==> 0 <= prob p s
259Proof
260    PROVE_TAC [POSITIVE_PROB, PROB_SPACE_POSITIVE]
261QED
262
263Theorem PROB_SPACE_SUBSET_PSPACE:
264    !p s. prob_space p /\ s IN events p ==> s SUBSET p_space p
265Proof
266    RW_TAC std_ss [prob_space_def, events_def, p_space_def, MEASURE_SPACE_SUBSET_MSPACE]
267QED
268
269Theorem PROB_SPACE_IN_PSPACE :
270    !p E. prob_space p /\ E IN events p ==> !x. x IN E ==> x IN p_space p
271Proof
272    RW_TAC std_ss [prob_space_def, events_def, p_space_def]
273 >> irule MEASURE_SPACE_IN_MSPACE >> art []
274 >> Q.EXISTS_TAC `E` >> art []
275QED
276
277(* Thus TONELLI and FUBINI theorems are applicable *)
278Theorem PROB_SPACE_SIGMA_FINITE :
279    !p. prob_space p ==> sigma_finite p
280Proof
281    RW_TAC std_ss [prob_space_def]
282 >> MATCH_MP_TAC FINITE_IMP_SIGMA_FINITE
283 >> rw [extreal_of_num_def, extreal_not_infty]
284QED
285
286Theorem PROB_UNDER_UNIV:
287    !p s. prob_space p /\ s IN events p ==> (prob p (s INTER p_space p) = prob p s)
288Proof
289    RW_TAC std_ss [prob_space_def, prob_def, events_def, p_space_def]
290 >> `s SUBSET m_space p` by PROVE_TAC [MEASURE_SPACE_SUBSET_MSPACE]
291 >> `s INTER m_space p = s` by PROVE_TAC [INTER_SUBSET_EQN] >> art []
292QED
293
294Theorem PROB_INCREASING:
295    !p s t. prob_space p /\ s IN events p /\ t IN events p /\ s SUBSET t ==>
296            prob p s <= prob p t
297Proof
298    PROVE_TAC [INCREASING_PROB, PROB_SPACE_INCREASING]
299QED
300
301Theorem PROB_ADDITIVE:
302    !p s t u. prob_space p /\ s IN events p /\ t IN events p /\
303              DISJOINT s t /\ (u = s UNION t) ==>
304             (prob p u = prob p s + prob p t)
305Proof
306    rpt STRIP_TAC
307 >> IMP_RES_TAC PROB_SPACE_ADDITIVE >> art []
308 >> POP_ASSUM (MATCH_MP_TAC o (REWRITE_RULE [ADDITIVE_PROB]))
309 >> art []
310 >> IMP_RES_TAC EVENTS_ALGEBRA
311 >> PROVE_TAC [ALGEBRA_UNION, subsets_def]
312QED
313
314Theorem PROB_COUNTABLY_ADDITIVE:
315    !p s f. prob_space p /\ f IN (UNIV -> events p) /\
316           (!m n. m <> n ==> DISJOINT (f m) (f n)) /\ (s = BIGUNION (IMAGE f UNIV)) ==>
317           (prob p s = suminf (prob p o f))
318Proof
319    RW_TAC std_ss []
320 >> Suff `BIGUNION (IMAGE f UNIV) IN events p`
321 >- PROVE_TAC [COUNTABLY_ADDITIVE_PROB, PROB_SPACE_COUNTABLY_ADDITIVE]
322 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
323     Q.SPECL [`(p_space p, events p)`,`f`]) SIGMA_ALGEBRA_ENUM
324 >> PROVE_TAC [EVENTS_SIGMA_ALGEBRA]
325QED
326
327Theorem PROB_FINITE:
328    !p s. prob_space p /\ s IN events p ==> (prob p s <> NegInf /\ prob p s <> PosInf)
329Proof
330    RW_TAC std_ss [prob_space_def, prob_def, events_def, positive_not_infty, MEASURE_SPACE_POSITIVE]
331 >> RW_TAC std_ss [GSYM le_infty,GSYM extreal_lt_def]
332 >> MATCH_MP_TAC let_trans
333 >> Q.EXISTS_TAC `measure p (m_space p)`
334 >> reverse (RW_TAC std_ss [])
335 >- METIS_TAC [num_not_infty,lt_infty]
336 >> METIS_TAC [MEASURE_SPACE_SUBSET_MSPACE, INCREASING, MEASURE_SPACE_INCREASING,
337               MEASURE_SPACE_MSPACE_MEASURABLE]
338QED
339
340Theorem PROB_LT_POSINF:
341    !p s. prob_space p /\ s IN events p ==> prob p s < PosInf
342Proof
343    rpt GEN_TAC
344 >> DISCH_THEN (STRIP_ASSUME_TAC o (MATCH_MP PROB_FINITE))
345 >> art [GSYM lt_infty]
346QED
347
348Theorem PROB_COMPL:
349    !p s. prob_space p /\ s IN events p ==> (prob p (p_space p DIFF s) = 1 - prob p s)
350Proof
351    METIS_TAC [MEASURE_SPACE_FINITE_DIFF, PROB_FINITE,
352               prob_space_def, events_def, prob_def, p_space_def]
353QED
354
355Theorem PROB_DIFF_SUBSET:
356    !p s t.
357       prob_space p /\ s IN events p /\ t IN events p /\ (t SUBSET s) ==>
358       (prob p (s DIFF t) = prob p s - prob p t)
359Proof
360    rpt STRIP_TAC
361 >> `prob p t < PosInf` by PROVE_TAC [PROB_LT_POSINF]
362 >> fs [prob_space_def, prob_def, events_def]
363 >> MATCH_MP_TAC MEASURE_DIFF_SUBSET >> art []
364QED
365
366Theorem PSPACE:   !a b c. p_space (a, b, c) = a
367Proof
368    RW_TAC std_ss [p_space_def, m_space_def]
369QED
370
371Theorem EVENTS:   !a b c. events (a, b, c) = b
372Proof
373    RW_TAC std_ss [events_def, measurable_sets_def]
374QED
375
376Theorem PROB:   !a b c. prob (a, b, c) = c
377Proof
378    RW_TAC std_ss [prob_def, measure_def]
379QED
380
381Theorem EVENTS_INTER:
382    !p s t. prob_space p /\ s IN events p /\ t IN events p ==> s INTER t IN events p
383Proof
384  RW_TAC std_ss []
385  >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
386      Q.SPEC `(p_space p, events p)`) ALGEBRA_INTER
387  >> PROVE_TAC [PROB_SPACE, SIGMA_ALGEBRA_ALGEBRA]
388QED
389
390Theorem EVENTS_EMPTY:   !p. prob_space p ==> {} IN events p
391Proof
392  RW_TAC std_ss []
393  >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
394      Q.SPEC `(p_space p, events p)`) ALGEBRA_EMPTY
395  >> PROVE_TAC [SIGMA_ALGEBRA_ALGEBRA, PROB_SPACE]
396QED
397
398Theorem EVENTS_SPACE:   !p. prob_space p ==> (p_space p) IN events p
399Proof
400    RW_TAC std_ss []
401 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
402     Q.SPEC `(p_space p, events p)`) ALGEBRA_SPACE
403 >> PROVE_TAC [SIGMA_ALGEBRA_ALGEBRA, PROB_SPACE]
404QED
405
406Theorem EVENTS_UNION:
407    !p s t. prob_space p /\ s IN events p /\ t IN events p ==> s UNION t IN events p
408Proof
409    RW_TAC std_ss []
410 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
411     Q.SPEC `(p_space p, events p)`) ALGEBRA_UNION
412 >> PROVE_TAC [PROB_SPACE, SIGMA_ALGEBRA_ALGEBRA]
413QED
414
415Theorem INTER_PSPACE:   !p s. prob_space p /\ s IN events p ==> (p_space p INTER s = s)
416Proof
417    RW_TAC std_ss [PROB_SPACE, SIGMA_ALGEBRA, space_def, subsets_def, subset_class_def,
418                   SUBSET_DEF]
419 >> RW_TAC std_ss [Once EXTENSION, IN_INTER]
420 >> PROVE_TAC []
421QED
422
423(* `P` is usually a higher order term, `s` is a simple events, e.g. `p_space p` *)
424Theorem PROB_GSPEC:
425    !P p s. prob p {x | x IN s /\ P x} = prob p ({x | P x} INTER s)
426Proof
427    RW_TAC std_ss []
428 >> Suff `{x | x IN s /\ P x} = {x | P x} INTER s` >- METIS_TAC []
429 >> RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, IN_INTER]
430 >> METIS_TAC []
431QED
432
433Theorem EVENTS_DIFF:
434    !p s t. prob_space p /\ s IN events p /\ t IN events p ==> s DIFF t IN events p
435Proof
436    RW_TAC std_ss []
437 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
438     Q.SPEC `(p_space p, events p)`) ALGEBRA_DIFF
439 >> PROVE_TAC [PROB_SPACE, SIGMA_ALGEBRA_ALGEBRA]
440QED
441
442Theorem EVENTS_COMPL:   !p s. prob_space p /\ s IN events p ==> (p_space p) DIFF s IN events p
443Proof
444    RW_TAC std_ss []
445 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
446     Q.SPEC `(p_space p, events p)`) ALGEBRA_COMPL
447 >> PROVE_TAC [PROB_SPACE, SIGMA_ALGEBRA_ALGEBRA]
448QED
449
450Theorem EVENTS_BIGUNION :
451    !p f n. prob_space p /\ f IN (count n -> events p) ==>
452            BIGUNION (IMAGE f (count n)) IN events p
453Proof
454    RW_TAC std_ss [IN_FUNSET, IN_COUNT]
455 >> `BIGUNION (IMAGE f (count n)) =
456     BIGUNION (IMAGE (\m. (if m < n then f m else {})) UNIV)`
457      by (RW_TAC std_ss [EXTENSION,IN_BIGUNION_IMAGE, IN_COUNT, IN_UNIV] \\
458          METIS_TAC [NOT_IN_EMPTY])
459 >> POP_ORW
460 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
461     Q.SPECL [`(p_space p, events p)`,`(\m. if m < n then A m else {})`])
462       SIGMA_ALGEBRA_ENUM
463 >> RW_TAC std_ss [EVENTS_SIGMA_ALGEBRA]
464 >> RW_TAC std_ss [IN_FUNSET, IN_UNIV, DISJOINT_EMPTY]
465 >> METIS_TAC [EVENTS_EMPTY]
466QED
467
468Theorem EVENTS_COUNTABLE_UNION:
469    !p c. prob_space p /\ c SUBSET events p /\ countable c ==> BIGUNION c IN events p
470Proof
471    RW_TAC std_ss []
472 >> (MATCH_MP_TAC o REWRITE_RULE [subsets_def, space_def] o
473     Q.SPEC `(p_space p, events p)`) SIGMA_ALGEBRA_COUNTABLE_UNION
474 >> RW_TAC std_ss [EVENTS_SIGMA_ALGEBRA]
475QED
476
477Theorem EVENTS_BIGUNION_ENUM :
478    !p f. prob_space p /\ f IN (univ(:num) -> events p) ==>
479          BIGUNION (IMAGE f univ(:num)) IN events p
480Proof
481    rw [IN_FUNSET]
482 >> MATCH_MP_TAC EVENTS_COUNTABLE_UNION
483 >> rw [SUBSET_DEF] >> art []
484QED
485
486Theorem PROB_ZERO_UNION:
487    !p s t. prob_space p /\ s IN events p /\ t IN events p /\ (prob p t = 0) ==>
488           (prob p (s UNION t) = prob p s)
489Proof
490    RW_TAC std_ss []
491 >> Know `t DIFF s IN events p`
492 >- (MATCH_MP_TAC EVENTS_DIFF >> RW_TAC std_ss [])
493 >> STRIP_TAC
494 >> Know `prob p (t DIFF s) = 0`
495 >- (ONCE_REWRITE_TAC [GSYM le_antisym]
496     >> reverse CONJ_TAC >- PROVE_TAC [PROB_POSITIVE]
497     >> Q.PAT_X_ASSUM `prob p t = 0` (ONCE_REWRITE_TAC o wrap o SYM)
498     >> MATCH_MP_TAC PROB_INCREASING
499     >> RW_TAC std_ss [DIFF_SUBSET])
500 >> STRIP_TAC
501 >> Suff `prob p (s UNION t) = prob p s + prob p (t DIFF s)`
502 >- RW_TAC real_ss [add_rzero]
503 >> MATCH_MP_TAC PROB_ADDITIVE
504 >> RW_TAC std_ss [DISJOINT_DEF, DIFF_DEF, EXTENSION, IN_UNION, IN_DIFF, NOT_IN_EMPTY, IN_INTER]
505 >> PROVE_TAC []
506QED
507
508Theorem PROB_INTER_ZERO :
509    !p A B. prob_space p /\ A IN events p /\ B IN events p /\ (prob p B = 0) ==>
510           (prob p (A INTER B) = 0)
511Proof
512    RW_TAC std_ss []
513 >> `(A INTER B) SUBSET B` by RW_TAC std_ss [INTER_SUBSET]
514 >> `prob p (A INTER B) <= prob p B` by FULL_SIMP_TAC std_ss [PROB_INCREASING, EVENTS_INTER]
515 >> `0 <= prob p (A INTER B)` by FULL_SIMP_TAC std_ss [PROB_POSITIVE, EVENTS_INTER]
516 >> METIS_TAC [le_antisym]
517QED
518
519Theorem PROB_ZERO_INTER :
520    !p A B. prob_space p /\ A IN events p /\ B IN events p /\ (prob p A = 0) ==>
521           (prob p (A INTER B) = 0)
522Proof
523    RW_TAC std_ss [] >> (MP_TAC o Q.SPECL [`p`, `B`, `A`]) PROB_INTER_ZERO
524 >> RW_TAC std_ss [INTER_COMM]
525QED
526
527Theorem PROB_EQ_COMPL:
528    !p s t. prob_space p /\ s IN events p /\ t IN events p /\
529           (prob p (p_space p DIFF s) = prob p (p_space p DIFF t)) ==> (prob p s = prob p t)
530Proof
531    RW_TAC std_ss []
532 >> Know `1 - prob p s = 1 - prob p t`
533 >- (POP_ASSUM MP_TAC >> RW_TAC std_ss [PROB_COMPL])
534 >> `?r1 r2. (prob p t = Normal r1) /\ (prob p s = Normal r2)`
535     by METIS_TAC [extreal_cases,PROB_FINITE]
536 >> FULL_SIMP_TAC std_ss [extreal_of_num_def,extreal_sub_def,extreal_11]
537 >> REAL_ARITH_TAC
538QED
539
540Theorem PROB_ONE_INTER:
541    !p s t. prob_space p /\ s IN events p /\ t IN events p /\ (prob p t = 1) ==>
542           (prob p (s INTER t) = prob p s)
543Proof
544    RW_TAC std_ss []
545 >> MATCH_MP_TAC PROB_EQ_COMPL
546 >> RW_TAC std_ss [EVENTS_INTER]
547 >> Know `p_space p DIFF s INTER t = (p_space p DIFF s) UNION (p_space p DIFF t)`
548 >- (RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_UNION, IN_DIFF]
549     >> DECIDE_TAC)
550 >> RW_TAC std_ss [] >> POP_ASSUM (K ALL_TAC)
551 >> MATCH_MP_TAC PROB_ZERO_UNION
552 >> RW_TAC std_ss [PROB_COMPL, EVENTS_COMPL]
553 >> RW_TAC real_ss [extreal_of_num_def,extreal_sub_def]
554QED
555
556Theorem EVENTS_COUNTABLE_INTER:
557    !p c. prob_space p /\ c SUBSET events p /\ countable c /\ c <> {} ==>
558          BIGINTER c IN events p
559Proof
560    RW_TAC std_ss []
561 >> Know `BIGINTER c = p_space p DIFF (p_space p DIFF (BIGINTER c))`
562 >- (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_DIFF, LEFT_AND_OVER_OR, IN_BIGINTER]
563     >> FULL_SIMP_TAC std_ss [PROB_SPACE, SIGMA_ALGEBRA, subset_class_def,
564                              subsets_def, space_def, SUBSET_DEF]
565     >> EQ_TAC
566     >- (Know `(c = {}) \/ ?x t. (c = x INSERT t) /\ ~(x IN t)` >- PROVE_TAC [SET_CASES]
567         >> RW_TAC std_ss []
568         >> PROVE_TAC [IN_INSERT])
569     >> PROVE_TAC [])
570 >> Rewr'
571 >> MATCH_MP_TAC EVENTS_COMPL
572 >> Know `p_space p DIFF BIGINTER c = BIGUNION (IMAGE (\s. p_space p DIFF s) c)`
573 >- (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_DIFF, IN_BIGUNION, IN_IMAGE, IN_BIGINTER]
574     >> EQ_TAC
575     >- (RW_TAC std_ss [] >> Q.EXISTS_TAC `p_space p DIFF P`
576         >> RW_TAC std_ss [IN_DIFF] >> Q.EXISTS_TAC `P`
577         >> RW_TAC std_ss [])
578     >> RW_TAC std_ss []
579     >- FULL_SIMP_TAC std_ss [IN_DIFF]
580     >> Q.EXISTS_TAC `s'`
581     >> FULL_SIMP_TAC std_ss [IN_DIFF])
582 >> RW_TAC std_ss [] >> POP_ASSUM (K ALL_TAC)
583 >> MATCH_MP_TAC EVENTS_COUNTABLE_UNION
584 >> Q.PAT_X_ASSUM `c SUBSET events p` MP_TAC
585 >> RW_TAC std_ss [image_countable, SUBSET_DEF, IN_IMAGE]
586 >> PROVE_TAC [EVENTS_COMPL]
587QED
588
589Theorem EVENTS_BIGINTER_FN:
590    !p A J. prob_space p /\ (IMAGE A J) SUBSET events p /\ countable J /\ J <> {} ==>
591            BIGINTER (IMAGE A J) IN events p
592Proof
593    rpt STRIP_TAC
594 >> MATCH_MP_TAC EVENTS_COUNTABLE_INTER >> art []
595 >> CONJ_TAC
596 >- (MATCH_MP_TAC image_countable >> art [])
597 >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE, NOT_IN_EMPTY]
598 >> fs [GSYM MEMBER_NOT_EMPTY]
599 >> Q.EXISTS_TAC `x` >> art []
600QED
601
602Theorem ABS_PROB:   !p s. prob_space p /\ s IN events p ==> (abs (prob p s) = prob p s)
603Proof
604    RW_TAC std_ss [extreal_abs_def]
605 >> PROVE_TAC [PROB_POSITIVE,abs_refl]
606QED
607
608Theorem PROB_COMPL_LE1:
609    !p s r. prob_space p /\ s IN events p ==>
610           (prob p (p_space p DIFF s) <= r <=> 1 - r <= prob p s)
611Proof
612    RW_TAC std_ss [PROB_COMPL]
613 >> METIS_TAC [sub_le_switch2,PROB_FINITE,num_not_infty]
614QED
615
616Theorem PROB_LE_1:   !p s. prob_space p /\ s IN events p ==> prob p s <= 1
617Proof
618    RW_TAC std_ss []
619 >> Suff `0 <= 1 - prob p s` >- METIS_TAC [sub_zero_le,PROB_FINITE]
620 >> RW_TAC std_ss [GSYM PROB_COMPL]
621 >> RW_TAC std_ss [EVENTS_COMPL, PROB_POSITIVE]
622QED
623
624Theorem PROB_EQ_BIGUNION_IMAGE :
625    !p f g. prob_space p /\ f IN (UNIV -> events p) /\ g IN (UNIV -> events p) /\
626           (!m n. m <> n ==> DISJOINT (f m) (f n)) /\
627           (!m n. m <> n ==> DISJOINT (g m) (g n)) /\
628           (!n :num. prob p (f n) = prob p (g n)) ==>
629       (prob p (BIGUNION (IMAGE f UNIV)) = prob p (BIGUNION (IMAGE g UNIV)))
630Proof
631    RW_TAC std_ss []
632 >> Know `prob p (BIGUNION (IMAGE f UNIV)) = suminf (prob p o f)`
633 >- PROVE_TAC [PROB_COUNTABLY_ADDITIVE]
634 >> Know `prob p (BIGUNION (IMAGE g UNIV)) = suminf (prob p o g)`
635 >- PROVE_TAC [PROB_COUNTABLY_ADDITIVE]
636 >> METIS_TAC [o_DEF]
637QED
638
639Theorem ABS_1_MINUS_PROB:
640   !p s. prob_space p /\ s IN events p /\ ~(prob p s = 0) ==> abs (1 - prob p s) < 1
641Proof
642   RW_TAC std_ss []
643 >> Know `0 <= prob p s` >- PROVE_TAC [PROB_POSITIVE]
644 >> Know `prob p s <= 1` >- PROVE_TAC [PROB_LE_1]
645 >> `?r. prob p s = Normal r` by METIS_TAC [PROB_FINITE,extreal_cases]
646 >> FULL_SIMP_TAC std_ss [extreal_of_num_def,extreal_sub_def,extreal_abs_def,
647                          extreal_lt_eq,extreal_le_def,extreal_11]
648 >> RW_TAC std_ss [abs]
649 >> rpt (POP_ASSUM MP_TAC)
650 >> REAL_ARITH_TAC
651QED
652
653Theorem PROB_INCREASING_UNION:
654    !p f. prob_space p /\ f IN (UNIV -> events p) /\ (!n. f n SUBSET f (SUC n)) ==>
655         (sup (IMAGE (prob p o f) UNIV) = prob p (BIGUNION (IMAGE f UNIV)))
656Proof
657    RW_TAC std_ss [prob_space_def, events_def, prob_def, MONOTONE_CONVERGENCE]
658QED
659
660Theorem PROB_SUBADDITIVE:
661    !p t u. prob_space p /\ t IN events p /\ u IN events p ==>
662            prob p (t UNION u) <= prob p t + prob p u
663Proof
664   RW_TAC std_ss []
665   >> Know `t UNION u = t UNION (u DIFF t)`
666   >- (SET_EQ_TAC
667       >> RW_TAC std_ss [IN_UNION, IN_DIFF]
668       >> PROVE_TAC [])
669   >> Rewr
670   >> Know `u DIFF t IN events p`
671   >- PROVE_TAC [EVENTS_DIFF]
672   >> STRIP_TAC
673   >> Know `prob p (t UNION (u DIFF t)) = prob p t + prob p (u DIFF t)`
674   >- (MATCH_MP_TAC PROB_ADDITIVE
675       >> RW_TAC std_ss [DISJOINT_ALT, IN_DIFF])
676   >> Rewr
677   >> MATCH_MP_TAC le_ladd_imp
678   >> MATCH_MP_TAC PROB_INCREASING
679   >> RW_TAC std_ss [DIFF_DEF, SUBSET_DEF, GSPECIFICATION]
680QED
681
682Theorem PROB_COUNTABLY_SUBADDITIVE :
683    !p f. prob_space p /\ (IMAGE f UNIV) SUBSET events p ==>
684          prob p (BIGUNION (IMAGE f UNIV)) <= suminf (prob p o f)
685Proof
686    RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV]
687 >> Know `!n. 0 <= (prob p o f) n`
688 >- (RW_TAC std_ss [o_DEF] \\
689     POP_ASSUM (ASSUME_TAC o (Q.SPEC `(f :num -> 'a -> bool) n`)) \\
690     MATCH_MP_TAC PROB_POSITIVE >> art [] \\
691     POP_ASSUM MATCH_MP_TAC \\
692     Q.EXISTS_TAC `n` >> art [])
693 >> DISCH_THEN (MP_TAC o (MATCH_MP ext_suminf_def)) >> Rewr'
694 >> Suff `prob p (BIGUNION (IMAGE f UNIV)) =
695                  sup (IMAGE (prob p o (\n. BIGUNION (IMAGE f (count n)))) UNIV)`
696 >- (RW_TAC std_ss []
697      >> MATCH_MP_TAC sup_mono
698      >> RW_TAC std_ss [o_DEF]
699      >> Induct_on `n`
700      >- RW_TAC std_ss [COUNT_ZERO, IMAGE_EMPTY, BIGUNION_EMPTY, PROB_EMPTY,
701                        EXTREAL_SUM_IMAGE_EMPTY, le_refl]
702      >> RW_TAC std_ss [COUNT_SUC, IMAGE_INSERT, BIGUNION_INSERT]
703      >> (MP_TAC o Q.SPEC `n` o REWRITE_RULE [FINITE_COUNT,o_DEF] o
704          Q.SPECL [`prob p o f`,`count n`] o INST_TYPE [alpha |-> ``:num``])
705             EXTREAL_SUM_IMAGE_PROPERTY
706      >> `(!x. x IN n INSERT count n ==> prob p (f x) <> NegInf)` by METIS_TAC [PROB_FINITE]
707      >> RW_TAC std_ss [COUNT_SUC]
708      >> `~(n < n)` by RW_TAC real_ss []
709      >> `count n DELETE n = count n` by METIS_TAC [DELETE_NON_ELEMENT,IN_COUNT]
710      >> RW_TAC std_ss []
711      >> `prob p (f n UNION BIGUNION (IMAGE f (count n))) <=
712          prob p (f n) + prob p (BIGUNION (IMAGE f (count n)))`
713          by (MATCH_MP_TAC PROB_SUBADDITIVE
714              >> RW_TAC std_ss []
715              >- METIS_TAC []
716              >> MATCH_MP_TAC EVENTS_COUNTABLE_UNION
717              >> RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_COUNT, image_countable,
718                     COUNTABLE_COUNT]
719              >> METIS_TAC [])
720      >> METIS_TAC [le_ladd_imp, le_trans])
721 >> (MP_TAC o Q.SPECL [`p`,`(\n. BIGUNION (IMAGE f (count n)))`]) PROB_INCREASING_UNION
722 >> RW_TAC std_ss []
723 >> `BIGUNION (IMAGE (\n. BIGUNION (IMAGE f (count n))) UNIV) = BIGUNION (IMAGE f UNIV)`
724       by (RW_TAC std_ss [EXTENSION,IN_BIGUNION_IMAGE,IN_UNIV,IN_COUNT]
725           >> METIS_TAC [DECIDE ``x < SUC x``])
726 >> FULL_SIMP_TAC std_ss []
727 >> POP_ASSUM (K ALL_TAC)
728 >> POP_ASSUM (MATCH_MP_TAC o GSYM)
729 >> RW_TAC std_ss [IN_FUNSET,IN_UNIV]
730 >- (MATCH_MP_TAC EVENTS_COUNTABLE_UNION
731     >> RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_COUNT, image_countable, COUNTABLE_COUNT]
732     >> METIS_TAC [])
733 >> RW_TAC std_ss [SUBSET_DEF, IN_BIGUNION_IMAGE, IN_COUNT]
734 >> METIS_TAC [DECIDE ``n < SUC n``, LESS_TRANS]
735QED
736
737Theorem PROB_COUNTABLY_ZERO :
738    !p c. prob_space p /\ countable c /\ c SUBSET events p /\
739          (!x. x IN c ==> (prob p x = 0)) ==> (prob p (BIGUNION c) = 0)
740Proof
741    RW_TAC std_ss [COUNTABLE_ENUM]
742 >- RW_TAC std_ss [BIGUNION_EMPTY, PROB_EMPTY]
743 >> Know `(!n. prob p (f n) = 0) /\ (!n. f n IN events p)`
744 >- (FULL_SIMP_TAC std_ss [IN_IMAGE, IN_UNIV, SUBSET_DEF] \\
745     PROVE_TAC [])
746 >> NTAC 2 (POP_ASSUM K_TAC)
747 >> STRIP_TAC
748 >> ONCE_REWRITE_TAC [GSYM le_antisym]
749 >> reverse CONJ_TAC
750 >- (MATCH_MP_TAC PROB_POSITIVE \\
751     RW_TAC std_ss [] \\
752     MATCH_MP_TAC EVENTS_COUNTABLE_UNION \\
753     RW_TAC std_ss [COUNTABLE_IMAGE_NUM, SUBSET_DEF, IN_IMAGE, IN_UNIV] \\
754     RW_TAC std_ss [])
755 >> Know `!n. 0 <= (prob p o f) n`
756 >- RW_TAC std_ss [o_DEF, le_refl] >> DISCH_TAC
757 >> Know `suminf (prob p o f) = 0`
758 >- RW_TAC std_ss [ext_suminf_def, o_DEF, EXTREAL_SUM_IMAGE_ZERO, FINITE_COUNT,
759                   sup_const_over_set, UNIV_NOT_EMPTY]
760 >> RW_TAC std_ss []
761 >> POP_ASSUM (REWRITE_TAC o wrap o SYM)
762 >> MATCH_MP_TAC PROB_COUNTABLY_SUBADDITIVE
763 >> RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV]
764 >> RW_TAC std_ss []
765QED
766
767(* This theorem is more general than measureTheory.FINITE_ADDITIVE:
768
769  `f :'b -> 'a -> bool` has an finite index set of type ('b set)
770 *)
771Theorem PROB_FINITE_ADDITIVE :
772    !p s f t. prob_space p /\ FINITE s /\ (!x. x IN s ==> f x IN events p) /\
773             (!a b. (a :'b) IN s /\ b IN s /\ a <> b ==> DISJOINT (f a) (f b)) /\
774             (t = BIGUNION (IMAGE f s)) ==> (prob p t = SIGMA (prob p o f) s)
775Proof
776    Suff `!s. FINITE (s:'b -> bool) ==>
777        ((\s. !p f t. prob_space p  /\ (!x. x IN s ==> f x IN events p) /\
778        (!a b. a IN s /\ b IN s /\ a <> b ==> DISJOINT (f a) (f b)) /\
779        (t = BIGUNION (IMAGE f s)) ==> (prob p t = SIGMA (prob p o f) s)) s)`
780 >- rw []
781 >> MATCH_MP_TAC FINITE_INDUCT >> RW_TAC std_ss [IMAGE_EMPTY]
782 >- RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, BIGUNION_EMPTY, PROB_EMPTY]
783 >> Know `SIGMA (prob p o f) ((e:'b) INSERT s) =
784                (prob p o f) e + SIGMA (prob p o f) (s DELETE e)`
785 >- (irule EXTREAL_SUM_IMAGE_PROPERTY >> art [] \\
786     DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
787     SIMP_TAC std_ss [o_DEF] >> METIS_TAC [PROB_FINITE])
788 >> `s DELETE (e:'b) = s` by FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]
789 >> RW_TAC std_ss [IMAGE_INSERT, BIGUNION_INSERT]
790 >> Know `DISJOINT (f e) (BIGUNION (IMAGE f s))`
791 >- (RW_TAC set_ss [DISJOINT_BIGUNION, IN_IMAGE] \\
792    `e IN e INSERT s` by PROVE_TAC [IN_INSERT] \\
793    `x IN e INSERT s` by PROVE_TAC [IN_INSERT] \\
794    `e <> x` by METIS_TAC [] \\
795     FULL_SIMP_TAC std_ss []) >> DISCH_TAC
796 >> `(f e) IN events p` by PROVE_TAC [IN_INSERT]
797 >> `BIGUNION (IMAGE f s) IN events p`
798        by (MATCH_MP_TAC EVENTS_COUNTABLE_UNION >> RW_TAC std_ss []
799           >- (RW_TAC std_ss [SUBSET_DEF,IN_IMAGE] >> METIS_TAC [IN_INSERT])
800           >> MATCH_MP_TAC image_countable >> RW_TAC std_ss [finite_countable])
801 >> `(prob p (f e UNION BIGUNION (IMAGE f s))) = prob p (f e) + prob p (BIGUNION (IMAGE f s))`
802        by (MATCH_MP_TAC PROB_ADDITIVE >> FULL_SIMP_TAC std_ss [])
803 >> POP_ORW
804 >> Suff `prob p (BIGUNION (IMAGE f s)) = SIGMA (prob p o f) s` >- rw []
805 >> FIRST_X_ASSUM MATCH_MP_TAC >> rw [IN_INSERT]
806QED
807
808Theorem PROB_EXTREAL_SUM_IMAGE:
809    !p s. prob_space p /\ s IN events p /\ (!x. x IN s ==> {x} IN events p) /\ FINITE s ==>
810         (prob p s = SIGMA (\x. prob p {x}) s)
811Proof
812  Suff `!s. FINITE s ==>
813        (\s. !p. prob_space p /\ s IN events p /\ (!x. x IN s ==> {x} IN events p) ==>
814             (prob p s = SIGMA (\x. prob p {x}) s)) s`
815  >- METIS_TAC []
816  >> MATCH_MP_TAC FINITE_INDUCT
817  >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY,PROB_EMPTY,IN_INSERT]
818  >> (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\x. prob p {x})`,`s`]) EXTREAL_SUM_IMAGE_PROPERTY
819  >> `!x. x IN e INSERT s ==> (\x. prob p {x}) x <> NegInf` by METIS_TAC [PROB_FINITE,IN_INSERT]
820  >> RW_TAC std_ss []
821  >> Q.PAT_X_ASSUM `!p. prob_space p /\ s IN events p /\
822            (!x. x IN s ==> {x} IN events p) ==>
823            (prob p s = SIGMA (\x. prob p {x}) s)` (MP_TAC o GSYM o Q.SPEC `p`)
824  >> RW_TAC std_ss []
825  >> `s IN events p`
826      by (`s = (e INSERT s) DIFF {e}`
827             by (RW_TAC std_ss [EXTENSION, IN_INSERT, IN_DIFF, IN_SING] \\
828                 METIS_TAC [GSYM DELETE_NON_ELEMENT])
829          >> POP_ORW
830          >> FULL_SIMP_TAC std_ss [prob_space_def, measure_space_def, sigma_algebra_def, events_def]
831          >> METIS_TAC [space_def, subsets_def, ALGEBRA_DIFF])
832  >> FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]
833  >> MATCH_MP_TAC PROB_ADDITIVE
834  >> RW_TAC std_ss [IN_DISJOINT, IN_SING, Once INSERT_SING_UNION]
835  >> FULL_SIMP_TAC std_ss [GSYM DELETE_NON_ELEMENT]
836QED
837
838Theorem PROB_EQUIPROBABLE_FINITE_UNIONS:
839    !p s. prob_space p /\ FINITE s /\ s IN events p /\ (!x. x IN s ==> {x} IN events p) /\
840         (!x y. x IN s /\ y IN s ==> (prob p {x} = prob p {y})) ==>
841         (prob p s = & (CARD s) * prob p {CHOICE s})
842Proof
843   RW_TAC std_ss []
844   >> Cases_on `s = {}`
845   >- RW_TAC real_ss [PROB_EMPTY, CARD_EMPTY,mul_lzero]
846   >> `prob p s = SIGMA (\x. prob p {x}) s`
847        by METIS_TAC [PROB_EXTREAL_SUM_IMAGE]
848   >> POP_ORW
849   >> `prob p {CHOICE s} = (\x. prob p {x}) (CHOICE s)` by RW_TAC std_ss []
850   >> POP_ORW
851   >> (MATCH_MP_TAC o UNDISCH o Q.SPEC `s`) EXTREAL_SUM_IMAGE_FINITE_SAME
852   >> RW_TAC std_ss [CHOICE_DEF]
853   >> METIS_TAC [PROB_FINITE]
854QED
855
856Theorem PROB_EXTREAL_SUM_IMAGE_FN:
857    !p f e s. prob_space p /\ e IN events p /\
858             (!x. x IN s ==> e INTER f x IN events p) /\ FINITE s /\
859             (!x y. x IN s /\ y IN s /\ (~(x=y)) ==> DISJOINT (f x) (f y)) /\
860             (BIGUNION (IMAGE f s) INTER p_space p = p_space p) ==>
861             (prob p e = SIGMA (\x. prob p (e INTER f x)) s)
862Proof
863   Suff `!(s :'b -> bool). FINITE s ==>
864        (\s. !(p :('a -> bool) # (('a -> bool) -> bool) # (('a -> bool) -> extreal))
865       (f :'b -> 'a -> bool) (e :'a -> bool). prob_space p /\ e IN events p /\
866                (!x. x IN s ==> e INTER f x IN events p) /\
867                (!x y. x IN s /\ y IN s /\ (~(x=y)) ==> DISJOINT (f x) (f y)) /\
868                (BIGUNION (IMAGE f s) INTER p_space p = p_space p) ==>
869                (prob p e = SIGMA (\x. prob p (e INTER f x)) s)) s`
870   >- METIS_TAC []
871   >> MATCH_MP_TAC FINITE_INDUCT
872   >> RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, PROB_EMPTY, DELETE_NON_ELEMENT, IN_INSERT,
873                     IMAGE_EMPTY, BIGUNION_EMPTY, INTER_EMPTY]
874   >- METIS_TAC [PROB_UNIV, PROB_EMPTY, REAL_10,extreal_of_num_def,extreal_11]
875   >> (MP_TAC o Q.SPEC `e` o UNDISCH o Q.SPECL [`(\x. prob p (e' INTER f x))`,`s`] o
876       INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
877   >> `!x. x IN e INSERT s ==> (\x. prob p (e' INTER f x)) x <> NegInf`
878      by METIS_TAC [PROB_FINITE,IN_INSERT]
879   >> RW_TAC std_ss []
880   >> `prob p e' =
881        prob p (e' INTER f e) +
882        prob p (e' DIFF f e)`
883        by (MATCH_MP_TAC PROB_ADDITIVE
884            >> RW_TAC std_ss []
885            >| [`e' DIFF f e = e' DIFF (e' INTER f e)`
886                by (RW_TAC std_ss [EXTENSION, IN_DIFF, IN_INTER] >> DECIDE_TAC)
887                >> POP_ORW
888                >> METIS_TAC [EVENTS_DIFF],
889                FULL_SIMP_TAC std_ss [IN_DISJOINT, IN_INTER, IN_DIFF] >> METIS_TAC [],
890                RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_UNION, IN_DIFF] >> DECIDE_TAC])
891   >> POP_ORW
892   >> RW_TAC std_ss [EXTREAL_EQ_LADD,PROB_FINITE]
893   >> (MP_TAC o Q.ISPEC `(s :'b -> bool)`) SET_CASES
894   >> RW_TAC std_ss []
895   >- (RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY]
896       >> `IMAGE f {e} = {f e}`
897                by RW_TAC std_ss [EXTENSION, IN_IMAGE, IN_SING]
898       >> FULL_SIMP_TAC std_ss [BIGUNION_SING, DIFF_UNIV, PROB_EMPTY]
899       >> `e' DIFF f e = {}`
900                by (RW_TAC std_ss [Once EXTENSION, NOT_IN_EMPTY, IN_DIFF]
901                    >> METIS_TAC [SUBSET_DEF, MEASURABLE_SETS_SUBSET_SPACE, prob_space_def,
902                                  events_def, p_space_def, IN_INTER])
903       >> RW_TAC std_ss [PROB_EMPTY])
904   >> Q.PAT_X_ASSUM `!p f e.
905            prob_space p /\ e IN events p /\
906            (!x. x IN s ==> e INTER f x IN events p) /\
907            (!x y. x IN s /\ y IN s /\ ~(x = y) ==> DISJOINT (f x) (f y)) /\
908            (BIGUNION (IMAGE f s) INTER p_space p = p_space p) ==>
909            (prob p e = SIGMA (\x. prob p (e INTER f x)) s)`
910        (MP_TAC o Q.SPECL [`p`,`(\y. if y = x then f x UNION f e else f y)`,`e' DIFF f e`])
911   >> ASM_SIMP_TAC std_ss []
912   >> `e' DIFF f e IN events p`
913        by (`e' DIFF f e = e' DIFF (e' INTER f e)`
914                by (RW_TAC std_ss [EXTENSION, IN_DIFF, IN_INTER] >> DECIDE_TAC)
915                >> POP_ORW
916                >> METIS_TAC [EVENTS_DIFF])
917   >> ASM_SIMP_TAC std_ss []
918   >> `(!x'.
919        x' IN x INSERT t ==>
920        (e' DIFF f e) INTER (if x' = x then f x UNION f e else f x') IN
921        events p)`
922        by (RW_TAC std_ss []
923            >- (`(e' DIFF f e) INTER (f x UNION f e) =
924                 e' INTER f x`
925                by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_INTER, IN_DIFF, IN_UNION]
926                    >> FULL_SIMP_TAC std_ss [IN_DISJOINT, GSYM DELETE_NON_ELEMENT]
927                    >> METIS_TAC [])
928                >> RW_TAC std_ss [])
929            >> `(e' DIFF f e) INTER f x' =
930                (e' INTER f x') DIFF (e' INTER f e)`
931                by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_INTER, IN_DIFF]
932                    >> FULL_SIMP_TAC std_ss [IN_DISJOINT, GSYM DELETE_NON_ELEMENT]
933                    >> METIS_TAC [])
934            >> METIS_TAC [EVENTS_DIFF])
935   >> ASM_SIMP_TAC std_ss []
936   >> `(!x' y.
937        x' IN x INSERT t /\ y IN x INSERT t /\ ~(x' = y) ==>
938        DISJOINT (if x' = x then f x UNION f e else f x')
939          (if y = x then f x UNION f e else f y))`
940        by (RW_TAC std_ss [IN_DISJOINT, IN_UNION]
941            >> FULL_SIMP_TAC std_ss [IN_DISJOINT, GSYM DELETE_NON_ELEMENT]
942            >> METIS_TAC [])
943   >> ASM_SIMP_TAC std_ss []
944   >> `(BIGUNION
945        (IMAGE (\y. (if y = x then f x UNION f e else f y)) (x INSERT t)) INTER p_space p = p_space p)`
946        by (FULL_SIMP_TAC std_ss [IMAGE_INSERT, BIGUNION_INSERT]
947            >> `IMAGE (\y. (if y = x then f x UNION f e else f y)) t =
948                IMAGE f t`
949                by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_IMAGE]
950                    >> EQ_TAC
951                    >- (RW_TAC std_ss [] >> METIS_TAC [])
952                    >> RW_TAC std_ss [] >> METIS_TAC [])
953            >> POP_ORW
954            >> METIS_TAC [UNION_COMM, UNION_ASSOC])
955   >> ASM_SIMP_TAC std_ss []
956   >> STRIP_TAC >> POP_ASSUM (K ALL_TAC)
957   >> FULL_SIMP_TAC std_ss [FINITE_INSERT]
958   >> (MP_TAC o Q.SPEC `x` o UNDISCH o Q.SPECL [`(\x. prob p (e' INTER f x))`,`t`] o
959       INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
960   >> `!x'. x' IN x INSERT t ==> (\x. prob p (e' INTER f x)) x' <> NegInf`
961        by METIS_TAC [PROB_FINITE,IN_INSERT]
962   >> RW_TAC std_ss []
963   >> (MP_TAC o Q.SPEC `x` o UNDISCH o
964       Q.SPECL [`(\x'. prob p ((e' DIFF f e) INTER if x' = x then f x UNION f e else f x'))`,`t`] o
965       INST_TYPE [alpha |-> beta]) EXTREAL_SUM_IMAGE_PROPERTY
966   >> `!x'. x' IN x INSERT t ==>
967            (\x'. prob p ((e' DIFF f e) INTER
968                          if x' = x then f x UNION f e else f x')) x' <> NegInf`
969        by METIS_TAC [PROB_FINITE,IN_INSERT]
970   >> RW_TAC std_ss []
971   >> FULL_SIMP_TAC std_ss [DELETE_NON_ELEMENT]
972   >> FULL_SIMP_TAC std_ss [GSYM DELETE_NON_ELEMENT]
973   >> `(e' DIFF f e) INTER (f x UNION f e) = e' INTER f x`
974        by (ONCE_REWRITE_TAC [EXTENSION] >> RW_TAC std_ss [IN_INTER, IN_DIFF, IN_UNION]
975            >> FULL_SIMP_TAC std_ss [IN_DISJOINT, GSYM DELETE_NON_ELEMENT, IN_INSERT]
976            >> METIS_TAC [])
977   >> FULL_SIMP_TAC std_ss [EXTREAL_EQ_LADD,PROB_FINITE,IN_INSERT]
978   >> (MP_TAC o Q.SPEC `(\x. prob p (e' INTER f x))` o
979       UNDISCH o Q.ISPEC `(t :'b -> bool)`) EXTREAL_SUM_IMAGE_IN_IF
980   >> (MP_TAC o Q.SPEC `(\x'. prob p ((e' DIFF f e) INTER
981                                      if x' = x then f x UNION f e else f x'))` o
982       UNDISCH o Q.ISPEC `(t :'b -> bool)`) EXTREAL_SUM_IMAGE_IN_IF
983   >> RW_TAC std_ss []
984   >> Suff `(\x'.
985         (if x' IN t then
986            (\x'.
987               prob p
988                 ((e' DIFF f e) INTER
989                  (if x' = x then f x UNION f e else f x'))) x'
990          else
991            0)) =
992        (\x. (if x IN t then (\x. prob p (e' INTER f x)) x else 0))`
993   >- RW_TAC std_ss []
994   >> RW_TAC std_ss [FUN_EQ_THM] >> RW_TAC std_ss []
995   >> Suff `(e' DIFF f e) INTER f x' = e' INTER f x'`
996   >- RW_TAC std_ss []
997   >> RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_DIFF]
998   >> FULL_SIMP_TAC std_ss [IN_DISJOINT, IN_INSERT]
999   >> METIS_TAC []
1000QED
1001
1002Theorem PROB_EXTREAL_SUM_IMAGE_SPACE:
1003    !p. prob_space p /\ FINITE (p_space p) /\ (!x. x IN p_space p ==> {x} IN events p) ==>
1004       (SIGMA (\x. prob p {x}) (p_space p) = 1)
1005Proof
1006    RW_TAC std_ss []
1007 >> (MP_TAC o GSYM o Q.SPECL [`p`,`p_space p`]) PROB_EXTREAL_SUM_IMAGE
1008 >> RW_TAC std_ss [EVENTS_SPACE,PROB_UNIV]
1009QED
1010
1011Theorem PROB_DISCRETE_EVENTS:
1012    !p. prob_space p /\ FINITE (p_space p) /\ (!x. x IN p_space p ==> {x} IN events p) ==>
1013        !s. s SUBSET p_space p ==> s IN events p
1014Proof
1015  RW_TAC std_ss []
1016  >> `s = BIGUNION ({{x} | x IN s})`
1017      by (RW_TAC std_ss [EXTENSION,IN_BIGUNION,GSPECIFICATION,IN_SING]
1018          >> METIS_TAC [IN_SING])
1019  >> POP_ORW
1020  >> `{{x} | x IN s} SUBSET events p`
1021        by (RW_TAC std_ss  [SUBSET_DEF,GSPECIFICATION] >> METIS_TAC [SUBSET_DEF])
1022  >> `FINITE {{x} | x IN s}`
1023      by (Suff `{{x} | x IN s} = IMAGE (\x. {x}) s` >- METIS_TAC [IMAGE_FINITE,SUBSET_FINITE]
1024          >> RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_IMAGE])
1025  >> METIS_TAC [EVENTS_COUNTABLE_UNION,finite_countable]
1026QED
1027
1028Theorem PROB_DISCRETE_EVENTS_COUNTABLE:
1029    !p. prob_space p /\ countable (p_space p) /\ (!x. x IN p_space p ==> {x} IN events p) ==>
1030        !s. s SUBSET p_space p ==> s IN events p
1031Proof
1032  RW_TAC std_ss []
1033  >> `s = BIGUNION ({{x} | x IN s})`
1034      by (RW_TAC std_ss [EXTENSION,IN_BIGUNION,GSPECIFICATION,IN_SING]
1035          >> METIS_TAC [IN_SING])
1036  >> POP_ORW
1037  >> `{{x} | x IN s} SUBSET events p`
1038      by (RW_TAC std_ss [SUBSET_DEF,GSPECIFICATION] >> METIS_TAC [SUBSET_DEF])
1039  >> `countable {{x} | x IN s}`
1040      by (Suff `{{x} | x IN s} = IMAGE (\x. {x}) s`
1041          >- METIS_TAC [image_countable, COUNTABLE_SUBSET]
1042          >> RW_TAC std_ss [EXTENSION,GSPECIFICATION,IN_IMAGE])
1043  >> METIS_TAC [EVENTS_COUNTABLE_UNION]
1044QED
1045
1046Theorem prob_normal:
1047  !p. prob_space p ==>
1048  !x. x IN events p ==> ?r. prob p x = Normal r /\ 0 <= r /\ r <= 1
1049Proof
1050  rpt strip_tac
1051  \\ imp_res_tac PROB_LE_1
1052  \\ imp_res_tac PROB_POSITIVE
1053  \\ qexists_tac`real (prob p x)`
1054  \\ dep_rewrite.DEP_REWRITE_TAC[normal_real]
1055  \\ conj_asm1_tac >- (
1056    rpt strip_tac \\ fs[le_infty] )
1057  \\ Cases_on`prob p x` \\ fs[]
1058  \\ metis_tac[extreal_of_num_def, extreal_le_eq]
1059QED
1060
1061Theorem prob_on_finite_set:
1062  !p. FINITE (m_space p) /\ measurable_sets p = POW (m_space p) ==>
1063  (prob_space p <=>
1064   positive p /\ prob p (p_space p) = 1 /\ additive p)
1065Proof
1066  ntac 2 strip_tac
1067  \\ simp[prob_space_def]
1068  \\ simp[p_space_def, prob_def]
1069  \\ simp[measure_space_def]
1070  \\ Cases_on`positive p` \\ simp[]
1071  \\ Cases_on`measure p (m_space p) = 1` \\ simp[]
1072  \\ eq_tac \\ strip_tac
1073  >- (
1074    `measure_space p` by simp[measure_space_def]
1075    \\ imp_res_tac MEASURE_SPACE_EMPTY_MEASURABLE
1076    \\ imp_res_tac COUNTABLY_ADDITIVE_FINITE_ADDITIVE
1077    \\ fs[finite_additive_def, additive_def]
1078    \\ rpt strip_tac
1079    \\ first_x_assum(qspecl_then[`(0n =+ s) ((1 =+ t) (K {}))`,`2`]mp_tac)
1080    \\ simp[count_EQN]
1081    \\ simp[DECIDE``n < 2n <=> (n = 0) \/ (n = 1)``]
1082    \\ dsimp[combinTheory.APPLY_UPDATE_THM]
1083    \\ fs[events_def, DISJOINT_SYM, UNION_COMM]
1084    \\ ‘measure p s <> PosInf /\ measure p t <> PosInf’
1085    by (
1086      conj_tac \\ irule MEASURE_SPACE_FINITE_MEASURE
1087      \\ simp[]
1088      \\ simp[measure_space_def] )
1089    \\ dep_rewrite.DEP_REWRITE_TAC[extrealTheory.EXTREAL_SUM_IMAGE_INSERT]
1090    \\ simp[combinTheory.APPLY_UPDATE_THM]
1091    \\ dep_rewrite.DEP_REWRITE_TAC[DELETE_NON_ELEMENT |> SPEC_ALL |> EQ_IMP_RULE |> #1]
1092    \\ simp[]
1093    \\ dep_rewrite.DEP_REWRITE_TAC[extrealTheory.EXTREAL_SUM_IMAGE_INSERT]
1094    \\ simp[combinTheory.APPLY_UPDATE_THM]
1095    \\ simp[extrealTheory.EXTREAL_SUM_IMAGE_EMPTY]
1096    \\ reverse conj_asm1_tac
1097    >- ( simp[] \\ simp[extrealTheory.add_comm] )
1098    \\ disj1_tac
1099    \\ rw[]
1100    \\ dep_rewrite.DEP_REWRITE_TAC[MEASURE_EMPTY]
1101    \\ simp[measure_space_def] )
1102  \\ reverse conj_asm1_tac
1103  >- (
1104    imp_res_tac finite_additivity_sufficient_for_finite_spaces2
1105    \\ fs[measure_space_def] )
1106  \\ simp[sigma_algebraTheory.SIGMA_ALGEBRA]
1107  \\ conj_asm1_tac >- simp[sigma_algebraTheory.subset_class_POW]
1108  \\ simp[IN_POW]
1109  \\ simp[SUBSET_DEF, PULL_EXISTS]
1110  \\ simp[IN_POW, SUBSET_DEF]
1111  \\ metis_tac[]
1112QED
1113
1114(* NOTE: This is one of the rare theorems having ‘prob_space p’ at the conclusion.
1115         It's most common uniform distribution over discrete sample space.
1116 *)
1117Theorem prob_space_on_finite_set :
1118    !p. FINITE (p_space p) /\ p_space p <> {} /\ events p = POW (p_space p) /\
1119        (!s. s IN events p ==> prob p s = &CARD s / &CARD (p_space p)) ==>
1120        prob_space p
1121Proof
1122    rw [p_space_def, events_def, prob_def]
1123 >> ‘CARD (m_space p) <> 0’ by rw [CARD_EQ_0]
1124 >> rw [prob_on_finite_set]
1125 >| [ (* goal 1 (of 3) *)
1126      rw [positive_def]
1127      >- (MATCH_MP_TAC zero_div >> rw [extreal_of_num_def]) \\
1128      qabbrev_tac ‘N = CARD (m_space p)’ \\
1129     ‘&N = Normal (&N)’ by rw [extreal_of_num_def] >> POP_ORW \\
1130      MATCH_MP_TAC le_div \\
1131      rw [extreal_lt_eq, extreal_of_num_def],
1132      (* goal 2 (of 3) *)
1133      rw [prob_def, p_space_def] \\
1134     ‘m_space p IN measurable_sets p’ by rw [IN_POW] \\
1135      rw [] \\
1136      MATCH_MP_TAC div_refl >> rw [extreal_of_num_def],
1137      (* goal 3 (of 3) *)
1138      rw [additive_def] \\
1139      Know ‘CARD (s UNION t) = CARD s + CARD t’
1140      >- (MATCH_MP_TAC CARD_UNION_DISJOINT >> fs [IN_POW] \\
1141          CONJ_TAC \\ (* 2 subgoals, same tactics *)
1142          MATCH_MP_TAC FINITE_SUBSET \\
1143          Q.EXISTS_TAC ‘m_space p’ >> art []) >> Rewr' \\
1144      Know ‘&(CARD s + CARD t) = &CARD s + (&CARD t :extreal)’
1145      >- rw [extreal_of_num_def, extreal_add_def] >> Rewr' \\
1146      ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
1147      MATCH_MP_TAC div_add >> rw [extreal_of_num_def] ]
1148QED
1149
1150(* The same theorem using ‘uniform_distribution’ *)
1151Theorem prob_space_on_finite_set' :
1152    !p. FINITE (p_space p) /\ p_space p <> {} /\ events p = POW (p_space p) /\
1153        prob p = uniform_distribution (p_space p,events p) ==> prob_space p
1154Proof
1155    simp [uniform_distribution_def, prob_space_on_finite_set]
1156QED
1157
1158(* ************************************************************************* *)
1159
1160Theorem distribution_distr :
1161    distribution = distr
1162Proof
1163    rpt FUN_EQ_TAC >> qx_genl_tac [`p`, `X`, `s`]
1164 >> RW_TAC std_ss [distribution_def, distr_def, prob_def, p_space_def]
1165QED
1166
1167Theorem distribution_GSPEC :
1168    !s. distribution p X s = prob p {x | x IN p_space p /\ X x IN s}
1169Proof
1170    rw [distribution_def, PREIMAGE_def]
1171 >> simp [PROB_GSPEC]
1172QED
1173
1174(* alternative definition of ‘distribution_function’ *)
1175Theorem distribution_function :
1176    !p X t. distribution_function p X t = distribution p X {x | x <= t}
1177Proof
1178    rw [distribution_function_def, distribution_def, PREIMAGE_def]
1179QED
1180
1181Theorem joint_distribution_alt :
1182   !p X Y. joint_distribution p X Y = distribution p (\x. (X x,Y x))
1183Proof
1184   rw [joint_distribution_def, distribution_def]
1185QED
1186
1187(* See "stochastic_processTheory.finite_dimensional_distribution_def" for the joint
1188   distribution of a finite sequence of random variables.
1189 *)
1190Theorem joint_distribution3_alt :
1191   !p X Y Z. joint_distribution3 p X Y Z = distribution p (\x. (X x,Y x,Z x))
1192Proof
1193   rw [joint_distribution3_def, distribution_def]
1194QED
1195
1196(* ************************************************************************* *)
1197
1198Theorem marginal_joint_zero :
1199    !p X Y s t. prob_space p /\ (events p = POW (p_space p)) /\
1200                ((distribution p X s = 0) \/ (distribution p Y t = 0))
1201            ==> (joint_distribution p X Y (s CROSS t) = 0)
1202Proof
1203    RW_TAC std_ss [joint_distribution_def, distribution_def]
1204 >- (`PREIMAGE (\x. (X x,Y x)) (s CROSS t) INTER p_space p
1205        SUBSET (PREIMAGE X s INTER p_space p)`
1206           by RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_INTER, IN_CROSS] \\
1207     `prob p (PREIMAGE (\x. (X x,Y x)) (s CROSS t) INTER p_space p) <=
1208      prob p (PREIMAGE X s INTER p_space p)`
1209           by METIS_TAC [PROB_INCREASING, INTER_SUBSET, IN_POW] \\
1210     METIS_TAC [PROB_POSITIVE, INTER_SUBSET, IN_POW, le_antisym])
1211 >> `(PREIMAGE (\x. (X x,Y x)) (s CROSS t) INTER p_space p)
1212        SUBSET (PREIMAGE Y t INTER p_space p)`
1213      by RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_INTER, IN_CROSS]
1214 >> `prob p (PREIMAGE (\x. (X x,Y x)) (s CROSS t) INTER p_space p) <=
1215     prob p (PREIMAGE Y t INTER p_space p)`
1216       by METIS_TAC [PROB_INCREASING, INTER_SUBSET, IN_POW]
1217 >> METIS_TAC [PROB_POSITIVE, INTER_SUBSET, IN_POW, le_antisym]
1218QED
1219
1220Theorem marginal_joint_zero3 :
1221    !p X Y Z s t u. prob_space p /\ (events p = POW (p_space p)) /\
1222                   ((distribution p X s = 0) \/
1223                    (distribution p Y t = 0) \/
1224                    (distribution p Z u = 0))
1225               ==> (joint_distribution3 p X Y Z (s CROSS (t CROSS u)) = 0)
1226Proof
1227    RW_TAC std_ss [joint_distribution3_def, distribution_def]
1228 >| [ (* goal 1 (of 3) *)
1229     `PREIMAGE (\x. (X x,Y x,Z x)) (s CROSS (t CROSS u)) INTER p_space p
1230        SUBSET (PREIMAGE X s INTER p_space p)`
1231           by RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_INTER, IN_CROSS] \\
1232     `prob p (PREIMAGE (\x. (X x,Y x,Z x)) (s CROSS (t CROSS u)) INTER p_space p) <=
1233      prob p (PREIMAGE X s INTER p_space p)`
1234           by METIS_TAC [PROB_INCREASING, INTER_SUBSET, IN_POW] \\
1235      METIS_TAC [PROB_POSITIVE, INTER_SUBSET, IN_POW, le_antisym],
1236      (* goal 2 (of 3) *)
1237     `PREIMAGE (\x. (X x,Y x,Z x)) (s CROSS (t CROSS u)) INTER p_space p
1238        SUBSET (PREIMAGE Y t INTER p_space p)`
1239           by RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_INTER, IN_CROSS] \\
1240     `prob p (PREIMAGE (\x. (X x,Y x, Z x)) (s CROSS (t CROSS u)) INTER p_space p) <=
1241      prob p (PREIMAGE Y t INTER p_space p)`
1242           by METIS_TAC [PROB_INCREASING, INTER_SUBSET, IN_POW] \\
1243      METIS_TAC [PROB_POSITIVE, INTER_SUBSET, IN_POW, le_antisym],
1244      (* goal 3 (of 3) *)
1245     `PREIMAGE (\x. (X x,Y x,Z x)) (s CROSS (t CROSS u)) INTER p_space p
1246        SUBSET (PREIMAGE Z u INTER p_space p)`
1247           by RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_INTER, IN_CROSS] \\
1248     `prob p (PREIMAGE (\x. (X x,Y x, Z x)) (s CROSS (t CROSS u)) INTER p_space p) <=
1249      prob p (PREIMAGE Z u INTER p_space p)`
1250           by METIS_TAC [PROB_INCREASING, INTER_SUBSET, IN_POW] \\
1251      METIS_TAC [PROB_POSITIVE, INTER_SUBSET, IN_POW, le_antisym] ]
1252QED
1253
1254Theorem distribution_pos :
1255    !p X a. prob_space p /\ (events p = POW (p_space p)) ==>
1256            0 <= distribution p X a
1257Proof
1258    RW_TAC std_ss [distribution_def]
1259 >> MATCH_MP_TAC PROB_POSITIVE
1260 >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
1261QED
1262
1263(* NOTE: for general prob_space *)
1264Theorem distribution_positive :
1265    !p X B s. prob_space p /\ random_variable X p B /\ sigma_algebra B /\
1266              s IN subsets B ==> 0 <= distribution p X s
1267Proof
1268    rw [distribution_def, random_variable_def, IN_MEASURABLE]
1269 >> MATCH_MP_TAC PROB_POSITIVE >> rw []
1270QED
1271
1272Theorem distribution_le_1 :
1273    !p X a. prob_space p /\ (events p = POW (p_space p)) ==>
1274            distribution p X a <= 1
1275Proof
1276    RW_TAC std_ss [distribution_def]
1277 >> MATCH_MP_TAC PROB_LE_1
1278 >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
1279QED
1280
1281(* NOTE: for general prob_space *)
1282Theorem distribution_le_one :
1283    !p X B s. prob_space p /\ random_variable X p B /\ sigma_algebra B /\
1284              s IN subsets B ==> distribution p X s <= 1
1285Proof
1286    rw [distribution_def, random_variable_def, IN_MEASURABLE]
1287 >> MATCH_MP_TAC PROB_LE_1 >> rw []
1288QED
1289
1290(* Theorem 3.1.3 [2, p.36], cf. measure_space_distr
1291
1292   NOTE: added ‘sigma_algebra s’ due to changes in ‘measurable’
1293 *)
1294Theorem distribution_prob_space : (* was: prob_space_distr *)
1295    !p X s. prob_space p /\ sigma_algebra s /\ random_variable X p s ==>
1296            prob_space (space s, subsets s, distribution p X)
1297Proof
1298    RW_TAC std_ss [random_variable_def, distribution_def, prob_space_def, measure_def, PSPACE,
1299                   measure_space_def, m_space_def, measurable_sets_def, IN_MEASURABLE,
1300                   SPACE, positive_def, PREIMAGE_EMPTY, INTER_EMPTY, PROB_EMPTY,
1301                   PROB_POSITIVE, space_def, subsets_def, countably_additive_def]
1302 >- (Q.PAT_X_ASSUM
1303       `!f. _ ==> measure p (BIGUNION (IMAGE f univ(:num))) = suminf (measure p o f)`
1304       (MP_TAC o Q.SPEC `(\x. PREIMAGE X x INTER p_space p) o f`) \\
1305     RW_TAC std_ss [prob_def, o_DEF, PREIMAGE_BIGUNION, IMAGE_IMAGE] \\
1306    `(BIGUNION (IMAGE (\x. PREIMAGE X (f x)) UNIV) INTER p_space p) =
1307     (BIGUNION (IMAGE (\x. PREIMAGE X (f x) INTER p_space p) UNIV))`
1308        by (RW_TAC std_ss [Once EXTENSION, IN_BIGUNION, IN_INTER, IN_IMAGE, IN_UNIV] \\
1309            METIS_TAC [IN_INTER]) \\
1310     POP_ORW \\
1311     POP_ASSUM MATCH_MP_TAC \\
1312     FULL_SIMP_TAC std_ss [o_DEF, IN_FUNSET, IN_UNIV, events_def] \\
1313     CONJ_TAC
1314     >- (rpt STRIP_TAC \\
1315         Suff `DISJOINT (PREIMAGE X (f i)) (PREIMAGE X (f j))`
1316         >- (RW_TAC std_ss [IN_DISJOINT, IN_INTER] >> METIS_TAC []) \\
1317         RW_TAC std_ss [PREIMAGE_DISJOINT]) \\
1318     Suff `BIGUNION (IMAGE (\x. PREIMAGE X (f x) INTER p_space p) UNIV) =
1319           PREIMAGE X (BIGUNION (IMAGE f UNIV)) INTER p_space p`
1320     >- RW_TAC std_ss [] \\
1321     RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_BIGUNION, IN_IMAGE, IN_UNIV,
1322                    IN_PREIMAGE, IN_BIGUNION] \\
1323     METIS_TAC [IN_INTER, IN_PREIMAGE])
1324 >> Suff `PREIMAGE X (space s) INTER p_space p = p_space p`
1325 >- RW_TAC std_ss [prob_def, p_space_def]
1326 >> FULL_SIMP_TAC std_ss [IN_FUNSET, EXTENSION, IN_PREIMAGE, IN_INTER]
1327 >> METIS_TAC []
1328QED
1329
1330(* `prob_space p` is added since it's not provided by random_variable_def
1331
1332   NOTE: added ‘sigma_algebra s’ due to changes in ‘measurable’
1333 *)
1334Theorem uniform_distribution_prob_space :
1335    !X p s. prob_space p /\ FINITE (p_space p) /\
1336            FINITE (space s) /\ sigma_algebra s /\ random_variable X p s ==>
1337            prob_space (space s, subsets s, uniform_distribution s)
1338Proof
1339    RW_TAC std_ss []
1340 >> `p_space p <> {}`
1341      by METIS_TAC [MEASURE_EMPTY, EVAL ``0 <> 1:extreal``, prob_space_def, p_space_def]
1342 >> `space s <> {}`
1343      by (FULL_SIMP_TAC std_ss [random_variable_def, IN_FUNSET,
1344                                IN_MEASURABLE, space_def] \\
1345          METIS_TAC [CHOICE_DEF, NOT_IN_EMPTY])
1346 >> `CARD (space s) <> 0` by METIS_TAC [CARD_EQ_0]
1347 >> Know `&CARD (space s) <> 0:extreal`
1348 >- (REWRITE_TAC [extreal_of_num_def] \\
1349     CCONTR_TAC >> fs [extreal_11]) >> DISCH_TAC
1350 >> `&CARD (space s) <> PosInf /\ &CARD (space s) <> NegInf`
1351      by METIS_TAC [extreal_of_num_def, extreal_not_infty]
1352 >> reverse (RW_TAC std_ss [prob_space_def, measure_def, m_space_def, PSPACE])
1353 >- RW_TAC std_ss [uniform_distribution_def, div_refl]
1354 >> MATCH_MP_TAC finite_additivity_sufficient_for_finite_spaces
1355 >> CONJ_TAC >- FULL_SIMP_TAC std_ss [random_variable_def, IN_MEASURABLE]
1356 >> CONJ_TAC >- RW_TAC std_ss []
1357 >> CONJ_TAC
1358 >- (RW_TAC real_ss [positive_def, measure_def, uniform_distribution_def, PREIMAGE_EMPTY,
1359                     CARD_EMPTY, INTER_EMPTY, measurable_sets_def, zero_div] \\
1360    `&CARD s' <> PosInf /\ &CARD s' <> NegInf`
1361       by METIS_TAC [extreal_of_num_def, extreal_not_infty] \\
1362    `0 <= CARD s' /\ 0 <= CARD (space s)` by RW_TAC std_ss [] \\
1363    `?a. &CARD s' = Normal a` by PROVE_TAC [extreal_cases] \\
1364    `?b. &CARD (space s) = Normal b` by PROVE_TAC [extreal_cases] \\
1365    `b <> 0` by PROVE_TAC [extreal_of_num_def, extreal_11] \\
1366    `0 <= a /\ 0 <= b` by PROVE_TAC [extreal_of_num_def, extreal_le_eq, REAL_LE] \\
1367     ASM_SIMP_TAC real_ss [extreal_div_eq, extreal_of_num_def, extreal_le_eq] \\
1368     RW_TAC real_ss [REAL_LE_MUL, REAL_LE_INV, real_div])
1369 >> RW_TAC std_ss [additive_def, measure_def, uniform_distribution_def, measurable_sets_def]
1370 >> FULL_SIMP_TAC std_ss [random_variable_def, IN_MEASURABLE, IN_FUNSET, space_def, subsets_def]
1371 >> `s' SUBSET space s /\ t SUBSET space s`
1372      by METIS_TAC [sigma_algebra_def, algebra_def, subset_class_def]
1373 >> `CARD (s' INTER t) = 0` by METIS_TAC [DISJOINT_DEF, CARD_EMPTY]
1374 >> `CARD (s' UNION t) = CARD s' + CARD t`  by METIS_TAC [CARD_UNION, ADD_0, SUBSET_FINITE]
1375 >> RW_TAC std_ss [GSYM REAL_ADD, extreal_of_num_def]
1376 >> ASM_SIMP_TAC real_ss [extreal_div_eq, extreal_add_def]
1377QED
1378
1379Theorem distribution_partition :
1380    !p X. prob_space p /\ (!x. x IN p_space p ==> {x} IN events p) /\
1381          FINITE (p_space p) /\ random_variable X p Borel ==>
1382         (SIGMA (\x. distribution p X {x}) (IMAGE X (p_space p)) = 1)
1383Proof
1384    RW_TAC std_ss []
1385 >> `random_variable X p (IMAGE X (p_space p), POW (IMAGE X (p_space p)))`
1386      by (RW_TAC std_ss [random_variable_def] \\
1387          RW_TAC std_ss [IN_MEASURABLE, IN_FUNSET, space_def, subsets_def,
1388                         IN_IMAGE,POW_SIGMA_ALGEBRA]
1389          >- METIS_TAC [] \\
1390          METIS_TAC [PROB_DISCRETE_EVENTS, INTER_SUBSET])
1391 >> `prob_space (space (IMAGE X (p_space p), POW (IMAGE X (p_space p))),
1392                 subsets (IMAGE X (p_space p), POW (IMAGE X (p_space p))),
1393                 distribution p X)`
1394     by (MATCH_MP_TAC distribution_prob_space >> art [] \\
1395         REWRITE_TAC [POW_SIGMA_ALGEBRA])
1396 >> (MP_TAC o Q.ISPEC `(space (IMAGE (X :'a->extreal) (p_space p), POW (IMAGE X (p_space p))),
1397                        subsets (IMAGE X (p_space p),POW (IMAGE X (p_space p))),
1398                        distribution p X)`) PROB_EXTREAL_SUM_IMAGE_SPACE
1399 >> RW_TAC std_ss []
1400 >> FULL_SIMP_TAC std_ss [space_def, subsets_def, p_space_def, events_def, m_space_def,
1401                          measurable_sets_def, prob_def, measure_def]
1402 >> `FINITE (IMAGE X (m_space p))` by METIS_TAC [IMAGE_FINITE]
1403 >> `(!x. x IN IMAGE X (m_space p) ==> {x} IN POW (IMAGE X (m_space p)))`
1404     by RW_TAC std_ss [IN_POW, SUBSET_DEF, IN_IMAGE, IN_SING]
1405 >> METIS_TAC []
1406QED
1407
1408Theorem distribution_space_eq_1 : (* was: lemma1 (normal_rvScript.sml) *)
1409    !p X. prob_space p ==> (distribution p X (IMAGE X (p_space p)) = 1)
1410Proof
1411    RW_TAC std_ss [prob_space_def, p_space_def]
1412 >> SIMP_TAC std_ss [distribution_def]
1413 >> SIMP_TAC std_ss [IMAGE_DEF, PREIMAGE_def, INTER_DEF, GSPECIFICATION]
1414 >> REWRITE_TAC [prob_def, p_space_def]
1415 >> REWRITE_TAC [SET_RULE ``{x | (?x''. (X x = X x'') /\ x'' IN s) /\ x IN s} = s``]
1416 >> ASM_REWRITE_TAC []
1417QED
1418
1419(* NOTE: added ‘sigma_algebra s’ due to changes in ‘measurable’ (‘random_variable’) *)
1420Theorem distribution_lebesgue_thm1 :
1421   !X p s A. prob_space p /\ sigma_algebra s /\
1422             random_variable X p s /\ A IN subsets s ==>
1423      (distribution p X A = integral p (indicator_fn (PREIMAGE X A INTER p_space p)))
1424Proof
1425   RW_TAC std_ss [random_variable_def, prob_space_def, distribution_def, events_def,
1426                  IN_MEASURABLE, p_space_def, prob_def, subsets_def, space_def,
1427                  GSYM integral_indicator]
1428QED
1429
1430(* NOTE: added ‘sigma_algebra s’ due to changes in ‘measurable’ (‘random_variable’) *)
1431Theorem distribution_lebesgue_thm2 :
1432    !X p s A. prob_space p /\ sigma_algebra s /\
1433              random_variable X p s /\ A IN subsets s ==>
1434      (distribution p X A = integral (space s, subsets s, distribution p X) (indicator_fn A))
1435Proof
1436    rpt STRIP_TAC
1437 >> `prob_space (space s,subsets s,distribution p X)`
1438     by RW_TAC std_ss [distribution_prob_space]
1439 >> Q.PAT_X_ASSUM `random_variable X p s` MP_TAC
1440 >> RW_TAC std_ss [random_variable_def, prob_space_def, distribution_def, events_def,
1441                   IN_MEASURABLE, p_space_def, prob_def, subsets_def, space_def]
1442 >> `measure p (PREIMAGE X A INTER m_space p) =
1443     measure (space s,subsets s,(\A. measure p (PREIMAGE X A INTER m_space p))) A`
1444     by RW_TAC std_ss [measure_def]
1445 >> POP_ORW
1446 >> (MP_TAC o Q.SPECL [`(space s,subsets s,\A. measure p (PREIMAGE X A INTER m_space p))`,`A`]
1447     o INST_TYPE [``:'a``|->``:'b``]) integral_indicator
1448 >> FULL_SIMP_TAC std_ss [measurable_sets_def, prob_space_def, distribution_def,
1449                          prob_def, p_space_def]
1450QED
1451
1452(* ************************************************************************* *)
1453
1454(* |- !X p.
1455         real_random_variable X p <=>
1456         prob_space p /\ X IN measurable (p_space p,events p) Borel /\
1457         !x. x IN p_space p ==> X x <> NegInf /\ X x <> PosInf *)
1458Theorem real_random_variable =
1459       (REWRITE_RULE [random_variable_def] real_random_variable_def)
1460
1461Theorem real_random_variable_zero :
1462    !p. prob_space p ==> real_random_variable (\x. 0) p
1463Proof
1464    RW_TAC std_ss [prob_space_def, real_random_variable_def,
1465                   random_variable_def, p_space_def, events_def, num_not_infty]
1466 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST'
1467 >> FULL_SIMP_TAC std_ss [measure_space_def]
1468QED
1469
1470Theorem real_random_variable_const :
1471    !p m. prob_space p /\ m <> PosInf /\ m <> NegInf ==>
1472          real_random_variable (\x. m) p
1473Proof
1474    RW_TAC std_ss [real_random_variable, p_space_def, events_def]
1475 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST'
1476 >> FULL_SIMP_TAC std_ss [prob_space_def, measure_space_def]
1477QED
1478
1479Theorem real_random_variable_add :
1480    !p X Y. prob_space p /\ real_random_variable X p /\
1481            real_random_variable Y p ==> real_random_variable (\x. X x + Y x) p
1482Proof
1483    RW_TAC std_ss [prob_space_def, real_random_variable_def,
1484                   random_variable_def, p_space_def, events_def]
1485 >| [ (* goal 1 (of 3) *)
1486      MATCH_MP_TAC IN_MEASURABLE_BOREL_ADD \\
1487      qexistsl_tac [`X`, `Y`] >> fs [measure_space_def, space_def],
1488      (* goal 2 (of 3) *)
1489     `?a. X x = Normal a` by METIS_TAC [extreal_cases] \\
1490     `?b. Y x = Normal b` by METIS_TAC [extreal_cases] \\
1491      rw [extreal_not_infty, extreal_add_def],
1492      (* goal 3 (of 3) *)
1493     `?a. X x = Normal a` by METIS_TAC [extreal_cases] \\
1494     `?b. Y x = Normal b` by METIS_TAC [extreal_cases] \\
1495      rw [extreal_not_infty, extreal_add_def] ]
1496QED
1497
1498Theorem real_random_variable_sub :
1499    !p X Y. prob_space p /\ real_random_variable X p /\
1500            real_random_variable Y p ==> real_random_variable (\x. X x - Y x) p
1501Proof
1502    RW_TAC std_ss [prob_space_def, real_random_variable_def,
1503                   random_variable_def, p_space_def, events_def]
1504 >| [ (* goal 1 (of 3) *)
1505      MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
1506      qexistsl_tac [`X`, `Y`] >> fs [measure_space_def, space_def],
1507      (* goal 2 (of 3) *)
1508     `?a. X x = Normal a` by METIS_TAC [extreal_cases] \\
1509     `?b. Y x = Normal b` by METIS_TAC [extreal_cases] \\
1510      rw [extreal_not_infty, extreal_sub_def],
1511      (* goal 3 (of 3) *)
1512     `?a. X x = Normal a` by METIS_TAC [extreal_cases] \\
1513     `?b. Y x = Normal b` by METIS_TAC [extreal_cases] \\
1514      rw [extreal_not_infty, extreal_sub_def] ]
1515QED
1516
1517Theorem real_random_variable_ainv :
1518    !p X. prob_space p /\ real_random_variable X p ==> real_random_variable (\x. -X x) p
1519Proof
1520    rpt STRIP_TAC
1521 >> MP_TAC (Q.SPECL [‘p’, ‘\x. 0’, ‘X’] real_random_variable_sub)
1522 >> ‘real_random_variable (\x. 0) p’ by PROVE_TAC [real_random_variable_zero]
1523 >> RW_TAC std_ss [sub_lzero]
1524QED
1525
1526Theorem real_random_variable_cmul :
1527    !p X r. prob_space p /\ real_random_variable X p ==>
1528            real_random_variable (\x. Normal r * X x) p
1529Proof
1530    rpt GEN_TAC
1531 >> simp [real_random_variable, prob_space_def, p_space_def, events_def]
1532 >> STRIP_TAC
1533 >> CONJ_TAC (* Borel_measurable *)
1534 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_CMUL \\
1535     qexistsl_tac [‘X’, ‘r’] >> rw [] \\
1536     FULL_SIMP_TAC std_ss [measure_space_def])
1537 >> Q.X_GEN_TAC ‘x’
1538 >> DISCH_TAC
1539 >> ‘?z. X x = Normal z’ by METIS_TAC [extreal_cases] >> POP_ORW
1540 >> rw [extreal_mul_def]
1541QED
1542
1543Theorem real_random_variable_cdiv :
1544    !p X c. prob_space p /\ real_random_variable X p /\ c <> 0 ==>
1545            real_random_variable (\x. X x / Normal c) p
1546Proof
1547    rw [extreal_div_def, extreal_inv_def, Once mul_comm]
1548 >> MATCH_MP_TAC real_random_variable_cmul >> art []
1549QED
1550
1551Theorem real_random_variable_sum :
1552    !p X (J :'index set). prob_space p /\ FINITE J /\
1553         (!i. i IN J ==> real_random_variable (X i) p) ==>
1554          real_random_variable (\x. SIGMA (\n. X n x) J) p
1555Proof
1556    RW_TAC std_ss [real_random_variable]
1557 >| [ (* goal 1 (of 3) *)
1558      MATCH_MP_TAC (INST_TYPE [“:'b” |-> “:'index”] IN_MEASURABLE_BOREL_SUM) \\
1559      qexistsl_tac [‘X’, ‘J’] \\
1560     ‘sigma_algebra (p_space p,events p)’
1561        by METIS_TAC [prob_space_def, measure_space_def, p_space_def, events_def] \\
1562      rw [],
1563      (* goal 2 (of 3) *)
1564      MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF \\
1565      RW_TAC std_ss [],
1566      (* goal 3 (of 3) *)
1567      MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF \\
1568      RW_TAC std_ss [] ]
1569QED
1570
1571(* NOTE: added ‘prob_space p’ due to changes of ‘measurable’ *)
1572Theorem real_random_variable_fn_plus :
1573    !p X. prob_space p /\ real_random_variable X p ==>
1574          real_random_variable (fn_plus X) p
1575Proof
1576    rpt STRIP_TAC
1577 >> ‘sigma_algebra (measurable_space p)’
1578      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
1579 >> fs [real_random_variable, p_space_def, events_def]
1580 >> CONJ_TAC
1581 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_PLUS >> art [])
1582 >> NTAC 3 STRIP_TAC
1583 >- (MATCH_MP_TAC pos_not_neginf >> rw [FN_PLUS_POS])
1584 >> MATCH_MP_TAC FN_PLUS_NOT_INFTY >> rw []
1585QED
1586
1587(* NOTE: added ‘prob_space p’ due to changes of ‘measurable’ *)
1588Theorem real_random_variable_fn_minus :
1589    !p X. prob_space p /\ real_random_variable X p ==>
1590          real_random_variable (fn_minus X) p
1591Proof
1592    rpt STRIP_TAC
1593 >> ‘sigma_algebra (measurable_space p)’
1594      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
1595 >> fs [real_random_variable, p_space_def, events_def]
1596 >> CONJ_TAC
1597 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_MINUS >> art [])
1598 >> NTAC 3 STRIP_TAC
1599 >- (MATCH_MP_TAC pos_not_neginf >> rw [FN_MINUS_POS])
1600 >> MATCH_MP_TAC FN_MINUS_NOT_INFTY >> rw []
1601QED
1602
1603Theorem real_random_variable_mul_indicator :
1604    !p E X. prob_space p /\ E IN events p /\ real_random_variable X p ==>
1605            real_random_variable (\x. X x * indicator_fn E x) p
1606Proof
1607    RW_TAC std_ss [real_random_variable]
1608 >- (HO_MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
1609     fs [prob_space_def, measure_space_def, p_space_def, events_def])
1610 >> ‘?r. 0 <= r /\ r <= 1 /\ indicator_fn E x = Normal r’
1611        by METIS_TAC [indicator_fn_normal] >> POP_ORW
1612 >> ONCE_REWRITE_TAC [mul_comm]
1613 >> METIS_TAC [mul_not_infty]
1614QED
1615
1616Theorem random_variable_cong :
1617    !p X Y A. (!x. x IN p_space p ==> X x = Y x) ==>
1618              (random_variable X p A <=> random_variable Y p A)
1619Proof
1620    rw [random_variable_def]
1621 >> EQ_TAC >> rw []
1622 >| [ (* goal 1 (of 2) *)
1623      fs [p_space_def, events_def, IN_MEASURABLE, IN_FUNSET, PREIMAGE_def] \\
1624      CONJ_TAC >- METIS_TAC [] \\
1625      rpt STRIP_TAC \\
1626      Suff ‘{x | Y x IN s} INTER m_space p =
1627            {x | X x IN s} INTER m_space p’ >- METIS_TAC [] \\
1628      rw [Once EXTENSION] >> METIS_TAC [],
1629      (* goal 2 (of 2) *)
1630      fs [p_space_def, events_def, IN_MEASURABLE, IN_FUNSET, PREIMAGE_def] \\
1631      rpt STRIP_TAC \\
1632      Suff ‘{x | X x IN s} INTER m_space p =
1633            {x | Y x IN s} INTER m_space p’ >- METIS_TAC [] \\
1634      rw [Once EXTENSION] >> METIS_TAC [] ]
1635QED
1636
1637Theorem real_random_variable_cong :
1638    !p X Y. (!x. x IN p_space p ==> X x = Y x) ==>
1639            (real_random_variable X p <=> real_random_variable Y p)
1640Proof
1641    rw [real_random_variable]
1642 >> EQ_TAC >> rw []
1643 >| [ (* goal 1 (of 2) *)
1644      fs [p_space_def, events_def] \\
1645      MATCH_MP_TAC IN_MEASURABLE_BOREL_EQ \\
1646      Q.EXISTS_TAC ‘X’ >> rw [],
1647      (* goal 2 (of 2) *)
1648      fs [p_space_def, events_def] \\
1649      MATCH_MP_TAC IN_MEASURABLE_BOREL_EQ \\
1650      Q.EXISTS_TAC ‘Y’ >> rw [] ]
1651QED
1652
1653Theorem real_random_variable_equiv :
1654    !p X. prob_space p ==>
1655          (real_random_variable (Normal o X) p <=>
1656             random_variable X p borel)
1657Proof
1658    rw [real_random_variable_def, random_variable_def,
1659        AND_INTRO_THM, EQ_IMP_THM]
1660 >- (MP_TAC (Q.SPECL [‘(p_space p,events p)’, ‘Normal o X’]
1661             in_borel_measurable_from_Borel) \\
1662     FULL_SIMP_TAC std_ss [SIGMA_ALGEBRA_BOREL, prob_space_def,
1663                           p_space_def, events_def, measure_space_def] \\
1664     rw [o_DEF] \\
1665     METIS_TAC [])
1666 >> irule IN_MEASURABLE_BOREL_IMP_BOREL'
1667 >> FULL_SIMP_TAC std_ss [SIGMA_ALGEBRA_BOREL, prob_space_def, p_space_def, events_def, measure_space_def]
1668QED
1669
1670Theorem real_random_variable_abs :
1671    !p X.
1672          prob_space p /\ real_random_variable X p ==>
1673          real_random_variable (λx. abs (X x)) p
1674Proof
1675    rpt STRIP_TAC
1676 >> fs [real_random_variable, prob_space_def, p_space_def, events_def]
1677 >> CONJ_TAC
1678 (* (λx. abs (X x)) IN Borel_measurable (measurable_space p) *)
1679 >- (irule IN_MEASURABLE_BOREL_ABS \\
1680     FULL_SIMP_TAC std_ss [SIGMA_ALGEBRA_BOREL, measure_space_def] \\
1681     qexists ‘X’ \\
1682     simp [])
1683 (* !x. x IN m_space p ==> abs (X x) <> - ∞ /\ abs (X x) <> +∞ *)
1684 >> Q.X_GEN_TAC ‘x’
1685 >> DISCH_TAC
1686 >> ‘?z. X x = Normal z’ by METIS_TAC [extreal_cases] >> POP_ORW
1687 >> rw[extreal_abs_def]
1688QED
1689
1690Theorem real_random_variable_exp :
1691  !p X r. prob_space p /\ real_random_variable X p ==> real_random_variable (λx. exp (X x)) p
1692Proof
1693  rpt GEN_TAC
1694  >> simp [real_random_variable, prob_space_def, p_space_def, events_def]
1695  >> STRIP_TAC
1696  >> CONJ_TAC
1697  >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_EXP >>  qexists_tac ‘X’ >> rw [])
1698  >> Q.X_GEN_TAC ‘x’
1699  >> DISCH_TAC
1700  >> ‘?z. X x = Normal z’ by METIS_TAC [extreal_cases] >> POP_ORW
1701  >> rw[extreal_exp_def]
1702QED
1703
1704Theorem real_random_variable_exp_normal :
1705    !p X r s. prob_space p /\ real_random_variable X p ==>
1706              real_random_variable (λx. exp (Normal s * X x)) p
1707Proof
1708    rw [real_random_variable_cmul, real_random_variable_exp]
1709QED
1710
1711Theorem real_random_variable_sum_cdiv :
1712  !p X s n. prob_space p /\
1713            (!i. i IN (count n) ==> real_random_variable (X i) p) /\
1714            0 < s n /\ s n <> PosInf /\ s n <> NegInf  ==>
1715            real_random_variable ((λx. ∑ (λi. X i x) (count n) / s n)) p
1716Proof
1717  rpt STRIP_TAC
1718  >> BETA_TAC
1719  >> ‘?r. Normal r = s n’ by METIS_TAC [extreal_cases]
1720  >> ‘0 < r’ by POP_ASSUM (fs o wrap o SYM)
1721  >> Know ‘!x. ∑ (λi. X i x) (count n) / s n = ∑ (λi. X i x) (count n) / Normal r’
1722  >- (qx_gen_tac ‘x’ \\
1723      POP_ORW \\
1724      rw [])
1725  >> DISCH_TAC
1726  >> Know ‘real_random_variable (λx. ∑ (λi. X i x) (count n)) p’
1727  >- (HO_MATCH_MP_TAC real_random_variable_sum \\
1728      rw [])
1729  >> DISCH_TAC
1730  >> Know ‘real_random_variable (λx. ∑ (λi. X i x) (count n) / Normal r) p’
1731  >- (HO_MATCH_MP_TAC real_random_variable_cdiv \\
1732      simp [] \\
1733      ‘r <> 0’ by METIS_TAC [REAL_LT_IMP_NE] \\
1734      fs [])
1735  >> DISCH_TAC
1736  >> METIS_TAC []
1737QED
1738
1739(* added `integrable p X`, otherwise `expectation p X` is not defined *)
1740Theorem finite_expectation1:
1741    !p X. prob_space p /\ FINITE (p_space p) /\
1742          real_random_variable X p /\ integrable p X ==>
1743         (expectation p X =
1744          SIGMA (\r. r * prob p (PREIMAGE X {r} INTER p_space p)) (IMAGE X (p_space p)))
1745Proof
1746    RW_TAC std_ss [expectation_def, p_space_def, prob_def, prob_space_def,
1747                   real_random_variable, events_def]
1748 >> (MATCH_MP_TAC o REWRITE_RULE [finite_space_integral_def]) finite_space_integral_reduce
1749 >> RW_TAC std_ss [num_lt_infty]
1750QED
1751
1752(* added `integrable p X`, otherwise `expectation p X` is not defined *)
1753Theorem finite_expectation2:
1754    !p X. prob_space p /\ FINITE (IMAGE X (p_space p)) /\
1755          real_random_variable X p /\ integrable p X ==>
1756         (expectation p X =
1757          SIGMA (\r. r * prob p (PREIMAGE X {r} INTER p_space p)) (IMAGE X (p_space p)))
1758Proof
1759    RW_TAC std_ss [expectation_def, p_space_def, prob_def, prob_space_def,
1760                   real_random_variable, events_def]
1761 >> (MATCH_MP_TAC o REWRITE_RULE [finite_space_integral_def]) finite_support_integral_reduce
1762 >> RW_TAC std_ss [num_lt_infty]
1763QED
1764
1765(* added `integrable p X`, otherwise `expectation p X` is not defined *)
1766Theorem finite_expectation:
1767    !p X. prob_space p /\ FINITE (p_space p) /\
1768          real_random_variable X p /\ integrable p X ==>
1769         (expectation p X = SIGMA (\r. r * distribution p X {r}) (IMAGE X (p_space p)))
1770Proof
1771    RW_TAC std_ss [distribution_def]
1772 >> METIS_TAC [finite_expectation1]
1773QED
1774
1775(* added `integrable p X`, otherwise `expectation p X` is not defined *)
1776Theorem finite_support_expectation:
1777    !p X. prob_space p /\ FINITE (IMAGE X (p_space p)) /\
1778          real_random_variable X p /\ integrable p X ==>
1779         (expectation p X = SIGMA (\r. r * distribution p X {r}) (IMAGE X (p_space p)))
1780Proof
1781    RW_TAC std_ss [distribution_def]
1782 >> METIS_TAC [finite_expectation2]
1783QED
1784
1785(* ************************************************************************* *)
1786
1787Theorem finite_marginal_product_space_POW:
1788    !p X Y. prob_space p /\ FINITE (p_space p) /\ (POW (p_space p) = events p) /\
1789            random_variable X p (IMAGE X (p_space p), POW (IMAGE X (p_space p))) /\
1790            random_variable Y p (IMAGE Y (p_space p), POW (IMAGE Y (p_space p)))
1791        ==> measure_space (((IMAGE X (p_space p)) CROSS (IMAGE Y (p_space p))),
1792                           POW ((IMAGE X (p_space p)) CROSS (IMAGE Y (p_space p))),
1793                           (\a. prob p (PREIMAGE (\x. (X x,Y x)) a INTER p_space p)))
1794Proof
1795     rpt STRIP_TAC
1796 >> `(IMAGE X (p_space p) CROSS IMAGE Y (p_space p),
1797      POW (IMAGE X (p_space p) CROSS IMAGE Y (p_space p)),
1798      (\a. prob p (PREIMAGE (\x. (X x,Y x)) a INTER p_space p))) =
1799     (space (IMAGE X (p_space p) CROSS IMAGE Y (p_space p),
1800             POW (IMAGE X (p_space p) CROSS IMAGE Y (p_space p))),
1801      subsets (IMAGE X (p_space p) CROSS IMAGE Y (p_space p),
1802               POW (IMAGE X (p_space p) CROSS IMAGE Y (p_space p))),
1803      (\a. prob p (PREIMAGE (\x. (X x,Y x)) a INTER p_space p)))`
1804        by RW_TAC std_ss [space_def, subsets_def]
1805 >> POP_ORW
1806 >> MATCH_MP_TAC finite_additivity_sufficient_for_finite_spaces
1807 >> RW_TAC std_ss [POW_SIGMA_ALGEBRA, space_def, FINITE_CROSS, subsets_def, IMAGE_FINITE]
1808 >- (RW_TAC std_ss [positive_def, measure_def, measurable_sets_def, PREIMAGE_EMPTY, INTER_EMPTY]
1809     >- FULL_SIMP_TAC std_ss [random_variable_def, PROB_EMPTY] \\
1810     METIS_TAC [PROB_POSITIVE, SUBSET_DEF, IN_POW, IN_INTER, random_variable_def])
1811 >> RW_TAC std_ss [additive_def, measure_def, measurable_sets_def]
1812 >> MATCH_MP_TAC PROB_ADDITIVE
1813 >> Q.PAT_X_ASSUM `POW (p_space p) = events p` (MP_TAC o GSYM)
1814 >> FULL_SIMP_TAC std_ss [IN_POW, SUBSET_DEF, IN_PREIMAGE, IN_CROSS, IN_DISJOINT,
1815                          random_variable_def, IN_INTER]
1816 >> RW_TAC std_ss [] >- METIS_TAC [SND]
1817 >> RW_TAC std_ss [Once EXTENSION, IN_UNION, IN_PREIMAGE, IN_INTER]
1818 >> METIS_TAC []
1819QED
1820
1821Theorem finite_marginal_product_space_POW2:
1822    !p s1 s2 X Y. prob_space p /\ FINITE (p_space p) /\ (POW (p_space p) = events p) /\
1823                  random_variable X p (s1, POW s1) /\
1824                  random_variable Y p (s2, POW s2) /\ FINITE s1 /\ FINITE s2
1825              ==> measure_space (s1 CROSS s2,POW (s1 CROSS s2),joint_distribution p X Y)
1826Proof
1827 (* proof *)
1828    rpt STRIP_TAC
1829 >> `(s1 CROSS s2, POW (s1 CROSS s2), joint_distribution p X Y) =
1830     (space (s1 CROSS s2, POW (s1 CROSS s2)),
1831      subsets (s1 CROSS s2, POW (s1 CROSS s2)),
1832      joint_distribution p X Y)`
1833        by RW_TAC std_ss [space_def, subsets_def]
1834 >> POP_ORW
1835 >> MATCH_MP_TAC finite_additivity_sufficient_for_finite_spaces
1836 >> RW_TAC std_ss [POW_SIGMA_ALGEBRA, space_def, FINITE_CROSS, subsets_def]
1837 >- (RW_TAC std_ss [positive_def, measure_def, measurable_sets_def, PREIMAGE_EMPTY, INTER_EMPTY,
1838                    joint_distribution_def]
1839     >- FULL_SIMP_TAC std_ss [random_variable_def, PROB_EMPTY] \\
1840     METIS_TAC [PROB_POSITIVE, SUBSET_DEF, IN_POW, IN_INTER, random_variable_def])
1841 >> RW_TAC std_ss [additive_def, measure_def, measurable_sets_def, joint_distribution_def]
1842 >> MATCH_MP_TAC PROB_ADDITIVE
1843 >> Q.PAT_X_ASSUM `POW (p_space p) = events p` (MP_TAC o GSYM)
1844 >> FULL_SIMP_TAC std_ss [IN_POW, SUBSET_DEF, IN_PREIMAGE, IN_CROSS, IN_DISJOINT,
1845                          random_variable_def, IN_INTER]
1846 >> RW_TAC std_ss [] >- METIS_TAC [SND]
1847 >> RW_TAC std_ss [Once EXTENSION, IN_UNION, IN_PREIMAGE, IN_INTER]
1848 >> METIS_TAC []
1849QED
1850
1851Theorem finite_marginal_product_space_POW3 :
1852    !p s1 s2 s3 X Y Z.
1853       prob_space p /\ FINITE (p_space p) /\ (POW (p_space p) = events p) /\
1854       random_variable X p (s1, POW s1) /\
1855       random_variable Y p (s2, POW s2) /\
1856       random_variable Z p (s3, POW s3) /\
1857       FINITE s1 /\ FINITE s2 /\ FINITE s3 ==>
1858       measure_space (s1 CROSS (s2 CROSS s3), POW (s1 CROSS (s2 CROSS s3)),
1859                      joint_distribution3 p X Y Z)
1860Proof
1861    rpt STRIP_TAC
1862 >> `(s1 CROSS (s2 CROSS s3), POW (s1 CROSS (s2 CROSS s3)), joint_distribution3 p X Y Z) =
1863     (space (s1 CROSS (s2 CROSS s3), POW (s1 CROSS (s2 CROSS s3))),
1864      subsets (s1 CROSS (s2 CROSS s3), POW (s1 CROSS (s2 CROSS s3))),
1865      joint_distribution3 p X Y Z)`
1866        by RW_TAC std_ss [space_def, subsets_def]
1867 >> POP_ORW
1868 >> MATCH_MP_TAC finite_additivity_sufficient_for_finite_spaces
1869 >> RW_TAC std_ss [POW_SIGMA_ALGEBRA, space_def, FINITE_CROSS, subsets_def]
1870 >- (RW_TAC std_ss [positive_def, measure_def, measurable_sets_def, PREIMAGE_EMPTY,
1871                    INTER_EMPTY, joint_distribution3_def]
1872     >- FULL_SIMP_TAC std_ss [random_variable_def, PROB_EMPTY] \\
1873     METIS_TAC [PROB_POSITIVE, SUBSET_DEF, IN_POW, IN_INTER, random_variable_def])
1874 >> RW_TAC std_ss [additive_def, measure_def, measurable_sets_def, joint_distribution3_def]
1875 >> MATCH_MP_TAC PROB_ADDITIVE
1876 >> Q.PAT_X_ASSUM `POW (p_space p) = events p` (MP_TAC o GSYM)
1877 >> FULL_SIMP_TAC std_ss [IN_POW, SUBSET_DEF, IN_PREIMAGE, IN_CROSS, IN_DISJOINT,
1878                          random_variable_def, IN_INTER]
1879 >> RW_TAC std_ss [] >- METIS_TAC [SND]
1880 >> RW_TAC std_ss [Once EXTENSION, IN_UNION, IN_PREIMAGE, IN_INTER]
1881 >> METIS_TAC []
1882QED
1883
1884Theorem prob_x_eq_1_imp_prob_y_eq_0:
1885    !p x. prob_space p /\ {x} IN events p /\ (prob p {x} = 1) ==>
1886          !y. {y} IN events p /\ y <> x ==> (prob p {y} = 0)
1887Proof
1888    rpt STRIP_TAC
1889 >> (MP_TAC o Q.SPECL [`p`, `{y}`, `{x}`]) PROB_ONE_INTER
1890 >> RW_TAC std_ss []
1891 >> Know `{y} INTER {x} = {}`
1892 >- RW_TAC std_ss [Once EXTENSION, NOT_IN_EMPTY, IN_INTER, IN_SING]
1893 >> METIS_TAC [PROB_EMPTY]
1894QED
1895
1896(* NOTE: this is the last theorem in HVG's "probability_hvgScript.sml" *)
1897Theorem distribution_x_eq_1_imp_distribution_y_eq_0 :
1898    !X p x. prob_space p /\
1899            random_variable X p (IMAGE X (p_space p),POW (IMAGE X (p_space p))) /\
1900           (distribution p X {x} = 1)
1901        ==> !y. y <> x ==> (distribution p X {y} = 0)
1902Proof
1903    rpt STRIP_TAC
1904 >> (MP_TAC o Q.SPECL [`p`, `X`, `(IMAGE X (p_space p),POW (IMAGE X (p_space p)))`])
1905        distribution_prob_space
1906 >> RW_TAC std_ss [space_def, subsets_def, POW_SIGMA_ALGEBRA]
1907 >> (MP_TAC o Q.ISPECL [`(IMAGE (X :'a -> 'b) (p_space (p :'a p_space)),
1908                                POW (IMAGE X (p_space p)),distribution p X)`, `x:'b`])
1909        prob_x_eq_1_imp_prob_y_eq_0
1910 >> SIMP_TAC std_ss [EVENTS, IN_POW, SUBSET_DEF, IN_SING, PROB]
1911 >> `x IN IMAGE X (p_space p)`
1912       by (FULL_SIMP_TAC std_ss [distribution_def, IN_IMAGE] \\
1913           SPOSE_NOT_THEN STRIP_ASSUME_TAC \\
1914          `PREIMAGE X {x} INTER p_space p = {}`
1915             by (RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_SING, IN_PREIMAGE, NOT_IN_EMPTY] \\
1916                 METIS_TAC []) \\
1917           METIS_TAC [random_variable_def, PROB_EMPTY, ne_01])
1918 >> POP_ORW
1919 >> RW_TAC std_ss []
1920 >> Cases_on `y IN IMAGE X (p_space p)` >- ASM_SIMP_TAC std_ss []
1921 >> FULL_SIMP_TAC std_ss [distribution_def, IN_IMAGE]
1922 >> `PREIMAGE X {y} INTER p_space p = {}`
1923     by (RW_TAC std_ss [Once EXTENSION, IN_INTER, IN_SING, IN_PREIMAGE, NOT_IN_EMPTY]
1924         >> METIS_TAC [])
1925 >> POP_ORW
1926 >> MATCH_MP_TAC PROB_EMPTY
1927 >> FULL_SIMP_TAC std_ss [random_variable_def]
1928QED
1929
1930Theorem joint_distribution_sym:
1931    !p X Y a b. prob_space p ==>
1932               (joint_distribution p X Y (a CROSS b) = joint_distribution p Y X (b CROSS a))
1933Proof
1934    RW_TAC std_ss [joint_distribution_def]
1935 >> Suff `PREIMAGE (\x. (X x,Y x)) (a CROSS b) INTER p_space p =
1936          PREIMAGE (\x. (Y x,X x)) (b CROSS a) INTER p_space p`
1937 >- METIS_TAC []
1938 >> RW_TAC std_ss [EXTENSION, IN_INTER, IN_PREIMAGE, IN_CROSS]
1939 >> METIS_TAC []
1940QED
1941
1942Theorem joint_distribution_pos:
1943    !p X Y a. prob_space p /\ (events p = POW (p_space p)) ==>
1944              0 <= joint_distribution p X Y a
1945Proof
1946    RW_TAC std_ss [joint_distribution_def]
1947 >> MATCH_MP_TAC PROB_POSITIVE
1948 >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
1949QED
1950
1951Theorem joint_distribution_le_1:
1952    !p X Y a. prob_space p /\ (events p = POW (p_space p)) ==>
1953             (joint_distribution p X Y a <= 1)
1954Proof
1955    RW_TAC std_ss [joint_distribution_def]
1956 >> MATCH_MP_TAC PROB_LE_1
1957 >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
1958QED
1959
1960Theorem joint_distribution_not_infty :
1961    !p X Y a. prob_space p /\ (events p = POW (p_space p)) ==>
1962              joint_distribution p X Y a <> NegInf /\
1963              joint_distribution p X Y a <> PosInf
1964Proof
1965    rpt GEN_TAC >> STRIP_TAC
1966 >> `0 <= joint_distribution p X Y a` by PROVE_TAC [joint_distribution_pos]
1967 >> `joint_distribution p X Y a <= 1` by PROVE_TAC [joint_distribution_le_1]
1968 >> CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> art [])
1969 >> REWRITE_TAC [lt_infty]
1970 >> MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `1` >> art []
1971 >> REWRITE_TAC [extreal_of_num_def, lt_infty]
1972QED
1973
1974Theorem joint_distribution_le:
1975    !p X Y a b. prob_space p /\ (events p = POW (p_space p)) ==>
1976                joint_distribution p X Y (a CROSS b) <= distribution p X a
1977Proof
1978    RW_TAC std_ss [joint_distribution_def,distribution_def]
1979 >> MATCH_MP_TAC PROB_INCREASING
1980 >> RW_TAC std_ss [IN_POW,INTER_SUBSET]
1981 >> RW_TAC std_ss [SUBSET_DEF,IN_PREIMAGE,IN_CROSS,IN_INTER]
1982QED
1983
1984Theorem joint_distribution_le2:
1985    !p X Y a b. prob_space p /\ (events p = POW (p_space p)) ==>
1986                joint_distribution p X Y (a CROSS b) <= distribution p Y b
1987Proof
1988    RW_TAC std_ss [joint_distribution_def,distribution_def]
1989 >> MATCH_MP_TAC PROB_INCREASING
1990 >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
1991 >> RW_TAC std_ss [SUBSET_DEF, IN_PREIMAGE, IN_CROSS,IN_INTER]
1992QED
1993
1994Theorem distribution_not_infty :
1995    !p X a. prob_space p /\ (events p = POW (p_space p)) ==>
1996            distribution p X a <> NegInf /\
1997            distribution p X a <> PosInf
1998Proof
1999    rpt GEN_TAC >> STRIP_TAC
2000 >> `0 <= distribution p X a` by PROVE_TAC [distribution_pos]
2001 >> `distribution p X a <= 1` by PROVE_TAC [distribution_le_1]
2002 >> CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> art [])
2003 >> REWRITE_TAC [lt_infty]
2004 >> MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `1` >> art []
2005 >> REWRITE_TAC [extreal_of_num_def, lt_infty]
2006QED
2007
2008(* NOTE: more general version of the above theorem *)
2009Theorem distribution_finite :
2010    !p X B s. prob_space p /\ random_variable X p B /\
2011              sigma_algebra B /\ s IN subsets B ==>
2012              distribution p X s <> NegInf /\
2013              distribution p X s <> PosInf
2014Proof
2015    rpt GEN_TAC >> STRIP_TAC
2016 >> ‘0 <= distribution p X s /\ distribution p X s <= 1’
2017      by PROVE_TAC [distribution_positive, distribution_le_one]
2018 >> CONJ_TAC >- (MATCH_MP_TAC pos_not_neginf >> art [])
2019 >> REWRITE_TAC [lt_infty]
2020 >> Q_TAC (TRANS_TAC let_trans) ‘1’ >> rw []
2021QED
2022
2023Theorem joint_conditional :
2024    !p X Y a b. prob_space p /\ (events p = POW (p_space p)) ==>
2025               (joint_distribution p X Y (a CROSS b) =
2026                conditional_distribution p Y X b a * distribution p X a)
2027Proof
2028    RW_TAC std_ss [conditional_distribution_def, Once joint_distribution_sym]
2029 >> Cases_on `distribution p X a = 0`
2030 >- METIS_TAC [le_antisym, joint_distribution_pos, joint_distribution_le,
2031               joint_distribution_sym, mul_rzero]
2032 >> `distribution p X a <> NegInf /\ distribution p X a <> PosInf`
2033      by PROVE_TAC [distribution_not_infty]
2034 >> `?r. distribution p X a = Normal r` by PROVE_TAC [extreal_cases]
2035 >> fs []
2036 >> `r <> 0` by METIS_TAC [extreal_of_num_def, extreal_11]
2037 >> ASM_SIMP_TAC std_ss [div_mul_refl]
2038QED
2039
2040(* add `distribution p Y b <> 0` as divide-by-zero is not
2041   supported by (new) extreals *)
2042Theorem conditional_distribution_pos :
2043    !p X Y a b. prob_space p /\ (events p = POW (p_space p)) /\
2044                distribution p Y b <> 0 ==>
2045                0 <= conditional_distribution p X Y a b
2046Proof
2047    RW_TAC std_ss [conditional_distribution_def, distribution_pos,
2048                   joint_distribution_pos]
2049 >> `0 <= distribution p Y b` by PROVE_TAC [distribution_pos]
2050 >> `distribution p Y b <> NegInf /\ distribution p Y b <> PosInf`
2051      by PROVE_TAC [distribution_not_infty]
2052 >> `?r. distribution p Y b = Normal r` by PROVE_TAC [extreal_cases]
2053 >> `0 <= joint_distribution p X Y (a CROSS b)`
2054      by PROVE_TAC [joint_distribution_pos]
2055 >> `joint_distribution p X Y (a CROSS b) <> NegInf /\
2056     joint_distribution p X Y (a CROSS b) <> PosInf`
2057      by PROVE_TAC [joint_distribution_not_infty]
2058 >> `?c. joint_distribution p X Y (a CROSS b) = Normal c`
2059      by PROVE_TAC [extreal_cases]
2060 >> fs []
2061 >> `r <> 0` by PROVE_TAC [extreal_of_num_def, extreal_11]
2062 >> `0 <= r /\ 0 <= c` by PROVE_TAC [extreal_of_num_def, extreal_le_eq]
2063 >> rw [extreal_div_eq, extreal_of_num_def, extreal_le_eq]
2064 >> RW_TAC real_ss [real_div, REAL_LE_MUL, REAL_LE_INV]
2065QED
2066
2067(* add `distribution p Y b <> 0` as divide-by-zero is not
2068   supported by (new) extreals *)
2069Theorem conditional_distribution_le_1 :
2070    !p X Y a b. prob_space p /\ (events p = POW (p_space p)) /\
2071                distribution p Y b <> 0 ==>
2072                conditional_distribution p X Y a b <= 1
2073Proof
2074    RW_TAC std_ss [conditional_distribution_def]
2075 >> `joint_distribution p X Y (a CROSS b) <= distribution p Y b`
2076      by PROVE_TAC [joint_distribution_le2]
2077 >> `0 <= distribution p Y b` by PROVE_TAC [distribution_pos]
2078 >> `distribution p Y b <> NegInf /\ distribution p Y b <> PosInf`
2079      by PROVE_TAC [distribution_not_infty]
2080 >> `?r. distribution p Y b = Normal r` by PROVE_TAC [extreal_cases]
2081 >> `0 <= joint_distribution p X Y (a CROSS b)`
2082      by PROVE_TAC [joint_distribution_pos]
2083 >> `joint_distribution p X Y (a CROSS b) <> NegInf /\
2084     joint_distribution p X Y (a CROSS b) <> PosInf`
2085      by PROVE_TAC [joint_distribution_not_infty]
2086 >> `?c. joint_distribution p X Y (a CROSS b) = Normal c`
2087      by PROVE_TAC [extreal_cases]
2088 >> fs []
2089 >> `r <> 0` by PROVE_TAC [extreal_of_num_def, extreal_11]
2090 >> `0 <= r /\ 0 <= c` by PROVE_TAC [extreal_of_num_def, extreal_le_eq]
2091 >> rw [extreal_div_eq, extreal_of_num_def, extreal_le_eq]
2092 >> `0 < r` by PROVE_TAC [REAL_LT_LE]
2093 >> RW_TAC real_ss [REAL_LE_LDIV_EQ]
2094 >> fs [extreal_le_eq]
2095QED
2096
2097Theorem marginal_distribution1 :
2098    !p X Y a. prob_space p /\ FINITE (p_space p) /\ (events p = POW (p_space p)) ==>
2099             (distribution p X a =
2100              SIGMA (\x. joint_distribution p X Y (a CROSS {x})) (IMAGE Y (p_space p)))
2101Proof
2102    RW_TAC std_ss [joint_distribution_def, distribution_def]
2103 >> `FINITE (IMAGE Y (p_space p))` by METIS_TAC [IMAGE_FINITE]
2104 >> RW_TAC std_ss [PREIMAGE_def, IN_CROSS, IN_SING]
2105 >> `(prob p ({x | X x IN a} INTER p_space p) =
2106       SIGMA (\x. prob p ({x | X x IN a} INTER p_space p INTER (\x. {x' | Y x' = x}) x))
2107                  (IMAGE Y (p_space p)))`
2108        by (MATCH_MP_TAC  PROB_EXTREAL_SUM_IMAGE_FN
2109            >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
2110            >|[RW_TAC std_ss [SUBSET_DEF, IN_INTER, GSPECIFICATION],
2111               RW_TAC std_ss [DISJOINT_DEF, EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, IN_INTER]
2112               >> METIS_TAC [],
2113               RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_INTER, GSPECIFICATION]
2114               >> METIS_TAC [IN_IMAGE]])
2115 >> RW_TAC std_ss []
2116 >> irule EXTREAL_SUM_IMAGE_EQ
2117 >> RW_TAC std_ss []
2118 >- (Suff `{x | X x IN a} INTER p_space p INTER {x' | Y x' = x} =
2119           {x' | X x' IN a /\ (Y x' = x)} INTER p_space p`
2120     >- RW_TAC std_ss [] \\
2121     RW_TAC std_ss [EXTENSION, IN_INTER, GSPECIFICATION] >> METIS_TAC [])
2122 >> DISJ1_TAC
2123 >> RW_TAC std_ss [IN_IMAGE] (* 2 subgoals, same tactics *)
2124 >> MATCH_MP_TAC pos_not_neginf
2125 >> MATCH_MP_TAC PROB_POSITIVE >> art [IN_POW]
2126 >> SET_TAC []
2127QED
2128
2129Theorem marginal_distribution2 :
2130    !p X Y b. prob_space p /\ FINITE (p_space p) /\ (events p = POW (p_space p)) ==>
2131             (distribution p Y b =
2132              SIGMA (\x. joint_distribution p X Y ({x} CROSS b)) (IMAGE X (p_space p)))
2133Proof
2134    RW_TAC std_ss [joint_distribution_def, distribution_def]
2135 >> `FINITE (IMAGE X (p_space p))` by METIS_TAC [IMAGE_FINITE]
2136 >> RW_TAC std_ss [PREIMAGE_def, IN_CROSS, IN_SING]
2137 >> `prob p ({x | Y x IN b} INTER p_space p) =
2138      SIGMA (\x. prob p ({x | Y x IN b} INTER p_space p INTER (\x. {x' | X x' = x}) x))
2139            (IMAGE X (p_space p))`
2140        by (MATCH_MP_TAC  PROB_EXTREAL_SUM_IMAGE_FN
2141            >> RW_TAC std_ss [IN_POW, INTER_SUBSET]
2142            >|[RW_TAC std_ss [SUBSET_DEF, IN_INTER, GSPECIFICATION],
2143               RW_TAC std_ss [DISJOINT_DEF, EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, IN_INTER]
2144               >> METIS_TAC [],
2145               RW_TAC std_ss [EXTENSION, IN_BIGUNION_IMAGE, IN_INTER, GSPECIFICATION]
2146               >> METIS_TAC [IN_IMAGE]])
2147 >> RW_TAC std_ss []
2148 >> irule EXTREAL_SUM_IMAGE_EQ
2149 >> RW_TAC std_ss []
2150 >- (Suff `{x | Y x IN b} INTER p_space p INTER {x' | X x' = x} =
2151           {x' | (X x' = x) /\ Y x' IN b} INTER p_space p`
2152     >- RW_TAC std_ss [] \\
2153     RW_TAC std_ss [EXTENSION, IN_INTER, GSPECIFICATION] >> METIS_TAC [])
2154 >> DISJ1_TAC
2155 >> RW_TAC std_ss [IN_IMAGE] (* 2 subgoals, same tactics *)
2156 >> MATCH_MP_TAC pos_not_neginf
2157 >> MATCH_MP_TAC PROB_POSITIVE >> art [IN_POW]
2158 >> SET_TAC []
2159QED
2160
2161Theorem joint_distribution_sums_1 :
2162  !p X Y. prob_space p /\ FINITE (p_space p) /\ (events p = POW (p_space p)) ==>
2163         (SIGMA (\(x,y). joint_distribution p X Y {(x,y)})
2164                ((IMAGE X (p_space p)) CROSS (IMAGE Y (p_space p))) = 1)
2165Proof
2166    RW_TAC std_ss []
2167 >> `(\(x,y). joint_distribution p X Y {(x,y)}) =
2168      (\x. (\a b. joint_distribution p X Y ({a} CROSS {b})) (FST x) (SND x))`
2169       by (RW_TAC std_ss [FUN_EQ_THM]
2170           >> Cases_on `x`
2171           >> RW_TAC std_ss [FST,SND]
2172           >> METIS_TAC [CROSS_SINGS])
2173 >> POP_ORW
2174 >> Know `SIGMA (\x. (\a b. joint_distribution p X Y ({a} CROSS {b})) (FST x) (SND x))
2175                (IMAGE X (p_space p) CROSS IMAGE Y (p_space p)) =
2176          SIGMA (\x. SIGMA ((\a b. joint_distribution p X Y ({a} CROSS {b})) x)
2177                           (IMAGE Y (p_space p))) (IMAGE X (p_space p))`
2178 >- (MATCH_MP_TAC EQ_SYM \\
2179     irule EXTREAL_SUM_IMAGE_SUM_IMAGE \\
2180     RW_TAC std_ss [IMAGE_FINITE] \\
2181     DISJ1_TAC >> RW_TAC std_ss [IN_IMAGE] \\
2182     MATCH_MP_TAC pos_not_neginf \\
2183     rw [joint_distribution_pos]) >> Rewr'
2184 >> BETA_TAC
2185 >> rw [GSYM marginal_distribution1]
2186 >> `random_variable X p (IMAGE X (p_space p), POW (IMAGE X (p_space p)))`
2187      by (RW_TAC std_ss [random_variable_def, IN_MEASURABLE, IN_FUNSET, POW_SIGMA_ALGEBRA,
2188                         space_def, subsets_def, IN_POW, INTER_SUBSET, IN_IMAGE]
2189          >> METIS_TAC [IN_IMAGE])
2190 >> Q.ABBREV_TAC `p1 = (IMAGE X (p_space p), POW (IMAGE X (p_space p)), distribution p X)`
2191 >> Know `prob_space p1`
2192 >- (Q.UNABBREV_TAC ‘p1’ \\
2193     Q.ABBREV_TAC ‘s = (IMAGE X (p_space p),POW (IMAGE X (p_space p)))’ \\
2194    ‘(IMAGE X (p_space p),POW (IMAGE X (p_space p)),distribution p X) =
2195     (space s,subsets s,distribution p X)’ by rw [Abbr ‘s’] >> POP_ORW \\
2196     MATCH_MP_TAC distribution_prob_space \\
2197     rw [POW_SIGMA_ALGEBRA, Abbr ‘s’])
2198 >> DISCH_TAC
2199 >> (MP_TAC o Q.SPEC `p1` o INST_TYPE [``:'a`` |-> ``:'b``]) PROB_EXTREAL_SUM_IMAGE_SPACE
2200 >> `FINITE (p_space p1)` by METIS_TAC [PSPACE, IMAGE_FINITE]
2201 >> `!x. x IN p_space p1 ==> {x} IN events p1`
2202      by METIS_TAC [EVENTS, IN_POW, SUBSET_DEF, IN_SING, PSPACE]
2203 >> RW_TAC std_ss []
2204 >> METIS_TAC [PROB, PSPACE]
2205QED
2206
2207(* added `!x. f x <> PosInf /\ f x <> NegInf` into antecedents *)
2208Theorem joint_distribution_sum_mul1 :
2209    !p X Y f. prob_space p /\ FINITE (p_space p) /\
2210              (events p = POW (p_space p)) /\
2211              (!x. f x <> PosInf /\ f x <> NegInf) ==>
2212        (SIGMA (\(x,y). joint_distribution p X Y {(x,y)} * (f x))
2213               (IMAGE X (p_space p) CROSS IMAGE Y (p_space p)) =
2214         SIGMA (\x. distribution p X {x} * (f x)) (IMAGE X (p_space p)))
2215Proof
2216    RW_TAC std_ss []
2217 >> Q.ABBREV_TAC `s1 = IMAGE X (p_space p)`
2218 >> Q.ABBREV_TAC `s2 = IMAGE Y (p_space p)`
2219 >> `FINITE s1 /\ FINITE s2` by METIS_TAC [IMAGE_FINITE]
2220 >> `(\(x,y). joint_distribution p X Y {(x,y)} * (f x)) =
2221     (\x. (\a b. joint_distribution p X Y {(a,b)} * (f a) ) (FST x) (SND x))`
2222        by (RW_TAC std_ss [FUN_EQ_THM] \\
2223            Cases_on `x` >> RW_TAC std_ss [])
2224 >> POP_ORW
2225 >> (MP_TAC o GSYM o Q.SPECL [`s1`,`s2`,`(\a b. joint_distribution p X Y {(a,b)} * (f a))`] o
2226     INST_TYPE [``:'a`` |-> ``:'b``, ``:'b`` |-> ``:'c``]) EXTREAL_SUM_IMAGE_SUM_IMAGE
2227 >> RW_TAC std_ss []
2228 >> Know `(!x. x IN s1 CROSS s2 ==>
2229               NegInf <> joint_distribution p X Y {x} * f (FST x)) \/
2230          (!x. x IN s1 CROSS s2 ==>
2231               PosInf <> joint_distribution p X Y {x} * f (FST x))`
2232 >- (DISJ2_TAC >> RW_TAC std_ss [] \\
2233     Suff `joint_distribution p X Y {x} * f (FST x) <> PosInf` >- rw [] \\
2234    `joint_distribution p X Y {x} <> NegInf /\
2235     joint_distribution p X Y {x} <> PosInf`
2236       by PROVE_TAC [joint_distribution_not_infty] \\
2237    `?r. joint_distribution p X Y {x} = Normal r` by PROVE_TAC [extreal_cases] \\
2238    `?c. f (FST x) = Normal c` by PROVE_TAC [extreal_cases] \\
2239     fs [extreal_mul_def, extreal_not_infty])
2240 >> DISCH_TAC
2241 >> `SIGMA (\x. joint_distribution p X Y {x} * f (FST x)) (s1 CROSS s2) =
2242     SIGMA (\x. SIGMA (\b. joint_distribution p X Y {(x,b)} * f x) s2) s1`
2243      by PROVE_TAC [] >> POP_ORW
2244 >> NTAC 2 (POP_ASSUM K_TAC)
2245 >> `!x. (\b. joint_distribution p X Y {(x,b)} * (f x)) =
2246         (\b. (f x) * (\b. joint_distribution p X Y {(x,b)}) b)`
2247        by RW_TAC std_ss [FUN_EQ_THM, mul_comm] >> POP_ORW
2248 >> Know `!x. SIGMA (\b. f x * (\b. joint_distribution p X Y {(x,b)}) b) s2 =
2249              f x * SIGMA (\b. joint_distribution p X Y {(x,b)}) s2`
2250 >- (GEN_TAC \\
2251    `?c. f x = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2252     irule EXTREAL_SUM_IMAGE_CMUL >> art [] \\
2253     DISJ1_TAC >> Q.X_GEN_TAC `y` >> RW_TAC std_ss [] \\
2254     MATCH_MP_TAC pos_not_neginf \\
2255     rw [joint_distribution_pos]) >> Rewr'
2256 >> `!x:'b b:'c. {(x,b)} = {x} CROSS {b}` by METIS_TAC [CROSS_SINGS]
2257 >> Q.UNABBREV_TAC `s1`
2258 >> Q.UNABBREV_TAC `s2`
2259 >> RW_TAC std_ss [GSYM marginal_distribution1]
2260 >> Suff `(\x. (f x) * distribution p X {x}) = (\x. distribution p X {x} * (f x))`
2261 >- RW_TAC std_ss []
2262 >> RW_TAC std_ss [FUN_EQ_THM, mul_comm]
2263QED
2264
2265(******************************************************************************)
2266(*  Moments and variance [2, p.49]                                            *)
2267(******************************************************************************)
2268
2269Definition absolute_moment_def:
2270    absolute_moment p X a r = expectation p (\x. (abs (X x - a)) pow r)
2271End
2272
2273Definition moment_def:
2274    moment p X a r = expectation p (\x. (X x - a) pow r)
2275End
2276
2277Definition central_moment_def:
2278    central_moment p X r = moment p X (expectation p X) r
2279End
2280
2281(* `variance` = central second moment, this is the most used one. *)
2282Definition variance_def:
2283    variance p X = central_moment p X 2
2284End
2285
2286Definition standard_deviation_def:
2287    standard_deviation p X = sqrt (variance p X)
2288End
2289
2290Definition second_moment_def:
2291    second_moment p X a = moment p X a 2
2292End
2293
2294Theorem second_moment_alt:
2295    !p X. second_moment p X 0 = expectation p (\x. (X x) pow 2)
2296Proof
2297    RW_TAC std_ss [second_moment_def, moment_def, sub_rzero]
2298QED
2299
2300Theorem integrable_imp_finite_expectation:
2301    !p X. prob_space p /\ integrable p X ==>
2302          expectation p X <> PosInf /\ expectation p X <> NegInf
2303Proof
2304    rpt GEN_TAC >> SIMP_TAC std_ss [prob_space_def, expectation_def]
2305 >> STRIP_TAC
2306 >> MATCH_MP_TAC integrable_finite_integral >> art []
2307QED
2308
2309Theorem integrable_from_square:
2310    !p X. prob_space p /\ real_random_variable X p /\
2311          integrable p (\x. X x pow 2) ==> integrable p X
2312Proof
2313    RW_TAC std_ss [prob_space_def, p_space_def]
2314 >> Know `integrable p (\x. 1)`
2315 >- (REWRITE_TAC [extreal_of_num_def] \\
2316     MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty])
2317 >> DISCH_TAC
2318 >> Know `integrable p (\x. (\x. (X x) pow 2) x + (\x. 1) x)`
2319 >- (MATCH_MP_TAC integrable_add_pos >> ASM_SIMP_TAC std_ss [le_01, le_pow2])
2320 >> BETA_TAC >> DISCH_TAC
2321 >> MATCH_MP_TAC integrable_bounded
2322 >> Q.EXISTS_TAC `\x. (X x) pow 2 + 1`
2323 >> ASM_SIMP_TAC std_ss [abs_le_square_plus1]
2324 >> `(\x. (X x) pow 2) IN measurable (m_space p,measurable_sets p) Borel`
2325      by PROVE_TAC [integrable_def]
2326 >> fs [real_random_variable, p_space_def, events_def]
2327QED
2328
2329(* In general, if X has a finite absolute moment of order k, then it has finite absolute
2330   moments of orders 1,2,...k-1 as well. [6, p.274] *)
2331Theorem integrable_absolute_moments :
2332    !p X n. prob_space p /\ real_random_variable X p /\
2333            integrable p (\x. (abs (X x)) pow n) ==>
2334            !m. m <= n ==> integrable p (\x. (abs (X x)) pow m)
2335Proof
2336    RW_TAC std_ss [prob_space_def, p_space_def]
2337 >> Know `integrable p (\x. 1)`
2338 >- (REWRITE_TAC [extreal_of_num_def] \\
2339     MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty])
2340 >> DISCH_TAC
2341 >> Know `integrable p (\x. (\x. 1) x + (\x. (abs (X x)) pow n) x)`
2342 >- (MATCH_MP_TAC integrable_add_pos >> RW_TAC std_ss [le_01] \\
2343     MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [abs_pos])
2344 >> BETA_TAC >> DISCH_TAC
2345 >> MATCH_MP_TAC integrable_bounded
2346 >> Q.EXISTS_TAC `\x. 1 + (abs (X x)) pow n`
2347 >> fs [real_random_variable, p_space_def, events_def]
2348 >> RW_TAC std_ss []
2349 >- (`!x. abs (X x) pow m = ((abs o X) x) pow m` by METIS_TAC [o_DEF] >> POP_ORW \\
2350     MATCH_MP_TAC IN_MEASURABLE_BOREL_POW >> fs [measure_space_def, space_def, o_DEF] \\
2351     MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS >> Q.EXISTS_TAC `X` \\
2352     ASM_SIMP_TAC std_ss [])
2353 >> Know `abs (abs (X x) pow m) = abs (X x) pow m`
2354 >- (REWRITE_TAC [abs_refl] \\
2355     MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [abs_pos]) >> Rewr'
2356 >> MATCH_MP_TAC abs_pow_le_mono >> art []
2357QED
2358
2359Theorem integrable_absolute_moments_mono :
2360  !p X n.
2361    prob_space p /\ real_random_variable X p /\
2362    integrable p (\x. (abs (X x)) pow n) ==>
2363    (!m. m <= n ==> integrable p (λx. (X x) pow m))
2364Proof
2365  rpt STRIP_TAC
2366  >> MATCH_MP_TAC integrable_from_abs
2367  >> fs [prob_space_def]
2368  >> CONJ_TAC
2369  >- (irule IN_MEASURABLE_BOREL_POW' \\
2370      simp [MEASURE_SPACE_SIGMA_ALGEBRA] \\
2371      qexistsl [‘X’, ‘m’] >> fs [real_random_variable, p_space_def, events_def])
2372  >> rw [o_DEF]
2373  >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘n’] integrable_absolute_moments)
2374  >> impl_tac >- (fs [prob_space_def])
2375  >> rw [GSYM pow_abs]
2376QED
2377
2378Theorem variance_alt:
2379    !p X. variance p X = expectation p (\x. (X x - expectation p X) pow 2)
2380Proof
2381    RW_TAC std_ss [variance_def, central_moment_def, moment_def]
2382QED
2383
2384Theorem variance_pos :
2385    !p X. prob_space p ==> 0 <= variance p X
2386Proof
2387    RW_TAC std_ss [variance_alt, expectation_def, prob_space_def]
2388 >> MATCH_MP_TAC integral_pos
2389 >> RW_TAC std_ss [le_pow2]
2390QED
2391
2392Theorem second_moment_pos :
2393    !p X a. prob_space p ==> 0 <= second_moment p X a
2394Proof
2395    RW_TAC std_ss [second_moment_def, moment_def, expectation_def, prob_space_def]
2396 >> MATCH_MP_TAC integral_pos
2397 >> RW_TAC std_ss [le_pow2]
2398QED
2399
2400(* This is the most famous formula in Elementary Probability:
2401
2402       Var(X) = E[X^2] - E[X]^2
2403
2404   `integrable p X` is not needed due to "integrable_from_square"
2405 *)
2406Theorem variance_eq :
2407    !p X. prob_space p /\ real_random_variable X p /\
2408          integrable p (\x. X x pow 2) ==>
2409          variance p X = expectation p (\x. X x pow 2) - (expectation p X) pow 2
2410Proof
2411    rpt STRIP_TAC
2412 >> IMP_RES_TAC integrable_from_square
2413 >> REWRITE_TAC [variance_def, central_moment_def, moment_def, expectation_def]
2414 >> Q.ABBREV_TAC `EX = integral p X`
2415 >> fs [prob_space_def, real_random_variable_def, p_space_def]
2416 >> `?r. EX = Normal r` by PROVE_TAC [integrable_normal_integral]
2417 >> Know `!x. x IN m_space p ==> (X x - EX) pow 2 = (X x + (-EX)) pow 2`
2418 >- (rpt STRIP_TAC \\
2419     Suff ‘X x - EX = X x + (-EX)’ >- rw [] \\
2420     MATCH_MP_TAC extreal_sub_add >> DISJ1_TAC \\
2421     PROVE_TAC [extreal_not_infty])
2422 >> DISCH_TAC
2423 >> Know ‘integral p (\x. (X x - EX) pow 2) =
2424          integral p (\x. (X x + -EX) pow 2)’
2425 >- (MATCH_MP_TAC integral_cong >> rw []) >> Rewr'
2426 >> POP_ASSUM K_TAC
2427 >> Know `!x. x IN m_space p ==>
2428             (X x + -EX) pow 2 = (X x) pow 2 + (-EX) pow 2 + 2 * (X x) * (-EX)`
2429 >- (rpt STRIP_TAC \\
2430     MATCH_MP_TAC add_pow2 >> simp [extreal_ainv_def, extreal_not_infty])
2431 >> DISCH_TAC
2432 >> Know ‘integral p (\x. (X x + -EX) pow 2) =
2433          integral p (\x. X x pow 2 + -EX pow 2 + 2 * X x * -EX)’
2434 >- (MATCH_MP_TAC integral_cong >> rw []) >> Rewr'
2435 >> POP_ASSUM K_TAC
2436 >> Know `(-EX) pow 2 = EX pow 2`
2437 >- (REWRITE_TAC [pow_2, neg_mul2]) >> Rewr'
2438 >> Know `!x. 2 * X x * -EX = 2 * -EX * X x`
2439 >- (METIS_TAC [mul_assoc, mul_comm]) >> Rewr'
2440 >> Know `2 * -EX = Normal (2 * -r)`
2441 >- (art [extreal_of_num_def, extreal_ainv_def, extreal_mul_def]) >> Rewr'
2442 >> Know `EX pow 2 <> PosInf`
2443 >- (art [pow_2, extreal_mul_def, extreal_not_infty]) >> DISCH_TAC
2444 (* preparing for applying "integral_add" *)
2445 >> Know `integral p (\x. (\x. (X x) pow 2 + EX pow 2) x + (\x. Normal (2 * -r) * X x) x) =
2446          integral p (\x. (X x) pow 2 + EX pow 2) + integral p (\x. Normal (2 * -r) * X x)`
2447 >- (MATCH_MP_TAC integral_add >> simp [] \\
2448     CONJ_TAC
2449     >- (Suff `integrable p (\x. (\x. (X x) pow 2) x + (\x. (Normal r) pow 2) x)`
2450         >- METIS_TAC [] \\
2451         MATCH_MP_TAC integrable_add_pos >> ASM_SIMP_TAC std_ss [le_pow2] \\
2452         REWRITE_TAC [pow_2, extreal_mul_def] \\
2453         MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty]) \\
2454     CONJ_TAC >- (MATCH_MP_TAC integrable_cmul >> art []) \\
2455     GEN_TAC >> DISCH_TAC >> DISJ1_TAC \\
2456     RW_TAC std_ss [pow_2, extreal_mul_def] >| (* 2 subgoals *)
2457     [ `?c. X x = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2458       REWRITE_TAC [extreal_mul_def, extreal_add_def, extreal_not_infty],
2459       `?c. X x = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2460       REWRITE_TAC [extreal_mul_def, extreal_not_infty] ])
2461 >> BETA_TAC >> Rewr'
2462 >> Know `integral p (\x. (\x. (X x) pow 2) x + (\x. EX pow 2) x) =
2463          integral p (\x. (X x) pow 2) + integral p (\x. EX pow 2)`
2464 >- (MATCH_MP_TAC integral_add \\
2465     simp [pow_2, extreal_mul_def, extreal_not_infty] \\
2466     MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty])
2467 >> BETA_TAC >> Rewr'
2468 >> Know `integral p (\x. EX pow 2) = EX pow 2 * measure p (m_space p)`
2469 >- (Q.PAT_X_ASSUM `EX = Normal r` (REWRITE_TAC o wrap) \\
2470     REWRITE_TAC [pow_2, extreal_mul_def] \\
2471     MATCH_MP_TAC integral_const >> art [extreal_of_num_def, lt_infty])
2472 >> Rewr'
2473 >> Know `integral p (\x. Normal (2 * -r) * X x) = Normal (2 * -r) * EX`
2474 >- (Q.PAT_X_ASSUM `EX = Normal r` K_TAC >> Q.UNABBREV_TAC `EX` \\
2475     MATCH_MP_TAC integral_cmul >> art []) >> Rewr'
2476 >> Know `Normal (2 * -r) = -2 * EX`
2477 >- (art [extreal_of_num_def, extreal_mul_def, extreal_ainv_def, extreal_11] \\
2478     RW_TAC real_ss []) >> Rewr'
2479 >> Q.PAT_X_ASSUM `EX = Normal r` K_TAC
2480 >> ASM_REWRITE_TAC [mul_rone, GSYM pow_2, GSYM mul_assoc]
2481 >> Know `integral p (\x. (X x) pow 2) + EX pow 2 + -2 * EX pow 2 =
2482          integral p (\x. (X x) pow 2) + (EX pow 2 + -2 * EX pow 2)`
2483 >- (MATCH_MP_TAC EQ_SYM \\
2484     MATCH_MP_TAC add_assoc \\
2485    `?r. integral p (\x. (X x) pow 2) = Normal r` by PROVE_TAC [integrable_normal_integral] \\
2486    `?c. EX = Normal c` by PROVE_TAC [integrable_normal_integral] \\
2487     art [extreal_not_infty, pow_2, extreal_of_num_def, extreal_ainv_def, extreal_mul_def])
2488 >> Rewr'
2489 >> Know `1 * EX pow 2 + -2 * EX pow 2 = (1 + -2) * EX pow 2`
2490 >- (MATCH_MP_TAC EQ_SYM \\
2491     `?c. EX = Normal c` by PROVE_TAC [integrable_normal_integral] \\
2492     art [pow_2, extreal_mul_def] \\
2493     MATCH_MP_TAC add_rdistrib_normal \\
2494     REWRITE_TAC [extreal_of_num_def, extreal_ainv_def, extreal_not_infty])
2495 >> REWRITE_TAC [mul_lone] >> Rewr'
2496 >> Know `(1:extreal) + -2 = -1`
2497 >- (RW_TAC real_ss [extreal_of_num_def, extreal_ainv_def, extreal_11, extreal_add_def])
2498 >> Rewr' >> REWRITE_TAC [GSYM neg_minus1]
2499 >> MATCH_MP_TAC EQ_SYM
2500 >> MATCH_MP_TAC extreal_sub_add
2501 >> DISJ1_TAC >> art []
2502 >> `?r. integral p (\x. (X x) pow 2) = Normal r`
2503       by PROVE_TAC [integrable_normal_integral]
2504 >> POP_ORW >> REWRITE_TAC [extreal_not_infty]
2505QED
2506
2507(* A corollary: Var(X) is always less or equal than E[X^2] *)
2508Theorem variance_le :
2509    !p X. prob_space p /\ real_random_variable X p /\ integrable p (\x. X x pow 2) ==>
2510          variance p X <= expectation p (\x. X x pow 2)
2511Proof
2512    rpt STRIP_TAC
2513 >> Know `variance p X = expectation p (\x. X x pow 2) - expectation p X pow 2`
2514 >- (MATCH_MP_TAC variance_eq >> art []) >> Rewr'
2515 >> IMP_RES_TAC integrable_from_square
2516 >> Q.ABBREV_TAC `EX = integral p X`
2517 >> fs [prob_space_def, real_random_variable_def, p_space_def, expectation_def]
2518 >> `?r. EX = Normal r` by PROVE_TAC [integrable_normal_integral]
2519 >> Know `EX pow 2 <> PosInf`
2520 >- (art [pow_2, extreal_mul_def, extreal_not_infty]) >> DISCH_TAC
2521 >> Know `EX pow 2 <> NegInf`
2522 >- (MATCH_MP_TAC pos_not_neginf >> REWRITE_TAC [le_pow2]) >> DISCH_TAC
2523 >> Know `integral p (\x. (X x) pow 2) - EX pow 2 <= integral p (\x. (X x) pow 2) <=>
2524          integral p (\x. (X x) pow 2) <= integral p (\x. (X x) pow 2) + EX pow 2`
2525 >- (MATCH_MP_TAC sub_le_eq >> art []) >> Rewr'
2526 >> MATCH_MP_TAC le_addr_imp
2527 >> REWRITE_TAC [le_pow2]
2528QED
2529
2530(* NOTE: this definition is new, later we shall prove that it's equivalence with
2531         finite variance or finite second moment at `a = 0` *)
2532Definition finite_second_moments_def:
2533    finite_second_moments p X = ?a. second_moment p X a < PosInf
2534End
2535
2536Theorem finite_variance_imp_finite_second_moments[local]:
2537    !p X. variance p X < PosInf ==> finite_second_moments p X
2538Proof
2539    RW_TAC std_ss [finite_second_moments_def, variance_def, central_moment_def,
2540                   second_moment_def]
2541 >> Q.EXISTS_TAC `expectation p X` >> art []
2542QED
2543
2544(* TODO: extend `Normal c` to all extreals (not possible for integral_cmul) *)
2545Theorem expectation_cmul :
2546    !p X c. prob_space p /\ integrable p X ==>
2547            expectation p (\x. Normal c * X x) = Normal c * expectation p X
2548Proof
2549    rw [prob_space_def, expectation_def]
2550 >> MATCH_MP_TAC integral_cmul >> art []
2551QED
2552
2553Theorem expectation_cdiv :
2554    !p X c. prob_space p /\ integrable p X /\ c <> 0 ==>
2555            expectation p (\x. X x / Normal c) = expectation p X / Normal c
2556Proof
2557    rw [extreal_div_def, extreal_inv_def]
2558 >> ONCE_REWRITE_TAC [mul_comm]
2559 >> MATCH_MP_TAC expectation_cmul >> art []
2560QED
2561
2562Theorem expectation_pos :
2563    !p X. prob_space p /\ (!x. x IN p_space p ==> 0 <= X x) ==>
2564          0 <= expectation p X
2565Proof
2566    rw [prob_space_def, p_space_def, expectation_def]
2567 >> MATCH_MP_TAC integral_pos >> rw []
2568QED
2569
2570Theorem expectation_posinf[local] :
2571    !p. prob_space p ==> expectation p (\x. PosInf) = PosInf
2572Proof
2573    RW_TAC std_ss [prob_space_def, p_space_def, expectation_def]
2574 >> MATCH_MP_TAC integral_posinf >> art [lt_01]
2575QED
2576
2577Theorem expectation_neginf[local] :
2578    !p. prob_space p ==> expectation p (\x. NegInf) = NegInf
2579Proof
2580    RW_TAC std_ss [prob_space_def, p_space_def, expectation_def]
2581 >> MATCH_MP_TAC integral_neginf >> art [lt_01]
2582QED
2583
2584(* NOTE: the type of ‘c’ has changed from “:real” to “:extreal” *)
2585Theorem expectation_const :
2586    !p c. prob_space p ==> expectation p (\x. c) = c
2587Proof
2588    rpt STRIP_TAC
2589 >> Cases_on ‘c’
2590 >| [ (* goal 1 (of 3) *)
2591      MATCH_MP_TAC expectation_neginf >> art [],
2592      (* goal 2 (of 3) *)
2593      MATCH_MP_TAC expectation_posinf >> art [],
2594      (* goal 3 (of 3) *)
2595      MP_TAC (Q.SPECL [`p`, `r`] integral_const) \\
2596     `1 < PosInf` by PROVE_TAC [lt_infty, extreal_of_num_def] \\
2597      fs [prob_space_def, p_space_def, expectation_def, mul_rone] ]
2598QED
2599
2600(* |- !p. prob_space p ==> expectation p (\x. 0) = 0 *)
2601Theorem expectation_zero =
2602    Q.GEN ‘p’ (Q.SPECL [‘p’, ‘0’] expectation_const)
2603
2604Theorem variance_const :
2605    !p c. prob_space p ==> variance p (\x. Normal c) = 0
2606Proof
2607    rpt STRIP_TAC
2608 >> rw [variance_alt, expectation_const, extreal_sub_def]
2609 >> rw [extreal_pow_def, expectation_zero]
2610QED
2611
2612Theorem expectation_sum :
2613    !p X J.
2614        FINITE J /\ prob_space p /\ (!i. i IN J ==> integrable p (X i)) /\
2615       (!i. i IN J ==> real_random_variable (X i) p) ==>
2616        expectation p (\x. SIGMA (\i. X i x) J) = SIGMA (\i. expectation p (X i)) J
2617Proof
2618    RW_TAC std_ss [expectation_def, real_random_variable_def, prob_space_def,
2619                   p_space_def]
2620 >> MATCH_MP_TAC integral_sum >> rw []
2621QED
2622
2623(* |- !p. prob_space p ==> variance p (\x. 0) = 0 *)
2624Theorem variance_zero =
2625        variance_const |> Q.SPECL [‘p’, ‘0’]
2626                       |> REWRITE_RULE [GSYM extreal_of_num_def]
2627                       |> Q.GEN ‘p’
2628
2629Theorem expectation_cong :
2630    !p f g. prob_space p /\ (!x. x IN p_space p ==> f x = g x) ==>
2631            expectation p f = expectation p g
2632Proof
2633    rw [prob_space_def, p_space_def, expectation_def]
2634 >> MATCH_MP_TAC integral_cong >> art []
2635QED
2636
2637Theorem expectation_add :
2638  !p f g.
2639    prob_space p /\ integrable p f /\ integrable p g ==>
2640    expectation p (λx. f x + g x) = expectation p f + expectation p g
2641Proof
2642  rw [expectation_def, prob_space_def]
2643  >> MATCH_MP_TAC integral_add'
2644  >> simp []
2645QED
2646
2647Theorem expectation_sub :
2648  !p X Y.
2649    prob_space p /\
2650    integrable p X /\
2651    integrable p Y ==>
2652    expectation p (λx. X x - Y x) = expectation p X - expectation p Y
2653Proof
2654  rw [expectation_def, prob_space_def]
2655  >> MATCH_MP_TAC integral_sub'
2656  >> simp []
2657QED
2658
2659Theorem expectation_mono:
2660  !p f g.
2661    prob_space p /\ integrable p f /\ integrable p g /\
2662    (!x. x IN p_space p ==> f x <= g x) ==>
2663    expectation p f <= expectation p g
2664Proof
2665  rw [prob_space_def, p_space_def, expectation_def]
2666  >> MATCH_MP_TAC integral_mono >> art []
2667QED
2668
2669Theorem variance_cong :
2670    !p f g. prob_space p /\ (!x. x IN p_space p ==> f x = g x) ==>
2671            variance p f = variance p g
2672Proof
2673    RW_TAC std_ss [variance_alt]
2674 >> MATCH_MP_TAC expectation_cong
2675 >> RW_TAC std_ss []
2676 >> Suff ‘expectation p f = expectation p g’ >- rw []
2677 >> MATCH_MP_TAC expectation_cong
2678 >> RW_TAC std_ss []
2679QED
2680
2681(* Deep lemma: all second moments are finite iff one of them is finite *)
2682Theorem finite_second_moments_all :
2683    !p X. prob_space p /\ real_random_variable X p ==>
2684         (finite_second_moments p X <=> !r. second_moment p X (Normal r) < PosInf)
2685Proof
2686    RW_TAC std_ss [finite_second_moments_def, second_moment_def, moment_def]
2687 >> reverse EQ_TAC >> rpt STRIP_TAC
2688 >- (POP_ASSUM (STRIP_ASSUME_TAC o (Q.SPEC `0`)) \\
2689     Q.EXISTS_TAC `Normal 0` >> art [])
2690 >> fs [real_random_variable]
2691 >> Cases_on `(a = PosInf) \/ (a = NegInf)`
2692 >- (Suff `!x. x IN p_space p ==> (X x - a) pow 2 = PosInf`
2693     >- (DISCH_TAC \\
2694         Q.PAT_X_ASSUM ‘expectation p (\x. (X x - a) pow 2) < PosInf’ MP_TAC \\
2695         Know ‘expectation p (\x. (X x - a) pow 2) =
2696               expectation p (\x. PosInf)’
2697         >- (MATCH_MP_TAC expectation_cong >> simp []) \\
2698         simp [expectation_const] \\
2699         METIS_TAC [lt_infty]) \\
2700     rpt STRIP_TAC \\
2701    `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2702    `EVEN 2` by RW_TAC arith_ss [] \\
2703     Q.PAT_X_ASSUM `(a = PosInf) \/ (a = NegInf)` STRIP_ASSUME_TAC \\
2704     ASM_SIMP_TAC std_ss [extreal_sub_def, extreal_pow_def])
2705 >> `?c. a = Normal c` by PROVE_TAC [extreal_cases]
2706 >> POP_ASSUM (fs o wrap)
2707 >> fs [expectation_def, p_space_def, events_def, prob_space_def]
2708 >> Know `integrable p (\x. (\x. X x - Normal c) x pow 2)`
2709 >- (RW_TAC pure_ss [integrable_def] >| (* 3 subgoals *)
2710     [ (* goal 1 (of 3) *)
2711       MATCH_MP_TAC IN_MEASURABLE_BOREL_POW >> fs [measure_space_def, space_def] \\
2712       MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB' \\
2713       qexistsl_tac [`X`, `\x. Normal c`] \\
2714       ASM_SIMP_TAC std_ss [] \\
2715       MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> Q.EXISTS_TAC `Normal c` \\
2716       ASM_SIMP_TAC std_ss [],
2717       (* goal 2 (of 3) *)
2718       BETA_TAC \\
2719      `!x. 0 <= (X x - Normal c) pow 2` by REWRITE_TAC [le_pow2] \\
2720       Know `fn_plus (\x. (X x - Normal c) pow 2) = (\x. (X x - Normal c) pow 2)`
2721       >- (MATCH_MP_TAC FN_PLUS_POS_ID >> BETA_TAC >> art []) >> Rewr' \\
2722       REWRITE_TAC [lt_infty] \\
2723       Know `pos_fn_integral p (\x. (X x - Normal c) pow 2) =
2724                    integral p (\x. (X x - Normal c) pow 2)`
2725       >- (MATCH_MP_TAC EQ_SYM \\
2726           MATCH_MP_TAC integral_pos_fn >> ASM_SIMP_TAC std_ss []) >> Rewr' >> art [],
2727       (* goal 3 (of 3) *)
2728       BETA_TAC \\
2729      `!x. 0 <= (X x - Normal c) pow 2` by REWRITE_TAC [le_pow2] \\
2730       Know `fn_minus (\x. (X x - Normal c) pow 2) = (\x. 0)`
2731       >- (MATCH_MP_TAC FN_MINUS_POS_ZERO >> BETA_TAC >> art []) >> Rewr' \\
2732       ASM_SIMP_TAC std_ss [pos_fn_integral_zero, extreal_of_num_def, extreal_not_infty] ])
2733 >> DISCH_TAC
2734 >> Know `integrable p (\x. X x - Normal c)`
2735 >- (MATCH_MP_TAC integrable_from_square \\
2736     fs [prob_space_def, real_random_variable,
2737         p_space_def, events_def, prob_space_def, measure_space_def] \\
2738     reverse CONJ_TAC
2739     >- (GEN_TAC >> DISCH_TAC \\
2740        `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2741         REWRITE_TAC [extreal_sub_def, extreal_not_infty]) \\
2742     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB' \\
2743     Q.EXISTS_TAC `X` >> Q.EXISTS_TAC `\x. Normal c` \\
2744     ASM_SIMP_TAC std_ss [] \\
2745     MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> Q.EXISTS_TAC `Normal c` \\
2746     ASM_SIMP_TAC std_ss [])
2747 >> DISCH_TAC
2748 >> Know `integrable p X`
2749 >- (Know `X = \x. X x - Normal c + Normal c`
2750     >- (FUN_EQ_TAC >> GEN_TAC >> BETA_TAC \\
2751         MATCH_MP_TAC EQ_SYM \\
2752         MATCH_MP_TAC sub_add >> REWRITE_TAC [extreal_not_infty]) >> Rewr' \\
2753    `(\x. X x - Normal c + Normal c) = (\x. (\x. X x - Normal c) x + (\x. Normal c) x)`
2754       by METIS_TAC [] >> POP_ORW \\
2755     MATCH_MP_TAC integrable_add >> art [] \\
2756     CONJ_TAC >- (MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty]) \\
2757     GEN_TAC >> DISCH_TAC >> DISJ1_TAC \\
2758     RW_TAC std_ss [extreal_not_infty] \\
2759    `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2760     REWRITE_TAC [extreal_sub_def, extreal_not_infty])
2761 >> DISCH_TAC
2762 >> Suff `integrable p (\x. (X x - Normal r) pow 2)`
2763 >- METIS_TAC [integrable_finite_integral, lt_infty]
2764 >> Know `!x. x IN m_space p ==>
2765             (X x - Normal r) pow 2 = (\x. (X x - Normal c) pow 2) x +
2766                                      (\x. Normal (2 * (c - r)) * (X x) +
2767                                           Normal (r pow 2 - c pow 2)) x`
2768 >- (GEN_TAC >> BETA_TAC >> STRIP_TAC \\
2769    `?y. X x = Normal y` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2770     SIMP_TAC real_ss [sub_pow2, extreal_not_infty, pow_2] \\
2771     SIMP_TAC real_ss [extreal_mul_def, extreal_add_def, extreal_sub_def, extreal_11,
2772                       extreal_of_num_def] \\
2773     RW_TAC real_ss [REAL_SUB_LDISTRIB, REAL_SUB_RDISTRIB, REAL_ADD_LDISTRIB,
2774                     REAL_ADD_RDISTRIB, REAL_ADD_ASSOC, POW_2, GSYM REAL_DOUBLE] \\
2775     REAL_ARITH_TAC)
2776 >> DISCH_TAC
2777 >> Know ‘integrable p (\x. (X x - Normal r) pow 2) <=>
2778          integrable p (\x. (\x. (X x - Normal c) pow 2) x +
2779                            (\x. Normal (2 * (c - r)) * X x + Normal (r pow 2 - c pow 2)) x)’
2780 >- (MATCH_MP_TAC integrable_cong >> ASM_SIMP_TAC std_ss [])
2781 >> Rewr'
2782 >> MATCH_MP_TAC integrable_add >> fs []
2783 >> reverse CONJ_TAC
2784 >- (GEN_TAC >> DISCH_TAC >> DISJ1_TAC \\
2785     RW_TAC std_ss [pow_2] >| (* 2 subgoals *)
2786     [ (* goal 1 (of 2) *)
2787      `?y. X x = Normal y` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2788       REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty],
2789       (* goal 2 (of 2) *)
2790      `?y. X x = Normal y` by PROVE_TAC [extreal_cases] >> POP_ORW \\
2791       REWRITE_TAC [extreal_add_def, extreal_mul_def, extreal_not_infty] ])
2792 >> `(\x. Normal (2 * (c - r)) * X x + Normal (r pow 2 - c pow 2)) =
2793     (\x. (\x. Normal (2 * (c - r)) * X x) x + (\x. Normal (r pow 2 - c pow 2)) x)`
2794      by METIS_TAC [] >> POP_ORW
2795 >> MATCH_MP_TAC integrable_add
2796 >> RW_TAC std_ss [] (* 2 subgoals *)
2797 >| [ (* goal 1 (of 2) *)
2798      MATCH_MP_TAC integrable_cmul >> art [],
2799      (* goal 2 (of 2) *)
2800      MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty] ]
2801QED
2802
2803Theorem finite_second_moments_eq_finite_variance :
2804    !p X. prob_space p /\ real_random_variable X p ==>
2805         (finite_second_moments p X <=> variance p X < PosInf)
2806Proof
2807    rpt STRIP_TAC
2808 >> reverse EQ_TAC >> DISCH_TAC
2809 >- (MATCH_MP_TAC finite_variance_imp_finite_second_moments >> art [])
2810 >> fs [variance_def, central_moment_def, second_moment_def]
2811 >> `!r. second_moment p X (Normal r) < PosInf` by PROVE_TAC [finite_second_moments_all]
2812 >> fs [second_moment_def, moment_def]
2813 >> Q.PAT_ASSUM `!r. expectation p _ < PosInf` (MP_TAC o (Q.SPEC `0`))
2814 >> REWRITE_TAC [GSYM extreal_of_num_def, sub_rzero]
2815 >> DISCH_TAC
2816 >> Know `integrable p (\x. (X x) pow 2)`
2817 >- (RW_TAC std_ss [integrable_def] >| (* 3 subgoals *)
2818     [ (* goal 1 (of 3) *)
2819       MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
2820       fs [prob_space_def, measure_space_def, real_random_variable_def,
2821           random_variable_def, space_def, p_space_def, events_def],
2822       (* goal 2 (of 3) *)
2823       Know `fn_plus (\x. (X x) pow 2) = (\x. (X x) pow 2)`
2824       >- (MATCH_MP_TAC FN_PLUS_POS_ID >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2825       Know `pos_fn_integral p (\x. (X x) pow 2) = integral p (\x. (X x) pow 2)`
2826       >- (MATCH_MP_TAC EQ_SYM \\
2827           MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, le_pow2]) \\
2828       Rewr' >> fs [expectation_def, lt_infty],
2829       (* goal 3 (of 3) *)
2830       Know `fn_minus (\x. (X x) pow 2) = (\x. 0)`
2831       >- (MATCH_MP_TAC FN_MINUS_POS_ZERO >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2832       Know `pos_fn_integral p (\x. 0) = 0`
2833       >- (MATCH_MP_TAC pos_fn_integral_zero >> fs [prob_space_def]) >> Rewr' \\
2834       REWRITE_TAC [extreal_of_num_def, extreal_not_infty] ])
2835 >> DISCH_TAC
2836 >> Know `integrable p X`
2837 >- (MATCH_MP_TAC integrable_from_square >> art []) >> DISCH_TAC
2838 >> `expectation p X <> PosInf /\ expectation p X <> NegInf`
2839     by METIS_TAC [integrable_imp_finite_expectation]
2840 >> `?c. expectation p X = Normal c` by PROVE_TAC [extreal_cases] >> art []
2841QED
2842
2843Theorem finite_second_moments_lemma[local] :
2844    !p X. prob_space p /\ real_random_variable X p ==>
2845         (variance p X < PosInf <=> second_moment p X 0 < PosInf)
2846Proof
2847    rpt STRIP_TAC
2848 >> Know `variance p X < PosInf <=> finite_second_moments p X`
2849 >- (MATCH_MP_TAC EQ_SYM \\
2850     MATCH_MP_TAC finite_second_moments_eq_finite_variance >> art []) >> Rewr'
2851 >> EQ_TAC >> STRIP_TAC
2852 >- (Know `finite_second_moments p X <=> !r. second_moment p X (Normal r) < PosInf`
2853     >- (MATCH_MP_TAC finite_second_moments_all >> art []) \\
2854     DISCH_THEN (fs o wrap) \\
2855     POP_ASSUM (REWRITE_TAC o wrap o (REWRITE_RULE [GSYM extreal_of_num_def]) o (Q.SPEC `0`)))
2856 >> REWRITE_TAC [finite_second_moments_def]
2857 >> Q.EXISTS_TAC `0` >> art []
2858QED
2859
2860(* alternative definition of `finite_second_moments` for easier verification *)
2861Theorem finite_second_moments_alt :
2862    !p X. prob_space p /\ real_random_variable X p ==>
2863         (finite_second_moments p X <=> second_moment p X 0 < PosInf)
2864Proof
2865    rpt STRIP_TAC
2866 >> METIS_TAC [finite_second_moments_eq_finite_variance,
2867               finite_second_moments_lemma]
2868QED
2869
2870(* |- !p X.
2871         prob_space p /\ real_random_variable X p ==>
2872         (finite_second_moments p X <=> expectation p (\x. (X x) pow 2) < PosInf)
2873 *)
2874Theorem finite_second_moments_literally =
2875    REWRITE_RULE [second_moment_def, moment_def, sub_rzero] finite_second_moments_alt
2876
2877Theorem finite_second_moments_eq_integrable_square :
2878    !p X. prob_space p /\ real_random_variable X p ==>
2879         (finite_second_moments p X <=> integrable p (\x. X x pow 2))
2880Proof
2881    rpt STRIP_TAC
2882 >> EQ_TAC >> STRIP_TAC
2883 >| [ (* goal 1 (of 2) *)
2884      RW_TAC std_ss [integrable_def] >| (* 3 subgoals *)
2885      [ (* goal 1.1 (of 3) *)
2886        MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
2887        fs [prob_space_def, measure_space_def, real_random_variable_def,
2888            random_variable_def, space_def, p_space_def, events_def],
2889        (* goal 1.2 (of 3) *)
2890        Know `fn_plus (\x. (X x) pow 2) = (\x. (X x) pow 2)`
2891        >- (MATCH_MP_TAC FN_PLUS_POS_ID >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2892        Know `pos_fn_integral p (\x. (X x) pow 2) = integral p (\x. (X x) pow 2)`
2893        >- (MATCH_MP_TAC EQ_SYM \\
2894            MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, le_pow2]) \\
2895        Rewr' >> REWRITE_TAC [lt_infty] \\
2896        Know `finite_second_moments p X <=> second_moment p X 0 < PosInf`
2897        >- (MATCH_MP_TAC finite_second_moments_alt >> art []) \\
2898        REWRITE_TAC [second_moment_def, moment_def, sub_rzero, expectation_def] \\
2899        DISCH_THEN (fs o wrap),
2900        (* goal 1.3 (of 3) *)
2901        Know `fn_minus (\x. (X x) pow 2) = (\x. 0)`
2902        >- (MATCH_MP_TAC FN_MINUS_POS_ZERO >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2903        Know `pos_fn_integral p (\x. 0) = 0`
2904        >- (MATCH_MP_TAC pos_fn_integral_zero >> fs [prob_space_def]) >> Rewr' \\
2905        REWRITE_TAC [extreal_of_num_def, extreal_not_infty] ],
2906      (* goal 2 (of 2) *)
2907      IMP_RES_TAC integrable_imp_finite_expectation \\
2908      Know `finite_second_moments p X <=> second_moment p X 0 < PosInf`
2909      >- (MATCH_MP_TAC finite_second_moments_alt >> art []) \\
2910      REWRITE_TAC [second_moment_def, moment_def, sub_rzero] \\
2911      Rewr' >> art [GSYM lt_infty] ]
2912QED
2913
2914(* more general version *)
2915Theorem finite_second_moments_eq_integrable_squares :
2916    !p X. prob_space p /\ real_random_variable X p ==>
2917         (finite_second_moments p X <=> !c. integrable p (\x. (X x - Normal c) pow 2))
2918Proof
2919    rpt STRIP_TAC
2920 >> EQ_TAC >> STRIP_TAC
2921 >| [ (* goal 1 (of 2) *)
2922      RW_TAC std_ss [integrable_def] >| (* 3 subgoals *)
2923      [ (* goal 1.1 (of 3) *)
2924        `!x. (X x - Normal c) pow 2 = ((\x. X x - Normal c) x) pow 2` by METIS_TAC [] \\
2925         POP_ORW >> MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
2926         fs [prob_space_def, measure_space_def, real_random_variable_def,
2927             random_variable_def, space_def, p_space_def, events_def] \\
2928         MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
2929         qexistsl_tac [`X`, `\x. Normal c`] >> RW_TAC std_ss [] \\
2930         MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST >> Q.EXISTS_TAC `Normal c` \\
2931         RW_TAC std_ss [space_def],
2932         (* goal 1.2 (of 3) *)
2933         Know `fn_plus (\x. (X x - Normal c) pow 2) = (\x. (X x - Normal c) pow 2)`
2934         >- (MATCH_MP_TAC FN_PLUS_POS_ID >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2935         Know `pos_fn_integral p (\x. (X x - Normal c) pow 2) =
2936                      integral p (\x. (X x - Normal c) pow 2)`
2937         >- (MATCH_MP_TAC EQ_SYM \\
2938             MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, le_pow2]) \\
2939         Rewr' >> REWRITE_TAC [lt_infty] \\
2940         IMP_RES_TAC finite_second_moments_all \\
2941         fs [second_moment_def, moment_def, expectation_def],
2942         (* goal 1.3 (of 3) *)
2943         Know `fn_minus (\x. (X x - Normal c) pow 2) = (\x. 0)`
2944         >- (MATCH_MP_TAC FN_MINUS_POS_ZERO >> RW_TAC std_ss [le_pow2]) >> Rewr' \\
2945         Know `pos_fn_integral p (\x. 0) = 0`
2946         >- (MATCH_MP_TAC pos_fn_integral_zero >> fs [prob_space_def]) >> Rewr' \\
2947         REWRITE_TAC [extreal_of_num_def, extreal_not_infty] ],
2948      (* goal 2 (of 2) *)
2949      Know `finite_second_moments p X <=> second_moment p X (Normal c) < PosInf`
2950      >- (EQ_TAC >> DISCH_TAC >| (* 2 subgoals *)
2951          [ (* goal 2.1 (of 2) *)
2952            IMP_RES_TAC finite_second_moments_all >> art [],
2953            (* goal 2.2 (of 2) *)
2954            REWRITE_TAC [finite_second_moments_def] \\
2955            Q.EXISTS_TAC `Normal c` >> art [] ]) >> Rewr' \\
2956      REWRITE_TAC [GSYM lt_infty, second_moment_def, moment_def] \\
2957      METIS_TAC [integrable_imp_finite_expectation] ]
2958QED
2959
2960Theorem bounded_imp_finite_second_moments :
2961    !p X. prob_space p /\ random_variable X p Borel /\
2962         (?r. !x. x IN p_space p ==> abs (X x) <= Normal r) ==> finite_second_moments p X
2963Proof
2964    rpt STRIP_TAC
2965 >> Know ‘real_random_variable X p’
2966 >- (rw [real_random_variable_def] \\
2967     fs [abs_bounds, lt_infty] >| (* 2 subgoals *)
2968     [ (* goal 1 (of 2) *)
2969       MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC ‘Normal (-r)’ \\
2970       fs [lt_infty, extreal_ainv_def],
2971       (* goal 2 (of 2) *)
2972       MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘Normal r’ \\
2973       rw [lt_infty] ])
2974 >> DISCH_TAC
2975 >> Know ‘finite_second_moments p X <=> integrable p (\x. X x pow 2)’
2976 >- (MATCH_MP_TAC finite_second_moments_eq_integrable_square >> art [])
2977 >> Rewr'
2978 >> fs [integrable_def, real_random_variable, prob_space_def, p_space_def, events_def]
2979 >> CONJ_TAC
2980 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
2981     fs [measure_space_def])
2982 >> reverse CONJ_TAC
2983 >- (rw [FN_MINUS_POS_ZERO, le_pow2] \\
2984     rw [pos_fn_integral_zero, extreal_of_num_def, extreal_not_infty])
2985 >> rw [FN_PLUS_POS_ID, le_pow2, lt_infty]
2986 >> MATCH_MP_TAC let_trans
2987 >> Q.EXISTS_TAC ‘pos_fn_integral p (\x. Normal (r pow 2))’
2988 (* applying pos_fn_integral_const *)
2989 >> reverse CONJ_TAC
2990 >- (REWRITE_TAC [GSYM lt_infty] \\
2991     Suff ‘pos_fn_integral p (\x. Normal (r pow 2)) =
2992           Normal (r pow 2) * measure p (m_space p)’ >- rw [] \\
2993     MATCH_MP_TAC pos_fn_integral_const \\
2994     rw [le_pow2, lt_infty, extreal_of_num_def, extreal_not_infty])
2995 >> MATCH_MP_TAC pos_fn_integral_mono
2996 >> rw [le_pow2, GSYM extreal_pow_def]
2997 (* ‘0 <= r’ is implicit *)
2998 >> reverse (Cases_on ‘0 <= r’)
2999 >- (fs [GSYM real_lt] \\
3000     Suff ‘abs (X x) < 0’ >- METIS_TAC [abs_pos, let_antisym] \\
3001     MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘Normal r’ >> rw [] \\
3002     rw [extreal_of_num_def, extreal_lt_eq])
3003 >> ‘X x pow 2 = (abs (X x)) pow 2’ by rw [abs_pow2] >> POP_ORW
3004 >> MATCH_MP_TAC pow_le >> rw [abs_pos]
3005QED
3006
3007(* NOTE: ‘integrable p X’ makes sure that ‘expectation p X’ exists and is finite *)
3008Theorem bounded_imp_finite_second_moments' :
3009    !p X. prob_space p /\ random_variable X p Borel /\ integrable p X /\
3010         (?r. !x. x IN p_space p ==> abs (X x - expectation p X) <= Normal r) ==>
3011          finite_second_moments p X
3012Proof
3013    qx_genl_tac [‘p’, ‘Y’] >> rpt STRIP_TAC
3014 >> MATCH_MP_TAC bounded_imp_finite_second_moments >> art []
3015 >> Q.ABBREV_TAC ‘M = expectation p Y’
3016 >> ‘M <> PosInf /\ M <> NegInf’ by METIS_TAC [integrable_imp_finite_expectation]
3017 >> ‘r < 0 \/ 0 <= r’ by PROVE_TAC [REAL_LTE_TOTAL]
3018 >- (‘?x. x IN p_space p’ by METIS_TAC [PROB_SPACE_NOT_EMPTY, MEMBER_NOT_EMPTY] \\
3019     ‘Normal r < 0’ by METIS_TAC [extreal_of_num_def, extreal_lt_eq] \\
3020     ‘abs (Y x - M) < 0’ by METIS_TAC [let_trans] \\
3021     METIS_TAC [abs_pos, let_antisym])
3022 >> ‘?m. M = Normal m’ by METIS_TAC [extreal_cases] >> fs []
3023 >> rename1 ‘0 <= a’
3024 >> Know ‘!x. x IN p_space p ==> Y x <> NegInf /\ Y x <> PosInf’
3025 >- (NTAC 2 STRIP_TAC \\
3026     Q.PAT_X_ASSUM ‘!x. x IN p_space p ==> P’ (MP_TAC o (Q.SPEC ‘x’)) \\
3027     RW_TAC std_ss [] >> CCONTR_TAC >> fs [extreal_abs_def, extreal_sub_def])
3028 >> DISCH_TAC
3029 >> Q.EXISTS_TAC ‘max (m + a) (abs (m - a))’
3030 >> RW_TAC std_ss []
3031 >> Q.PAT_X_ASSUM ‘!x. x IN p_space p ==> Y x <> NegInf /\ Y x <> PosInf’
3032       (MP_TAC o (Q.SPEC ‘x’))
3033 >> Q.PAT_X_ASSUM ‘!x. x IN p_space p ==> abs _ <= Normal a’ (MP_TAC o (Q.SPEC ‘x’))
3034 >> RW_TAC std_ss []
3035 >> ‘?y. Y x = Normal y’ by METIS_TAC [extreal_cases]
3036 >> gs [extreal_sub_def, extreal_abs_def]
3037 >> rw [REAL_LE_MAX]
3038 >> ‘0 <= m \/ m <= 0’ by PROVE_TAC [REAL_LE_TOTAL]
3039 >| [ (* goal 1 (of 2) *)
3040      DISJ1_TAC \\
3041     ‘abs m + abs (y - m) <= m + a’ by PROVE_TAC [REAL_LE_LADD, ABS_REFL] \\
3042      MATCH_MP_TAC REAL_LE_TRANS \\
3043      Q.EXISTS_TAC ‘abs m + abs (y - m)’ >> art [] \\
3044     ‘abs y = abs (m + (y - m))’ by REAL_ARITH_TAC >> POP_ORW \\
3045      REWRITE_TAC [ABS_TRIANGLE],
3046      (* goal 2 (of 2) *)
3047      DISJ2_TAC \\
3048      MATCH_MP_TAC REAL_LE_TRANS \\
3049      Q.EXISTS_TAC ‘abs m + abs (y - m)’ >> REWRITE_TAC [ABS_TRIANGLE_SUB] \\
3050      Suff ‘abs (m - a) = abs m + a’ >- rw [REAL_LE_LADD] \\
3051     ‘abs (m - a) = abs (a - m)’ by REAL_ARITH_TAC >> POP_ORW \\
3052      Know ‘abs (a - m) = a - m’
3053      >- (rw [ABS_REFL, REAL_SUB_LE] \\
3054          MATCH_MP_TAC REAL_LE_TRANS >> Q.EXISTS_TAC ‘0’ >> art []) >> Rewr' \\
3055      Know ‘abs (--m) = -m’ >- art [Once ABS_NEG, ABS_REFL, REAL_NEG_GE0] \\
3056      REWRITE_TAC [REAL_NEG_NEG] >> Rewr' \\
3057      REAL_ARITH_TAC ]
3058QED
3059
3060Theorem finite_second_moments_imp_integrable :
3061    !p X. prob_space p /\ real_random_variable X p /\ finite_second_moments p X ==>
3062          integrable p X
3063Proof
3064    rpt GEN_TAC >> STRIP_TAC
3065 >> MATCH_MP_TAC integrable_from_square >> art []
3066 >> IMP_RES_TAC finite_second_moments_eq_integrable_square
3067QED
3068
3069(* This theorem doesn't hold for general measure spaces (cf. integrable_bounded) *)
3070Theorem bounded_imp_integrable :
3071    !p X. prob_space p /\ random_variable X p Borel /\
3072         (?r. !x. x IN p_space p ==> abs (X x) <= Normal r) ==> integrable p X
3073Proof
3074    rpt STRIP_TAC
3075 >> MATCH_MP_TAC finite_second_moments_imp_integrable >> art []
3076 >> reverse CONJ_TAC
3077 >- (MATCH_MP_TAC bounded_imp_finite_second_moments >> art [] \\
3078     Q.EXISTS_TAC ‘r’ >> art [])
3079 >> FULL_SIMP_TAC std_ss [abs_bounds]
3080 >> RW_TAC std_ss [real_random_variable_def, lt_infty]
3081 >| [ (* goal 1 (of 2) *)
3082      MATCH_MP_TAC lte_trans \\
3083      Q.EXISTS_TAC ‘-Normal r’ >> rw [lt_infty, extreal_ainv_def],
3084      (* goal 2 (of 2) *)
3085      MATCH_MP_TAC let_trans \\
3086      Q.EXISTS_TAC  ‘Normal r’ >> rw [lt_infty, extreal_ainv_def] ]
3087QED
3088
3089Theorem finite_second_moments_imp_finite_expectation :
3090    !p X. prob_space p /\ real_random_variable X p /\ finite_second_moments p X ==>
3091          expectation p X <> PosInf /\ expectation p X <> NegInf
3092Proof
3093    rpt GEN_TAC >> STRIP_TAC
3094 >> MATCH_MP_TAC integrable_imp_finite_expectation >> art []
3095 >> MATCH_MP_TAC finite_second_moments_imp_integrable >> art []
3096QED
3097
3098Theorem finite_second_moments_cmul :
3099    !p X c. prob_space p /\ real_random_variable X p /\ finite_second_moments p X ==>
3100            finite_second_moments p (\x. Normal c * X x)
3101Proof
3102    rpt STRIP_TAC
3103 >> ‘real_random_variable (\x. Normal c * X x) p’
3104      by METIS_TAC [real_random_variable_cmul]
3105 >> ‘integrable p X’ by METIS_TAC [finite_second_moments_imp_integrable]
3106 >> ‘integrable p (\x. X x pow 2)’
3107      by METIS_TAC [finite_second_moments_eq_integrable_square]
3108 >> Q.PAT_X_ASSUM ‘finite_second_moments p X’ MP_TAC
3109 >> RW_TAC std_ss [finite_second_moments_literally, GSYM lt_infty, pow_mul, extreal_pow_def]
3110 >> Know ‘expectation p (\x. Normal (c pow 2) * X x pow 2) =
3111          Normal (c pow 2) * expectation p (\x. X x pow 2)’
3112 >- (HO_MATCH_MP_TAC expectation_cmul >> art [])
3113 >> Rewr'
3114 >> Know ‘expectation p (\x. X x pow 2) <> NegInf’
3115 >- (MATCH_MP_TAC pos_not_neginf \\
3116     MATCH_MP_TAC expectation_pos >> rw [le_pow2])
3117 >> DISCH_TAC
3118 >> ‘?r. expectation p (\x. X x pow 2) = Normal r’ by METIS_TAC [extreal_cases]
3119 >> rw [extreal_mul_def]
3120QED
3121
3122Theorem finite_second_moments_ainv :
3123    !p X. prob_space p /\ real_random_variable X p /\ finite_second_moments p X ==>
3124          finite_second_moments p (\x. -X x)
3125Proof
3126    rpt STRIP_TAC
3127 >> Know ‘(\x. -X x) = (\x. Normal (-1) * X x)’
3128 >- RW_TAC std_ss [FUN_EQ_THM, Once neg_minus1, extreal_of_num_def, extreal_ainv_def]
3129 >> Rewr'
3130 >> MATCH_MP_TAC finite_second_moments_cmul >> art []
3131QED
3132
3133Theorem finite_second_moments_cdiv :
3134    !p X c. prob_space p /\ real_random_variable X p /\
3135            finite_second_moments p X /\ c <> 0 ==>
3136            finite_second_moments p (\x. X x / Normal c)
3137Proof
3138    rw [extreal_div_def, extreal_inv_def, Once mul_comm]
3139 >> MATCH_MP_TAC finite_second_moments_cmul >> art []
3140QED
3141
3142Theorem finite_second_moments_cong :
3143    !p X Y. prob_space p /\ (!x. x IN p_space p ==> X x = Y x) ==>
3144           (finite_second_moments p X <=> finite_second_moments p Y)
3145Proof
3146    RW_TAC std_ss [finite_second_moments_def, second_moment_def, moment_def]
3147 >> Suff ‘!a. expectation p (\x. (X x - a) pow 2) =
3148              expectation p (\x. (Y x - a) pow 2)’ >- rw []
3149 >> Q.X_GEN_TAC ‘a’
3150 >> MATCH_MP_TAC expectation_cong >> rw []
3151QED
3152
3153(* An easy corollary of Minkowski_inequality *)
3154Theorem finite_second_moments_add :
3155    !p X Y. prob_space p /\
3156            real_random_variable X p /\ real_random_variable Y p /\
3157            finite_second_moments p X /\ finite_second_moments p Y ==>
3158            finite_second_moments p (\x. X x + Y x)
3159Proof
3160    rpt STRIP_TAC
3161 >> ‘real_random_variable (\x. X x + Y x) p’
3162       by METIS_TAC [real_random_variable_add]
3163 >> rfs [finite_second_moments_eq_integrable_square, prob_space_def]
3164 >> fs [real_random_variable, p_space_def, events_def]
3165 >> Suff ‘(\x. X x + Y x) IN L2_space p’
3166 >- rw [L2_space_alt_integrable_square]
3167 >> MP_TAC (Q.SPECL [‘2’, ‘p’, ‘X’, ‘Y’] Minkowski_inequality)
3168 >> ‘1 <= (2 :extreal)’ by rw [extreal_of_num_def, extreal_le_eq]
3169 >> rw [L2_space_alt_integrable_square]
3170QED
3171
3172Theorem finite_second_moments_sum :
3173    !p X (J :'index set). prob_space p /\ FINITE J /\
3174         (!i. i IN J ==> real_random_variable (X i) p) /\
3175         (!i. i IN J ==> finite_second_moments p (X i)) ==>
3176          finite_second_moments p (\x. SIGMA (\n. X n x) J)
3177Proof
3178    rpt STRIP_TAC
3179 >> NTAC 3 (POP_ASSUM MP_TAC)
3180 >> qid_spec_tac ‘J’
3181 >> Induct_on ‘J’
3182 >> rw [EXTREAL_SUM_IMAGE_EMPTY]
3183 >- (IMP_RES_TAC real_random_variable_zero \\
3184     rw [finite_second_moments_eq_finite_variance, variance_zero])
3185 >> Know ‘finite_second_moments p (\x. SIGMA (\n. X n x) (e INSERT J)) <=>
3186          finite_second_moments p (\x. X e x + SIGMA (\n. X n x) (J DELETE e))’
3187 >- (MATCH_MP_TAC finite_second_moments_cong >> rw [] \\
3188     MATCH_MP_TAC (List.nth
3189                    (CONJUNCTS (BETA_RULE
3190                                 (Q.SPEC ‘(\n. X n x)’ EXTREAL_SUM_IMAGE_THM)),2)) \\
3191     simp [] >> DISJ1_TAC >> Q.X_GEN_TAC ‘i’ \\
3192     METIS_TAC [real_random_variable])
3193 >> Rewr'
3194 >> ‘J DELETE e = J’ by PROVE_TAC [DELETE_NON_ELEMENT]
3195 >> POP_ORW
3196 >> HO_MATCH_MP_TAC finite_second_moments_add
3197 >> RW_TAC std_ss []
3198 >| [ (* goal 1 (of 3) *)
3199      METIS_TAC [],
3200      (* goal 2 (of 3) *)
3201      MATCH_MP_TAC real_random_variable_sum >> RW_TAC std_ss [],
3202      (* goal 3 (of 3) *)
3203      METIS_TAC [] ]
3204QED
3205
3206Theorem finite_second_moments_sub :
3207    !p X Y. prob_space p /\
3208            real_random_variable X p /\ real_random_variable Y p /\
3209            finite_second_moments p X /\ finite_second_moments p Y ==>
3210            finite_second_moments p (\x. X x - Y x)
3211Proof
3212    rpt STRIP_TAC
3213 >> Know ‘finite_second_moments p (\x. X x - Y x) <=>
3214          finite_second_moments p (\x. X x + -Y x)’
3215 >- (MATCH_MP_TAC finite_second_moments_cong >> rw [] \\
3216     MATCH_MP_TAC extreal_sub_add >> METIS_TAC [real_random_variable])
3217 >> Rewr'
3218 >> HO_MATCH_MP_TAC finite_second_moments_add >> rw []
3219 >| [ (* goal 1 (of 2) *)
3220      MATCH_MP_TAC real_random_variable_ainv >> art [],
3221      (* goal 2 (of 2) *)
3222      MATCH_MP_TAC finite_second_moments_ainv >> art [] ]
3223QED
3224
3225(* An easy corollary of Cauchy_Schwarz_inequality *)
3226Theorem finite_second_moments_imp_integrable_mul :
3227    !p X Y. prob_space p /\
3228            real_random_variable X p /\ real_random_variable Y p /\
3229            finite_second_moments p X /\ finite_second_moments p Y ==>
3230            integrable p (\x. X x * Y x)
3231Proof
3232    rpt STRIP_TAC
3233 >> rfs [finite_second_moments_eq_integrable_square, prob_space_def]
3234 >> fs [real_random_variable, p_space_def, events_def]
3235 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘Y’] Cauchy_Schwarz_inequality)
3236 >> rw [L2_space_alt_integrable_square]
3237QED
3238
3239Theorem expectation_real_affine :
3240    !p X c. prob_space p /\ real_random_variable X p /\ integrable p X /\
3241            c <> PosInf /\ c <> NegInf ==>
3242           (expectation p (\x. X x + c) = expectation p X + c)
3243Proof
3244    RW_TAC std_ss [real_random_variable_def, prob_space_def, p_space_def,
3245                   events_def, expectation_def]
3246 >> `?r. c = Normal r` by METIS_TAC [extreal_cases] >> POP_ORW
3247 >> Know `integral p (\x. X x + (\x. Normal r) x) =
3248          integral p X + integral p (\x. Normal r)`
3249 >- (MATCH_MP_TAC integral_add >> rw [integral_const] \\
3250     MATCH_MP_TAC integrable_const >> rw [lt_infty])
3251 >> BETA_TAC >> Rewr'
3252 >> rw [integral_const, extreal_add_def, extreal_sub_def]
3253QED
3254
3255Theorem expectation_normal :
3256    !p X. prob_space p /\ integrable p X ==> ?r. expectation p X = Normal r
3257Proof
3258    fs [prob_space_def, expectation_def, integrable_normal_integral]
3259QED
3260
3261Theorem expectation_finite = integrable_imp_finite_expectation
3262
3263Theorem variance_real_affine :
3264    !p X c. prob_space p /\ real_random_variable X p /\ integrable p X /\
3265            c <> PosInf /\ c <> NegInf ==> (variance p (\x. X x + c) = variance p X)
3266Proof
3267    RW_TAC std_ss [variance_alt]
3268 >> MATCH_MP_TAC expectation_cong
3269 >> RW_TAC std_ss [expectation_real_affine]
3270 >> `?r. c = Normal r` by METIS_TAC [extreal_cases] >> POP_ORW
3271 >> `?e. expectation p X = Normal e` by METIS_TAC [expectation_normal]
3272 >> fs [real_random_variable_def]
3273 >> `?z. X x = Normal z` by METIS_TAC [extreal_cases]
3274 >> simp [extreal_add_def, extreal_sub_def]
3275 >> Suff ‘z + r - (e + r) = z - e’ >- rw []
3276 >> REAL_ARITH_TAC
3277QED
3278
3279Theorem variance_real_affine' :
3280    !p X c. prob_space p /\ real_random_variable X p /\ integrable p X /\
3281            c <> PosInf /\ c <> NegInf ==> (variance p (\x. X x - c) = variance p X)
3282Proof
3283    rpt STRIP_TAC
3284 >> Know ‘variance p (\x. X x - c) = variance p (\x. X x + -c)’
3285 >- (MATCH_MP_TAC variance_cong >> rw [] \\
3286     MATCH_MP_TAC extreal_sub_add \\
3287     fs [real_random_variable_def]) >> Rewr'
3288 >> MATCH_MP_TAC variance_real_affine >> art []
3289 >> `?r. c = Normal r` by METIS_TAC [extreal_cases]
3290 >> rw [extreal_ainv_def, extreal_not_infty]
3291QED
3292
3293Theorem variance_cmul :
3294    !p X c. prob_space p /\ real_random_variable X p /\
3295            finite_second_moments p X ==>
3296           (variance p (\x. Normal c * X x) = Normal (c pow 2) * variance p X)
3297Proof
3298    rw [variance_alt]
3299 >> ‘integrable p X’ by PROVE_TAC [finite_second_moments_imp_integrable]
3300 >> ASM_SIMP_TAC std_ss [expectation_cmul]
3301 >> Know ‘expectation p (\x. (Normal c * X x - Normal c * expectation p X) pow 2) =
3302          expectation p (\x. (Normal c * (X x - expectation p X)) pow 2)’
3303 >- (MATCH_MP_TAC expectation_cong >> rw [] \\
3304     Suff ‘Normal c * (X x - expectation p X) =
3305           Normal c * X x - Normal c * expectation p X’ >- Rewr \\
3306     MATCH_MP_TAC sub_ldistrib \\
3307     fs [real_random_variable_def, extreal_not_infty] \\
3308     PROVE_TAC [integrable_imp_finite_expectation])
3309 >> Rewr'
3310 >> REWRITE_TAC [pow_mul, extreal_pow_def]
3311 >> HO_MATCH_MP_TAC expectation_cmul >> art []
3312 >> ‘expectation p X <> PosInf /\ expectation p X <> NegInf’
3313      by PROVE_TAC [integrable_imp_finite_expectation]
3314 >> ‘?r. expectation p X = Normal r’ by METIS_TAC [extreal_cases]
3315 >> POP_ORW
3316 >> METIS_TAC [finite_second_moments_eq_integrable_squares]
3317QED
3318
3319Theorem variance_cdiv :
3320    !p X c. prob_space p /\ real_random_variable X p /\
3321            finite_second_moments p X /\ c <> 0 ==>
3322           (variance p (\x. X x / Normal c) = variance p X / Normal (c pow 2))
3323Proof
3324    rw [extreal_div_def, extreal_inv_def, POW_INV]
3325 >> ONCE_REWRITE_TAC [mul_comm]
3326 >> MATCH_MP_TAC variance_cmul >> art []
3327QED
3328
3329(* ------------------------------------------------------------------------- *)
3330(*    Markov and Chebyshev's Inequalities                                    *)
3331(* ------------------------------------------------------------------------- *)
3332
3333(* Markov's inequality (probability version) *)
3334Theorem prob_markov_inequality :
3335    !p X a c. prob_space p /\ integrable p X /\ 0 < c /\ a IN events p ==>
3336              prob p ({x | c <= abs (X x)} INTER a) <=
3337                inv c * (expectation p (\x. abs (X x) * indicator_fn a x))
3338Proof
3339    RW_TAC std_ss [prob_space_def, prob_def, events_def, expectation_def]
3340 >> MATCH_MP_TAC markov_inequality >> art []
3341QED
3342
3343(* The special version with `a = p_space p`, c.f. PROB_GSPEC for moving `a` outside *)
3344Theorem prob_markov_ineq :
3345    !p X c. prob_space p /\ integrable p X /\ 0 < c ==>
3346            prob p ({x | c <= abs (X x)} INTER p_space p) <= inv c * expectation p (abs o X)
3347Proof
3348    RW_TAC std_ss [prob_space_def, p_space_def, prob_def, events_def, expectation_def]
3349 >> MATCH_MP_TAC markov_ineq >> art []
3350QED
3351
3352(* Chebyshev's inequality (probability version) *)
3353Theorem chebyshev_inequality :
3354    !p X a t c. prob_space p /\ real_random_variable X p /\
3355                finite_second_moments p X /\ 0 < t /\ a IN events p ==>
3356       prob p ({x | t <= abs (X x - Normal c)} INTER a) <=
3357         inv (t pow 2) * (expectation p (\x. (X x - Normal c) pow 2 * indicator_fn a x))
3358Proof
3359    rpt STRIP_TAC
3360 >> Know `!x. t <= abs (X x - Normal c) <=> t pow 2 <= (X x - Normal c) pow 2`
3361 >- (GEN_TAC \\
3362     Know `0 <= t /\ 0 <= abs (X x - Normal c)` >- PROVE_TAC [lt_imp_le, abs_pos] \\
3363     DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP pow2_le_eq)) \\
3364     REWRITE_TAC [abs_pow2]) >> Rewr'
3365 >> Q.ABBREV_TAC `Y = \x. (X x - Normal c) pow 2`
3366 >> Know `!x. (X x - Normal c) pow 2 = abs (Y x)`
3367 >- (GEN_TAC >> Q.UNABBREV_TAC `Y` >> BETA_TAC \\
3368    `0 <= (X x - Normal c) pow 2` by PROVE_TAC [le_pow2] >> fs [GSYM abs_refl]) >> Rewr'
3369 >> MATCH_MP_TAC prob_markov_inequality >> art []
3370 >> reverse CONJ_TAC >- (MATCH_MP_TAC pow_pos_lt >> art [])
3371 >> Q.UNABBREV_TAC `Y`
3372 >> METIS_TAC [finite_second_moments_eq_integrable_squares]
3373QED
3374
3375(* The special version with `a = p_space p` *)
3376Theorem chebyshev_ineq :
3377    !p X t c. prob_space p /\ real_random_variable X p /\
3378              finite_second_moments p X /\ 0 < t ==>
3379         prob p ({x | t <= abs (X x - Normal c)} INTER p_space p) <=
3380           inv (t pow 2) * (expectation p (\x. (X x - Normal c) pow 2))
3381Proof
3382    rpt STRIP_TAC
3383 >> Know `expectation p (\x. (X x - Normal c) pow 2) =
3384          expectation p (\x. (\x. (X x - Normal c) pow 2) x * indicator_fn (p_space p) x)`
3385 >- (FULL_SIMP_TAC pure_ss [prob_space_def, p_space_def, events_def, expectation_def] \\
3386     MATCH_MP_TAC integral_mspace >> art [])
3387 >> BETA_TAC >> Rewr'
3388 >> MATCH_MP_TAC chebyshev_inequality >> art []
3389 >> MATCH_MP_TAC EVENTS_SPACE >> art []
3390QED
3391
3392(* The special version with `a = p_space p` and `m = expectation p X` *)
3393Theorem chebyshev_ineq_variance :
3394    !p X t. prob_space p /\ real_random_variable X p /\
3395            finite_second_moments p X /\ 0 < t ==>
3396         prob p ({x | t <= abs (X x - expectation p X)} INTER p_space p) <=
3397           inv (t pow 2) * variance p X
3398Proof
3399    RW_TAC std_ss [variance_alt]
3400 >> IMP_RES_TAC finite_second_moments_imp_finite_expectation
3401 >> `?c. expectation p X = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW
3402 >> MATCH_MP_TAC chebyshev_ineq >> art []
3403QED
3404
3405(* The special version with ‘<’ in place of ‘<=’ *)
3406Theorem chebyshev_ineq_variance' :
3407    !p X t. prob_space p /\ real_random_variable X p /\
3408            finite_second_moments p X /\ 0 < t ==>
3409         prob p ({x | t < abs (X x - expectation p X)} INTER p_space p) <=
3410           inv (t pow 2) * variance p X
3411Proof
3412    rpt STRIP_TAC
3413 >> MATCH_MP_TAC le_trans
3414 >> Q.EXISTS_TAC ‘prob p ({x | t <= abs (X x - expectation p X)} INTER p_space p)’
3415 >> reverse CONJ_TAC
3416 >- (MATCH_MP_TAC chebyshev_ineq_variance >> art [])
3417 >> MATCH_MP_TAC PROB_INCREASING >> art []
3418 >> REWRITE_TAC [CONJ_ASSOC]
3419 >> reverse CONJ_TAC
3420 >- (rw [SUBSET_DEF, GSPECIFICATION] \\
3421     MATCH_MP_TAC lt_imp_le >> art [])
3422 >> fs [real_random_variable, prob_space_def, p_space_def, events_def]
3423 >> Q.ABBREV_TAC ‘Y = \x. X x - expectation p X’ >> simp []
3424 >> ‘sigma_algebra (measurable_space p)’
3425      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA]
3426 >> Know ‘Y IN measurable (m_space p,measurable_sets p) Borel’
3427 >- (rw [Abbr ‘Y’] \\
3428     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB' \\
3429     qexistsl_tac [‘X’, ‘\x. expectation p X’] >> simp [] \\
3430     fs [measure_space_def] \\
3431     MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST' >> art [])
3432 >> DISCH_TAC
3433 >> rw [lt_abs_bounds, le_abs_bounds]
3434 >| [ (* goal 1 (of 2) *)
3435     ‘{x | Y x < -t \/ t < Y x} INTER m_space p =
3436        ({x | Y x < -t} INTER m_space p) UNION
3437        ({x | t < Y x} INTER m_space p)’ by SET_TAC [] >> POP_ORW \\
3438      MATCH_MP_TAC MEASURE_SPACE_UNION >> art [] \\
3439      METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE],
3440      (* goal 2 (of 2) *)
3441     ‘{x | Y x <= -t \/ t <= Y x} INTER m_space p =
3442        ({x | Y x <= -t} INTER m_space p) UNION
3443        ({x | t <= Y x} INTER m_space p)’ by SET_TAC [] >> POP_ORW \\
3444      MATCH_MP_TAC MEASURE_SPACE_UNION >> art [] \\
3445      METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE] ]
3446QED
3447
3448(******************************************************************************)
3449(*  Independent families [3, p.31-33] - 9 definitions                         *)
3450(******************************************************************************)
3451
3452(* "The concept of mutual independence of two or more experiments holds,
3453    in a certain sense, a central position in the theory of probability....
3454    Historically, the independence of experiments and random variables represents
3455    the very mathematical concept that has given the theory of probability its
3456    peculiar stamp."
3457
3458  -- A. N. Kolmogorov, "Foundations of the Theory of Probability." [1] *)
3459
3460(* 1. independence of two events: (DO NOT CHANGE) *)
3461Definition indep_def :
3462    indep p a b = (a IN events p /\ b IN events p /\
3463                   (prob p (a INTER b) = prob p a * prob p b))
3464End
3465
3466(* 2. extension of `indep`: a sequence of pairwise independent events
3467
3468   new definition based on real_topologyTheory.pairwise, users may use
3469  `pairwise (indep p) E` if possible (for any two different events in E).
3470 *)
3471Definition pairwise_indep_events :
3472    pairwise_indep_events p E (J :'index set) =
3473      pairwise (\i j. indep p (E i) (E j)) J
3474End
3475
3476Theorem pairwise_indep_events_def :
3477    !p E (J :'index set).
3478       pairwise_indep_events p E J <=>
3479       !i j. i IN J /\ j IN J /\ i <> j ==> indep p (E i) (E j)
3480Proof
3481    RW_TAC std_ss [pairwise_indep_events, pairwise]
3482QED
3483
3484(* 3. extension of `indep`: a sequence of total independent events *)
3485Definition indep_events_def :
3486    indep_events p E (J :'index set) =
3487      !N. N SUBSET J /\ N <> {} /\ FINITE N ==>
3488         (prob p (BIGINTER (IMAGE E N)) = PI (prob p o E) N)
3489End
3490
3491(* 4. independence of two sets/collections of events: (DO NOT CHANGE) *)
3492Definition indep_families_def :
3493    indep_families p q r = !s t. s IN q /\ t IN r ==> indep p s t
3494End
3495
3496Overload indep_sets = “indep_families”
3497
3498(* 5. extension of `indep_families`: pairwise independent sets/collections of events *)
3499Definition pairwise_indep_sets :
3500    pairwise_indep_sets p A (J :'index set) =
3501      pairwise (\i j. indep_families p (A i) (A j)) J
3502End
3503
3504Theorem pairwise_indep_sets_def :
3505    !p A (J :'index set).
3506       pairwise_indep_sets p A J <=>
3507       !i j. i IN J /\ j IN J /\ i <> j ==> indep_families p (A i) (A j)
3508Proof
3509    RW_TAC std_ss [pairwise_indep_sets, pairwise]
3510QED
3511
3512(* 6. extension of `indep_families`: total independent sets/collections of events *)
3513Definition indep_sets_def :
3514    indep_sets p A (J :'index set) =
3515      !N. N SUBSET J /\ N <> {} /\ FINITE N ==>
3516         !E. E IN (N --> A) ==> (prob p (BIGINTER (IMAGE E N)) = PI (prob p o E) N)
3517End
3518
3519(* 7. independence of two r.v.'s, added `INTER p_space p` after taking the PREIMAGE *)
3520Definition indep_rv_def :
3521    indep_rv (p :'a p_space) (X :'a -> 'b) (Y :'a -> 'b) s t =
3522      !a b. (a IN subsets s) /\ (b IN subsets t) ==>
3523            indep p ((PREIMAGE X a) INTER p_space p)
3524                    ((PREIMAGE Y b) INTER p_space p)
3525End
3526
3527Overload indep_vars = “indep_rv”
3528
3529(* 8. extension of `indep_rv`: pairwise independent random variables *)
3530Definition pairwise_indep_vars :
3531    pairwise_indep_vars p X A (J :'index set) =
3532      pairwise (\i j. indep_rv p (X i) (X j) (A i) (A j)) J
3533End
3534
3535Theorem pairwise_indep_vars_def :
3536    !p X A (J :'index set).
3537       pairwise_indep_vars p X A J <=>
3538       !i j. i IN J /\ j IN J /\ i <> j ==> indep_rv p (X i) (X j) (A i) (A j)
3539Proof
3540    RW_TAC std_ss [pairwise_indep_vars, pairwise]
3541QED
3542
3543Theorem pairwise_indep_vars_subset :
3544    !p X A (s :'index set) (t :'index set).
3545       pairwise_indep_vars p X A t /\ s SUBSET t ==>
3546       pairwise_indep_vars p X A s
3547Proof
3548    rw [pairwise_indep_vars_def]
3549 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
3550 >> METIS_TAC [SUBSET_DEF]
3551QED
3552
3553(* 9. extension of `indep-rv`: totally/mutually independent r.v.'s
3554
3555  See indep_vars_alt_indep_events for a weaker equivalent condition for testing
3556      independence.
3557
3558  NOTE: ‘indep_vars’ has been modified to make sure [indep_vars_subset] holds.
3559
3560  old definition:
3561
3562Definition old_indep_vars_def :
3563    old_indep_vars p X A (J :'index set) =
3564      !E. E IN (J --> (subsets o A)) ==>
3565          indep_events p (\n. (PREIMAGE (X n) (E n)) INTER p_space p) J
3566End
3567
3568  new definition is moved to martingaleTheory.indep_functions_def
3569 *)
3570Definition indep_vars_def :
3571    indep_vars p X A (J :'index set) =
3572      !E N. N SUBSET J /\ N <> {} /\ FINITE N /\
3573            E IN (N --> subsets o A) ==>
3574            prob p (BIGINTER (IMAGE (\n. PREIMAGE (X n) (E n) INTER p_space p) N)) =
3575            PI (prob p o (\n. PREIMAGE (X n) (E n) INTER p_space p)) N
3576End
3577
3578(* NOTE: If a set of r.v.'s is (totally) independent, so is any subset of them.
3579         With the new definition of ‘indep_vars’, this proof is very easy now.
3580 *)
3581Theorem indep_vars_subset :
3582    !p X A (s :'index set) (t :'index set).
3583       indep_vars p X A t /\ s SUBSET t ==> indep_vars p X A s
3584Proof
3585    RW_TAC std_ss [indep_vars_def, IN_DFUNSET, indep_events_def]
3586 >> FIRST_X_ASSUM irule >> simp []
3587 >> PROVE_TAC [SUBSET_TRANS]
3588QED
3589
3590(* NOTE: the old and new definitions are actually equivalent, given ‘A n’ is indeed
3591   a sigma-algebra (which can be actually weakened to ‘?x. x IN subsets (A n)’), or
3592   ring, semiring, algebra, etc.
3593 *)
3594Theorem indep_vars_alt_indep_events :
3595    !p X A (J :'index set).
3596       (!n. n IN J ==> sigma_algebra (A n)) ==>
3597       (indep_vars p X A (J :'index set) <=>
3598        !E. E IN (J --> (subsets o A)) ==>
3599            indep_events p (\n. (PREIMAGE (X n) (E n)) INTER p_space p) J)
3600Proof
3601    rpt STRIP_TAC
3602 >> EQ_TAC
3603 >> RW_TAC std_ss [indep_vars_def, indep_events_def]
3604 >- (FIRST_X_ASSUM MATCH_MP_TAC >> fs [IN_DFUNSET] \\
3605     METIS_TAC [SUBSET_DEF])
3606 (* The key is to choose V such that, for each indexes ‘n NOTIN N’, an arbitrary
3607    element ‘E n’ is choosen such that ‘E n IN subsets (A n)’ holds. Here we chose
3608   ‘{}’, assuming ‘sigma_algebra (A n)’.
3609  *)
3610 >> Q.ABBREV_TAC ‘V = \n. if n IN N then E n else {}’
3611 >> Q.PAT_X_ASSUM ‘!E. E IN J --> subsets o A ==> P’ (MP_TAC o (Q.SPEC ‘V’))
3612 >> Know ‘V IN J --> subsets o A’
3613 >- (fs [Abbr ‘V’, IN_DFUNSET] >> rw [] \\
3614     METIS_TAC [SIGMA_ALGEBRA_EMPTY])
3615 >> RW_TAC std_ss []
3616 >> POP_ASSUM (MP_TAC o (Q.SPEC ‘N’))
3617 >> RW_TAC std_ss []
3618 >> Suff ‘IMAGE (\n. PREIMAGE (X n) (E n) INTER p_space p) N =
3619          IMAGE (\n. PREIMAGE (X n) (V n) INTER p_space p) N /\
3620          PI (prob p o (\n. PREIMAGE (X n) (E n) INTER p_space p)) N =
3621          PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) N’ >- rw []
3622 >> CONJ_TAC
3623 >- (rw [Once EXTENSION] >> EQ_TAC >> rw [Abbr ‘V’] \\
3624     Q.EXISTS_TAC ‘n’ >> rw [])
3625 >> MATCH_MP_TAC EXTREAL_PROD_IMAGE_EQ
3626 >> Q.X_GEN_TAC ‘n’ >> rw [Abbr ‘V’]
3627QED
3628
3629(* Alternative definition of independent r.v.'s for index set as ‘univ(:num)’
3630
3631   It's sufficient that the increasing first n r.v.'s are mutually independent,
3632   and no need for arbitrary (non-empty) subset N of univ(:num).
3633 *)
3634Theorem indep_vars_alt_univ :
3635    !p X A. prob_space p /\ (!n. sigma_algebra (A n)) /\
3636           (!n. random_variable (X n) p (A n)) ==>
3637       (indep_vars p X A univ(:num) <=>
3638        !E n. E IN (count1 n --> subsets o A) ==>
3639              prob p (BIGINTER (IMAGE (\n. PREIMAGE (X n) (E n) INTER p_space p) (count1 n))) =
3640              PI (prob p o (\n. PREIMAGE (X n) (E n) INTER p_space p)) (count1 n))
3641Proof
3642    RW_TAC std_ss [indep_vars_def]
3643 >> EQ_TAC >> rw [] (* only one goal remains *)
3644 >> Q.ABBREV_TAC ‘V = \n. if n IN N then E n else space (A n)’
3645 (* find the maximal element m of N *)
3646 >> MP_TAC (FINITE_is_measure_maximal |> INST_TYPE [“:'a” |-> “:num”]
3647                                      |> Q.SPECL [‘I’, ‘N’])
3648 >> rw [is_measure_maximal_def] >> rename1 ‘m IN N’
3649 >> Q.PAT_X_ASSUM ‘!E n. E IN count1 n --> subsets o A ==> P’
3650      (MP_TAC o (Q.SPECL [‘V’, ‘m’]))
3651 >> Know ‘V IN count1 m --> subsets o A’
3652 >- (rw [IN_DFUNSET, Abbr ‘V’] \\
3653     Cases_on ‘n IN N’ >- fs [IN_DFUNSET] \\
3654     simp [SIGMA_ALGEBRA_SPACE])
3655 >> RW_TAC std_ss []
3656 >> Suff ‘prob p (BIGINTER (IMAGE (\n. PREIMAGE (X n) (E n) INTER p_space p) N)) =
3657          prob p (BIGINTER (IMAGE (\n. PREIMAGE (X n) (V n) INTER p_space p) (count1 m))) /\
3658          PI (prob p o (\n. PREIMAGE (X n) (E n) INTER p_space p)) N =
3659          PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) (count1 m)’ >- rw []
3660 >> Q.ABBREV_TAC ‘D = count1 m DIFF N’
3661 >> ‘DISJOINT N D’ by rw [DISJOINT_ALT, Abbr ‘D’]
3662 >> Know ‘count1 m = N UNION D’
3663 >- (rw [Once EXTENSION, Abbr ‘D’] \\
3664     EQ_TAC >> rw [] >> rw [LT_SUC_LE]) >> Rewr'
3665 >> Know ‘IMAGE (\n. PREIMAGE (X n) (E n) INTER p_space p) N =
3666          IMAGE (\n. PREIMAGE (X n) (V n) INTER p_space p) N’
3667 >- (rw [Once EXTENSION, IN_IMAGE, Abbr ‘V’] \\
3668     EQ_TAC >> rw [] >> Q.EXISTS_TAC ‘n’ >> rw [])
3669 >> Rewr'
3670 >> Know ‘PI (prob p o (\n. PREIMAGE (X n) (E n) INTER p_space p)) N =
3671          PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) N’
3672 >- (MATCH_MP_TAC EXTREAL_PROD_IMAGE_EQ >> rw [Abbr ‘V’])
3673 >> Rewr'
3674 >> Cases_on ‘D = {}’ >- rw []
3675 >> Know ‘!n. n IN D ==> PREIMAGE (X n) (V n) INTER p_space p = p_space p’
3676 >- (rw [Abbr ‘D’, Abbr ‘V’, PREIMAGE_def] \\
3677     rw [Once EXTENSION] \\
3678     EQ_TAC >> rw [] \\
3679     fs [random_variable_def, measurable_def, IN_FUNSET])
3680 >> DISCH_TAC
3681 >> CONJ_TAC
3682 >- (rw [IMAGE_UNION, BIGINTER_UNION] \\
3683     Know ‘IMAGE (\n. PREIMAGE (X n) (V n) INTER p_space p) D =
3684           IMAGE (\n. p_space p) D’
3685     >- (rw [Once EXTENSION] \\
3686         EQ_TAC >> rw [] >> Q.EXISTS_TAC ‘n’ >> rw []) >> Rewr' \\
3687     Know ‘BIGINTER (IMAGE (\n. p_space p) D) = p_space p’
3688     >- (rw [Once EXTENSION, IN_BIGINTER_IMAGE] \\
3689         EQ_TAC >> rw [] \\
3690         FIRST_X_ASSUM MATCH_MP_TAC \\
3691         METIS_TAC [MEMBER_NOT_EMPTY]) >> Rewr' \\
3692     ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
3693     MATCH_MP_TAC PROB_UNDER_UNIV >> art [] \\
3694     MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [COUNTABLE_NUM] \\
3695     rw [SUBSET_DEF] \\
3696     fs [random_variable_def, measurable_def, IN_DFUNSET, Abbr ‘V’])
3697 >> Know ‘FINITE D’
3698 >- (irule SUBSET_FINITE >> Q.EXISTS_TAC ‘count1 m’ >> rw [Abbr ‘D’])
3699 >> DISCH_TAC
3700 >> Know ‘PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) (N UNION D) =
3701          PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) N *
3702          PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) D’
3703 >- (MATCH_MP_TAC EXTREAL_PROD_IMAGE_DISJOINT_UNION >> art [])
3704 >> Rewr'
3705 >> Suff ‘PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) D = 1’ >- rw []
3706 >> Know ‘PI (prob p o (\n. PREIMAGE (X n) (V n) INTER p_space p)) D =
3707          PI (prob p o (\n. p_space p)) D’
3708 >- (MATCH_MP_TAC EXTREAL_PROD_IMAGE_EQ >> rw [])
3709 >> Rewr'
3710 >> simp [o_DEF, PROB_UNIV, EXTREAL_PROD_IMAGE_ONE]
3711QED
3712
3713(* This is an old (possibly also wrong) definition not used anywhere,
3714
3715   cf. ‘martingale$indep_functions’ (or ‘indep_vars’) for a set of independent
3716   (measurable) functions, including r.v.'s.
3717
3718val indep_function_def = Define
3719   `indep_function p =
3720   {f | indep_families p (IMAGE (PREIMAGE (FST o f)) UNIV)
3721                         (IMAGE (PREIMAGE (SND o f)) (events p))}`;
3722 *)
3723
3724Theorem PROB_INDEP :
3725  !p s t u. indep p s t /\ (u = s INTER t) ==> (prob p u = prob p s * prob p t)
3726Proof
3727  RW_TAC std_ss [indep_def]
3728QED
3729
3730Theorem INDEP :
3731  !p a b. a IN events p /\ b IN events p /\
3732          prob p (a INTER b) = prob p a * prob p b ==> indep p a b
3733Proof
3734  rw [indep_def]
3735QED
3736
3737Theorem INDEP_EMPTY :
3738    !p s. prob_space p /\ s IN events p ==> indep p {} s
3739Proof
3740    RW_TAC std_ss [indep_def, EVENTS_EMPTY, PROB_EMPTY, INTER_EMPTY, mul_lzero]
3741QED
3742
3743(* `prob_space p` is not needed here *)
3744Theorem INDEP_SYM:   !p a b. indep p a b ==> indep p b a
3745Proof
3746    RW_TAC std_ss [indep_def]
3747 >> PROVE_TAC [mul_comm, INTER_COMM]
3748QED
3749
3750Theorem INDEP_SYM_EQ:   !p a b. indep p a b <=> indep p b a
3751Proof
3752    rpt GEN_TAC >> EQ_TAC >> rpt STRIP_TAC
3753 >> MATCH_MP_TAC INDEP_SYM >> art []
3754QED
3755
3756Theorem INDEP_SPACE :
3757    !p s. prob_space p /\ s IN events p ==> indep p (p_space p) s
3758Proof
3759    RW_TAC std_ss [indep_def, EVENTS_SPACE, PROB_UNIV, INTER_PSPACE, mul_lone]
3760QED
3761
3762Theorem INDEP_SPACE' :
3763    !p s. prob_space p /\ s IN events p ==> indep p s (p_space p)
3764Proof
3765    rw [Once INDEP_SYM_EQ, INDEP_SPACE]
3766QED
3767
3768Theorem INDEP_EMPTY' :
3769    !p s. prob_space p /\ s IN events p ==> indep p s {}
3770Proof
3771    RW_TAC std_ss [Once INDEP_SYM_EQ]
3772 >> MATCH_MP_TAC INDEP_EMPTY >> art []
3773QED
3774
3775Theorem INDEP_FAMILIES_SYM:   !p q r. indep_families p q r ==> indep_families p r q
3776Proof
3777    RW_TAC std_ss [indep_families_def]
3778 >> MATCH_MP_TAC INDEP_SYM
3779 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
3780QED
3781
3782(* This is the simplest "0-1 law" *)
3783Theorem INDEP_REFL:
3784    !p a. prob_space p /\ a IN events p ==>
3785         (indep p a a = (prob p a = 0) \/ (prob p a = 1))
3786Proof
3787    RW_TAC std_ss [indep_def, INTER_IDEMPOT]
3788 >> `?r. prob p a = Normal r` by METIS_TAC [PROB_FINITE, extreal_cases]
3789 >> RW_TAC std_ss [extreal_mul_def, extreal_of_num_def, extreal_11]
3790 >> METIS_TAC [REAL_MUL_IDEMPOT]
3791QED
3792
3793Theorem INDEP_COMPL :
3794    !p s t. prob_space p /\ indep p s t ==> indep p s (p_space p DIFF t)
3795Proof
3796    RW_TAC std_ss [indep_def, EVENTS_COMPL, PROB_COMPL]
3797 >> `s SUBSET (p_space p) /\ t SUBSET (p_space p)`
3798       by PROVE_TAC [PROB_SPACE_SUBSET_PSPACE]
3799 >> `s INTER (p_space p DIFF t) = s DIFF (s INTER t)` by ASM_SET_TAC []
3800 >> POP_ORW
3801 >> `(s INTER t) SUBSET s` by PROVE_TAC [INTER_SUBSET]
3802 >> `s INTER t IN events p` by PROVE_TAC [EVENTS_INTER]
3803 >> Know `prob p (s DIFF (s INTER t)) = prob p s - prob p (s INTER t)`
3804 >- (MATCH_MP_TAC PROB_DIFF_SUBSET >> art [])
3805 >> Rewr' >> art []
3806 >> Know `prob p s * (1 - prob p t) = prob p s * 1 - prob p s * prob p t`
3807 >- (MATCH_MP_TAC sub_ldistrib \\
3808     REWRITE_TAC [extreal_of_num_def, extreal_not_infty] \\
3809     PROVE_TAC [PROB_FINITE])
3810 >> Rewr' >> REWRITE_TAC [mul_rone]
3811QED
3812
3813Theorem INDEP_COMPL' :
3814    !p s t. prob_space p /\ indep p s t ==> indep p (p_space p DIFF s) t
3815Proof
3816    rpt STRIP_TAC
3817 >> MATCH_MP_TAC INDEP_SYM
3818 >> MATCH_MP_TAC INDEP_COMPL >> art []
3819 >> MATCH_MP_TAC INDEP_SYM >> art []
3820QED
3821
3822Theorem INDEP_COMPL2 :
3823    !p s t. prob_space p /\ indep p s t ==>
3824            indep p (p_space p DIFF s) (p_space p DIFF t)
3825Proof
3826    rpt STRIP_TAC
3827 >> MATCH_MP_TAC INDEP_COMPL >> art []
3828 >> Suff `indep p t (p_space p DIFF s)`
3829 >- (DISCH_TAC >> MATCH_MP_TAC INDEP_SYM >> art [])
3830 >> MATCH_MP_TAC INDEP_COMPL >> art []
3831 >> MATCH_MP_TAC INDEP_SYM >> art []
3832QED
3833
3834Theorem INDEP_DISJOINT_UNION :
3835    !p A B C. prob_space p /\ indep p A B /\ indep p A C /\ DISJOINT B C ==>
3836              indep p A (B UNION C)
3837Proof
3838    rw [indep_def, UNION_OVER_INTER]
3839 >- (MATCH_MP_TAC EVENTS_UNION >> art [])
3840 >> Know ‘prob p (B UNION C) = prob p B + prob p C’
3841 >- (MATCH_MP_TAC PROB_ADDITIVE >> art [])
3842 >> Rewr'
3843 >> Know ‘prob p (A INTER B UNION A INTER C) =
3844          prob p (A INTER B) + prob p (A INTER C)’
3845 >- (MATCH_MP_TAC PROB_ADDITIVE >> rw [EVENTS_INTER] \\
3846     MATCH_MP_TAC DISJOINT_RESTRICT_R >> art [])
3847 >> Rewr'
3848 >> simp [Once EQ_SYM_EQ]
3849 >> MATCH_MP_TAC add_ldistrib
3850 >> simp [PROB_POSITIVE]
3851QED
3852
3853Theorem INDEP_DISJOINT_UNION' :
3854    !p A B C. prob_space p /\ indep p A C /\ indep p B C /\ DISJOINT A B ==>
3855              indep p (A UNION B) C
3856Proof
3857    rpt STRIP_TAC
3858 >> MATCH_MP_TAC INDEP_SYM
3859 >> MATCH_MP_TAC INDEP_DISJOINT_UNION >> art []
3860 >> CONJ_TAC >> rw [Once INDEP_SYM_EQ]
3861QED
3862
3863Theorem INDEP_COUNTABLE_DUNION :
3864    !p A E. prob_space p /\ E IN events p /\ disjoint_family A /\
3865           (!i. indep p E (A i)) ==> indep p E (BIGUNION (IMAGE A univ(:num)))
3866Proof
3867    rpt GEN_TAC >> simp [indep_def]
3868 >> STRIP_TAC
3869 >> STRONG_CONJ_TAC
3870 >- (MATCH_MP_TAC EVENTS_BIGUNION_ENUM >> rw [IN_FUNSET])
3871 >> DISCH_TAC
3872 >> REWRITE_TAC [BIGUNION_OVER_INTER_R]
3873 >> Know ‘prob p (BIGUNION (IMAGE A univ(:num))) = suminf (prob p o A)’
3874 >- (MATCH_MP_TAC PROB_COUNTABLY_ADDITIVE >> rw [IN_FUNSET] \\
3875     fs [disjoint_family_def])
3876 >> Rewr'
3877 >> qabbrev_tac ‘A' = \i. E INTER A i’
3878 >> Know ‘disjoint_family A'’
3879 >- (rw [disjoint_family_def, Abbr ‘A'’] \\
3880     MATCH_MP_TAC DISJOINT_RESTRICT_R \\
3881     fs [disjoint_family_def])
3882 >> DISCH_TAC
3883 >> ‘!i. A' i IN events p’ by rw [Abbr ‘A'’, EVENTS_INTER]
3884 >> Know ‘BIGUNION (IMAGE A' UNIV) IN events p’
3885 >- (MATCH_MP_TAC EVENTS_BIGUNION_ENUM >> rw [IN_FUNSET])
3886 >> DISCH_TAC
3887 >> Know ‘prob p (BIGUNION (IMAGE A' univ(:num))) = suminf (prob p o A')’
3888 >- (MATCH_MP_TAC PROB_COUNTABLY_ADDITIVE >> rw [IN_FUNSET] \\
3889     fs [disjoint_family_def])
3890 >> Rewr'
3891 >> rw [Abbr ‘A'’, o_DEF]
3892 >> HO_MATCH_MP_TAC ext_suminf_cmul >> rw [PROB_POSITIVE]
3893QED
3894
3895Theorem INDEP_COUNTABLE_DUNION' :
3896    !p A E. prob_space p /\ E IN events p /\ disjoint_family A /\
3897           (!i. indep p (A i) E) ==> indep p (BIGUNION (IMAGE A univ(:num))) E
3898Proof
3899    rpt STRIP_TAC
3900 >> MATCH_MP_TAC INDEP_SYM
3901 >> MATCH_MP_TAC INDEP_COUNTABLE_DUNION
3902 >> rw [Once INDEP_SYM_EQ]
3903QED
3904
3905(* total ==> pairwise independence (of events) *)
3906Theorem total_imp_pairwise_indep_events :
3907    !p E (J :'index set).
3908           (!n. n IN J ==> (E n) IN events p) /\ indep_events p E J ==>
3909            pairwise_indep_events p E J
3910Proof
3911    RW_TAC std_ss [indep_events_def, pairwise_indep_events_def, indep_def]
3912 >> Q.PAT_X_ASSUM `!N. N SUBSET J /\ N <> {} /\ FINITE N ==> X`
3913      (MP_TAC o (Q.SPEC `{i; j}`))
3914 >> Know `{i; j} SUBSET J` >- ASM_SET_TAC []
3915 >> Know `{i; j} <> {}` >- SET_TAC []
3916 >> Know `FINITE {i; j}` >- PROVE_TAC [FINITE_INSERT, FINITE_SING]
3917 >> Know `BIGINTER (IMAGE E {i; j}) = E i INTER E j`
3918 >- (rw [Once EXTENSION, IN_BIGINTER_IMAGE] \\
3919     METIS_TAC [])
3920 >> RW_TAC std_ss []
3921 >> `!i. prob p (E i) = (prob p o E) i` by PROVE_TAC [o_DEF] >> POP_ORW
3922 >> MATCH_MP_TAC EXTREAL_PROD_IMAGE_PAIR >> art []
3923QED
3924
3925(* total ==> pairwise independence (of sets of events) *)
3926Theorem total_imp_pairwise_indep_sets :
3927    !p A (J :'index set).
3928      (!n. n IN J ==> (A n) SUBSET events p) /\ indep_sets p A J ==>
3929       pairwise_indep_sets p A J
3930Proof
3931    RW_TAC std_ss [indep_sets_def, pairwise_indep_sets_def, indep_families_def,
3932                   indep_def, IN_DFUNSET]
3933 >- PROVE_TAC [SUBSET_DEF]
3934 >- PROVE_TAC [SUBSET_DEF]
3935 >> Q.PAT_X_ASSUM `!N. N SUBSET J /\ N <> {} /\ FINITE N ==> X`
3936      (MP_TAC o (Q.SPEC `{i; j}`))
3937 >> Know `{i; j} SUBSET J` >- ASM_SET_TAC []
3938 >> Know `{i; j} <> {}` >- SET_TAC []
3939 >> Know `FINITE {i; j}` >- PROVE_TAC [FINITE_INSERT, FINITE_SING]
3940 >> Know `!E. BIGINTER (IMAGE E {i; j}) = E i INTER E j`
3941 >- (rw [Once EXTENSION, IN_BIGINTER_IMAGE] \\
3942     METIS_TAC [])
3943 >> Know `!E. PI (prob p o E) {i; j} = prob p (E i) * prob p (E j)`
3944 >- (GEN_TAC \\
3945     `!i. prob p (E i) = (prob p o E) i` by PROVE_TAC [o_DEF] >> POP_ORW \\
3946     MATCH_MP_TAC EXTREAL_PROD_IMAGE_PAIR >> art [])
3947 >> RW_TAC std_ss []
3948 >> fs [IN_INSERT, IN_SING]
3949 >> Q.ABBREV_TAC `E = \x. if x = i then s else if x = j then t else {}`
3950 >> Q.PAT_X_ASSUM `!E. X ==> Y` (MP_TAC o (Q.SPEC `E`))
3951 >> Know `!x. (x = i) \/ (x = j) ==> E x IN A x`
3952 >- (Q.UNABBREV_TAC `E` >> RW_TAC std_ss [])
3953 >> Know `E i = s` >- (Q.UNABBREV_TAC `E` >> RW_TAC std_ss [])
3954 >> Know `E j = t` >- (Q.UNABBREV_TAC `E` >> RW_TAC std_ss [])
3955 >> RW_TAC std_ss []
3956 >> POP_ASSUM MATCH_MP_TAC >> art []
3957QED
3958
3959(* total ==> pairwise independence (of random variables)
3960
3961   NOTE: added ‘prob_space p /\ !i. i IN J ==> sigma_algebra (A i)’ due to
3962         changes of ‘measurable’
3963 *)
3964Theorem total_imp_pairwise_indep_vars :
3965    !p X A (J :'index set). prob_space p /\
3966        (!i. i IN J ==> random_variable (X i) p (A i)) /\
3967        (!i. i IN J ==> sigma_algebra (A i)) /\
3968        indep_vars p X A J ==> pairwise_indep_vars p X A J
3969Proof
3970    RW_TAC std_ss [indep_vars_def, pairwise_indep_vars_def, indep_rv_def,
3971                   indep_events_def, random_variable_def]
3972 >> ‘sigma_algebra (measurable_space p)’
3973      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
3974 >> REWRITE_TAC [indep_def]
3975 >> STRONG_CONJ_TAC
3976 >- (‘X i IN measurable (p_space p,events p) (A i)’ by PROVE_TAC [] \\
3977     POP_ASSUM (STRIP_ASSUME_TAC o (REWRITE_RULE [IN_MEASURABLE, space_def, subsets_def])) \\
3978     POP_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
3979 >> STRONG_CONJ_TAC
3980 >- (‘X j IN measurable (p_space p,events p) (A j)’ by PROVE_TAC [] \\
3981     POP_ASSUM (STRIP_ASSUME_TAC o (REWRITE_RULE [IN_MEASURABLE, space_def, subsets_def])) \\
3982     POP_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
3983 >> Q.ABBREV_TAC ‘E = \x. if x = i then a else if x = j then b else {}’
3984 >> Q.PAT_X_ASSUM ‘!E N. _’ (MP_TAC o (Q.SPEC ‘E’))
3985 >> SIMP_TAC std_ss [IN_DFUNSET, o_DEF]
3986 >> ‘{i; j} SUBSET J’ by rw [SUBSET_DEF]
3987 >> DISCH_THEN (MP_TAC o Q.SPEC ‘{i; j}’) >> simp [FINITE_TWO]
3988 >> Know ‘PI (\n. prob p (PREIMAGE (X n) (E n) INTER p_space p)) {i; j} =
3989             (\n. prob p (PREIMAGE (X n) (E n) INTER p_space p)) i *
3990             (\n. prob p (PREIMAGE (X n) (E n) INTER p_space p)) j’
3991 >- (MATCH_MP_TAC EXTREAL_PROD_IMAGE_PAIR >> art [])
3992 >> BETA_TAC >> Rewr'
3993 >> Know ‘E i = a’ >- RW_TAC std_ss [Abbr ‘E’] >> Rewr'
3994 >> Know ‘E j = b’ >- RW_TAC std_ss [Abbr ‘E’] >> Rewr'
3995 >> DISCH_THEN MATCH_MP_TAC
3996 >> rw [Abbr ‘E’]
3997QED
3998
3999(* alternative definition of ‘indep_rv’ in ‘indep_vars’ *)
4000Theorem indep_rv_alt_indep_vars :
4001    !p X Y A B. random_variable (X :'a -> 'b) p A /\
4002                random_variable (Y :'a -> 'b) p B ==>
4003               (indep_rv p X Y A B <=> indep_vars p (binary X Y) (binary A B) {0; 1})
4004Proof
4005    rw [indep_vars_def, indep_rv_def, indep_events_def]
4006 >> reverse EQ_TAC >> rw []
4007 >- (Q.PAT_X_ASSUM ‘!E N. P’ (MP_TAC o (Q.SPECL [‘binary a b’, ‘{0;1}’])) \\
4008     Know ‘binary a b IN {0; 1} --> subsets o binary A B’
4009     >- (rw [IN_DFUNSET, binary_def] >> simp []) >> Rewr \\
4010     simp [binary_def] \\
4011    ‘{1} DELETE (0 :num) = {1}’ by rw [GSYM DELETE_NON_ELEMENT] \\
4012     rw [EXTREAL_PROD_IMAGE_THM, FINITE_TWO, indep_def] \\
4013     fs [random_variable_def, IN_MEASURABLE])
4014 >> ‘N = {0} \/ N = {1} \/ N = {0; 1}’ by METIS_TAC [SUBSET_TWO]
4015 >- rw [EXTREAL_PROD_IMAGE_SING]
4016 >- rw [EXTREAL_PROD_IMAGE_SING]
4017 >> POP_ASSUM (fs o wrap)
4018 >> ‘{1} DELETE (0 :num) = {1}’ by rw [GSYM DELETE_NON_ELEMENT]
4019 >> rw [EXTREAL_PROD_IMAGE_THM, FINITE_TWO, binary_def]
4020 >> fs [IN_DFUNSET]
4021 >> ‘E 0 IN subsets A’ by METIS_TAC [binary_def]
4022 >> Know ‘E 1 IN subsets B’
4023 >- (Q.PAT_X_ASSUM ‘!x. x = 0 \/ x = 1 ==> P’ (MP_TAC o (Q.SPEC ‘1’)) \\
4024     rw [binary_def])
4025 >> DISCH_TAC
4026 >> Q.PAT_X_ASSUM ‘!a b. P’ (MP_TAC o (Q.SPECL [‘E (0 :num)’, ‘E (1 :num)’]))
4027 >> rw [indep_def]
4028QED
4029
4030(******************************************************************************)
4031(*  Kolmogorov's 0-1 Law (for independent events)                             *)
4032(******************************************************************************)
4033
4034(* Probability version of SIGMA_SUBSET_MEASURABLE_SETS *)
4035Theorem SIGMA_SUBSET_EVENTS[local] :
4036    !a p. prob_space p /\ a SUBSET events p ==>
4037          subsets (sigma (p_space p) a) SUBSET events p
4038Proof
4039    RW_TAC std_ss [prob_space_def, p_space_def, events_def]
4040 >> MATCH_MP_TAC SIGMA_SUBSET_MEASURABLE_SETS >> art []
4041QED
4042
4043(* Lemma 3.5.2 [3, p.37], with simplifications from the Solution Manual of [9]
4044   (Problem 5.11)
4045 *)
4046Theorem INDEP_FAMILIES_SIGMA_lemma[local] :
4047    !p B n (J :'index set).
4048              prob_space p /\ (IMAGE B (n INSERT J)) SUBSET events p /\
4049              indep_events p B (n INSERT J) /\ n NOTIN J
4050          ==> indep_families p {B n} (subsets (sigma (p_space p) (IMAGE B J)))
4051Proof
4052    RW_TAC std_ss [indep_families_def, IN_SING]
4053 >> REWRITE_TAC [indep_def]
4054 >> Know `B n IN events p /\ (IMAGE B J) SUBSET events p`
4055 >- fs [SUBSET_DEF, IN_IMAGE, IN_INSERT] >> STRIP_TAC >> art []
4056 >> STRONG_CONJ_TAC
4057 >- (Suff `subsets (sigma (p_space p) (IMAGE B J)) SUBSET events p`
4058     >- (DISCH_TAC >> PROVE_TAC [SUBSET_DEF]) \\
4059     MATCH_MP_TAC SIGMA_SUBSET_EVENTS >> art []) >> DISCH_TAC
4060 >> Q.ABBREV_TAC `G = (p_space p) INSERT
4061                      {BIGINTER (IMAGE B N) | N SUBSET J /\ FINITE N /\ N <> {}}`
4062 >> Q.ABBREV_TAC `u = \x. prob p (B n INTER x)`
4063 >> Q.ABBREV_TAC `v = \x. prob p (B n) * prob p x`
4064 >> Suff `u t = v t` >- METIS_TAC []
4065 >> irule UNIQUENESS_OF_MEASURE_FINITE
4066 >> qexistsl_tac [`p_space p`, `G`]
4067 (* !s t. s IN G /\ t IN G ==> s INTER t IN G *)
4068 >> CONJ_TAC
4069 >- (Q.UNABBREV_TAC `G` >> RW_TAC std_ss [GSPECIFICATION, IN_INSERT] >| (* 4 subgoals *)
4070     [ (* goal 1 (of 4) *)
4071       DISJ1_TAC >> REWRITE_TAC [INTER_IDEMPOT],
4072       (* goal 2 (of 4) *)
4073       DISJ2_TAC >> Q.EXISTS_TAC `N` >> art [] \\
4074       Suff `BIGINTER (IMAGE B N) SUBSET p_space p` >- PROVE_TAC [INTER_SUBSET_EQN] \\
4075       MATCH_MP_TAC BIGINTER_SUBSET \\
4076       RW_TAC std_ss [IN_IMAGE, PULL_EXISTS] \\
4077      `!i. i IN J ==> B i IN events p` by PROVE_TAC [SUBSET_DEF, IN_INSERT, IN_IMAGE] \\
4078       drule_then (qx_choose_then ‘x’ strip_assume_tac)
4079                  (iffRL MEMBER_NOT_EMPTY) >>
4080      `B x IN events p` by PROVE_TAC [SUBSET_DEF] \\
4081       irule_at Any PROB_SPACE_SUBSET_PSPACE >> art[] >>
4082       first_assum (irule_at Any) >> art[],
4083       (* goal 3 (of 4) *)
4084       DISJ2_TAC >> Q.EXISTS_TAC `N` >> art [] \\
4085       Suff `BIGINTER (IMAGE B N) SUBSET p_space p`
4086       >- PROVE_TAC [INTER_SUBSET_EQN] \\
4087       MATCH_MP_TAC BIGINTER_SUBSET \\
4088       RW_TAC std_ss [IN_IMAGE, PULL_EXISTS] \\
4089      `!i. i IN J ==> B i IN events p` by PROVE_TAC [SUBSET_DEF, IN_INSERT, IN_IMAGE] \\
4090       drule_then (qx_choose_then ‘x’ strip_assume_tac)
4091                  (iffRL MEMBER_NOT_EMPTY) >>
4092      `B x IN events p` by PROVE_TAC [SUBSET_DEF] \\
4093       irule_at Any PROB_SPACE_SUBSET_PSPACE >> art[] >>
4094       first_assum (irule_at Any) >> art[],
4095       (* goal 4 (of 4) *)
4096       DISJ2_TAC >> Q.EXISTS_TAC `N UNION N'` \\
4097       CONJ_TAC >- REWRITE_TAC [BIGINTER_UNION, IMAGE_UNION] \\
4098       art [FINITE_UNION] \\
4099       CONJ_TAC >- (RW_TAC std_ss [IN_UNION, SUBSET_DEF] >> fs [SUBSET_DEF]) \\
4100       RW_TAC std_ss [Once EXTENSION, IN_UNION, NOT_IN_EMPTY] \\
4101       fs [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `x` >> DISJ1_TAC >> art [] ])
4102 (* !s. s IN G ==> (u s = v s) *)
4103 >> CONJ_TAC
4104 >- (Q.UNABBREV_TAC `G` >> RW_TAC std_ss [GSPECIFICATION, IN_INSERT] (* 2 subgoals *)
4105     >- (Q.UNABBREV_TAC `u` >> Q.UNABBREV_TAC `v` >> BETA_TAC \\
4106         RW_TAC std_ss [PROB_UNIV, mul_rone, PROB_UNDER_UNIV]) \\
4107     Q.UNABBREV_TAC `u` >> Q.UNABBREV_TAC `v` >> BETA_TAC \\
4108     Know `B n INTER BIGINTER (IMAGE B N) = BIGINTER (IMAGE B (n INSERT N))`
4109     >- REWRITE_TAC [IMAGE_INSERT, BIGINTER_INSERT] >> Rewr' \\
4110     FULL_SIMP_TAC bool_ss [indep_events_def] \\
4111    `(n INSERT N) SUBSET (n INSERT J) /\ N SUBSET (n INSERT J)` by ASM_SET_TAC [] \\
4112    `FINITE (n INSERT N)` by PROVE_TAC [FINITE_INSERT] \\
4113     Know `prob p (BIGINTER (IMAGE B (n INSERT N))) = PI (prob p o B) (n INSERT N)`
4114     >- (FIRST_X_ASSUM MATCH_MP_TAC >> art [] \\
4115         RW_TAC std_ss [Once EXTENSION, IN_INSERT, NOT_IN_EMPTY] \\
4116         Q.EXISTS_TAC `n` >> DISJ1_TAC >> REWRITE_TAC []) >> Rewr' \\
4117     Know `prob p (BIGINTER (IMAGE B N)) = PI (prob p o B) N`
4118     >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr' \\
4119     Know `PI (prob p o B) (n INSERT N) = (prob p o B) n * PI (prob p o B) (N DELETE n)`
4120     >- (MATCH_MP_TAC EXTREAL_PROD_IMAGE_PROPERTY >> art []) >> Rewr' \\
4121    `N DELETE n = N` by ASM_SET_TAC [] >> POP_ORW \\
4122     SIMP_TAC std_ss [o_DEF])
4123 >> Know `subsets (sigma (p_space p) G) SUBSET events p`
4124 >- (MATCH_MP_TAC SIGMA_SUBSET_EVENTS >> art [] \\
4125     Q.UNABBREV_TAC `G` >> RW_TAC std_ss [GSPECIFICATION, IN_INSERT, SUBSET_DEF]
4126     >- (MATCH_MP_TAC EVENTS_SPACE >> art []) \\
4127     MATCH_MP_TAC EVENTS_COUNTABLE_INTER >> art [] \\
4128     CONJ_TAC >- (MATCH_MP_TAC SUBSET_TRANS >> Q.EXISTS_TAC `IMAGE B J` >> art [] \\
4129                  MATCH_MP_TAC IMAGE_SUBSET >> PROVE_TAC [SUBSET_DEF]) \\
4130     CONJ_TAC >- (MATCH_MP_TAC finite_countable \\
4131                  MATCH_MP_TAC IMAGE_FINITE >> art []) \\
4132     RW_TAC std_ss [Once EXTENSION, IN_IMAGE, NOT_IN_EMPTY] \\
4133     fs [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `x` >> art [])
4134 >> DISCH_TAC
4135 >> Know `sigma_algebra (p_space p,subsets (sigma (p_space p) G))`
4136 >- (REWRITE_TAC [SIGMA_REDUCE] \\
4137     MATCH_MP_TAC SIGMA_ALGEBRA_SIGMA \\
4138     Q.UNABBREV_TAC `G` >> RW_TAC std_ss [subset_class_def, GSPECIFICATION, IN_INSERT]
4139     >- REWRITE_TAC [SUBSET_REFL] \\
4140     MATCH_MP_TAC PROB_SPACE_SUBSET_PSPACE >> art [] \\
4141     MATCH_MP_TAC EVENTS_COUNTABLE_INTER >> art [] \\
4142     CONJ_TAC >- (MATCH_MP_TAC SUBSET_TRANS >> Q.EXISTS_TAC `IMAGE B J` >> art [] \\
4143                  MATCH_MP_TAC IMAGE_SUBSET >> PROVE_TAC [SUBSET_DEF]) \\
4144     CONJ_TAC >- (MATCH_MP_TAC finite_countable \\
4145                  MATCH_MP_TAC IMAGE_FINITE >> art []) \\
4146     RW_TAC std_ss [Once EXTENSION, IN_IMAGE, NOT_IN_EMPTY] \\
4147     fs [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `x` >> art [])
4148 >> DISCH_TAC
4149 (* measure_space (p_space p,subsets (sigma (p_space p) G),u) *)
4150 >> CONJ_TAC
4151 >- (Suff `measure_space (p_space p,events p,u)`
4152     >- (DISCH_TAC >> MATCH_MP_TAC MEASURE_SPACE_RESTRICTION \\
4153         Q.EXISTS_TAC `events p` >> art []) \\
4154     Q.UNABBREV_TAC `u` \\
4155     fs [p_space_def, events_def, prob_def, prob_space_def] \\
4156     MATCH_MP_TAC MEASURE_SPACE_RESTRICTED_MEASURE >> art [])
4157 (* measure_space (p_space p,subsets (sigma (p_space p) G),v) *)
4158 >> CONJ_TAC
4159 >- (Suff `measure_space (p_space p,events p,v)`
4160     >- (DISCH_TAC >> MATCH_MP_TAC MEASURE_SPACE_RESTRICTION \\
4161         Q.EXISTS_TAC `events p` >> art []) \\
4162     Q.UNABBREV_TAC `v` \\
4163    `prob p (B n) <> NegInf /\ prob p (B n) <> PosInf` by PROVE_TAC [PROB_FINITE] \\
4164    `0 <= prob p (B n)` by PROVE_TAC [PROB_POSITIVE] \\
4165    `?c. prob p (B n) = Normal c` by PROVE_TAC [extreal_cases] \\
4166    `0 <= c` by PROVE_TAC [extreal_of_num_def, extreal_le_eq] \\
4167     fs [p_space_def, events_def, prob_def, prob_space_def] \\
4168     MATCH_MP_TAC MEASURE_SPACE_CMUL >> art [])
4169 (* u (p_space p) = v (p_space p) *)
4170 >> CONJ_TAC
4171 >- (Q.UNABBREV_TAC `u` >> Q.UNABBREV_TAC `v` >> BETA_TAC \\
4172     RW_TAC std_ss [PROB_UNIV, mul_rone, PROB_UNDER_UNIV])
4173 (* t IN subsets (sigma (p_space p) G) *)
4174 >> CONJ_TAC
4175 >- (Suff `subsets (sigma (p_space p) (IMAGE B J)) SUBSET subsets (sigma (p_space p) G)`
4176     >- (DISCH_THEN (ASSUME_TAC o (REWRITE_RULE [SUBSET_DEF])) \\
4177         POP_ASSUM MATCH_MP_TAC >> art []) \\
4178     MATCH_MP_TAC SIGMA_MONOTONE \\
4179     Q.UNABBREV_TAC `G` \\
4180     RW_TAC std_ss [Once SUBSET_DEF, IN_IMAGE, GSPECIFICATION, IN_INSERT] \\
4181     DISJ2_TAC \\
4182     rename1 ‘x IN J’ >> Q.EXISTS_TAC `{x}` \\
4183     RW_TAC std_ss [IMAGE_SING, BIGINTER_SING, FINITE_SING, SUBSET_DEF, IN_SING] \\
4184     RW_TAC std_ss [Once EXTENSION, NOT_IN_EMPTY, IN_SING])
4185 (* u (p_space p) < PosInf *)
4186 >> CONJ_TAC
4187 >- (Q.UNABBREV_TAC `u` >> BETA_TAC \\
4188     RW_TAC std_ss [PROB_UNDER_UNIV, PROB_LT_POSINF])
4189 (* subset_class (p_space p) G *)
4190 >> Q.UNABBREV_TAC `G`
4191 >> RW_TAC std_ss [subset_class_def, IN_INSERT, GSPECIFICATION]
4192 >- REWRITE_TAC [SUBSET_REFL]
4193 >> MATCH_MP_TAC PROB_SPACE_SUBSET_PSPACE >> art []
4194 >> MATCH_MP_TAC EVENTS_COUNTABLE_INTER >> art []
4195 >> CONJ_TAC >- (MATCH_MP_TAC SUBSET_TRANS >> Q.EXISTS_TAC `IMAGE B J` >> art [] \\
4196                 MATCH_MP_TAC IMAGE_SUBSET >> PROVE_TAC [SUBSET_DEF])
4197 >> CONJ_TAC >- (MATCH_MP_TAC finite_countable \\
4198                 MATCH_MP_TAC IMAGE_FINITE >> art [])
4199 >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE, NOT_IN_EMPTY]
4200 >> fs [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `x` >> art []
4201QED
4202
4203(* Lemma 3.5.2 [3, p.37], more useful form *)
4204Theorem INDEP_FAMILIES_SIGMA_lemma1[local] :
4205    !p A m (N :'index set) S2.
4206         prob_space p /\ IMAGE A (m INSERT N) SUBSET events p /\
4207         indep_events p A (m INSERT N) /\ m NOTIN N /\
4208         S2 IN subsets (sigma (p_space p) (IMAGE A N)) ==> indep p (A m) S2
4209Proof
4210    rpt STRIP_TAC
4211 >> irule (SIMP_RULE std_ss [indep_families_def, IN_SING]
4212                            (Q.SPEC `p` INDEP_FAMILIES_SIGMA_lemma)) >> art []
4213 >> Q.EXISTS_TAC `N` >> art []
4214QED
4215
4216(* Corollary 3.5.3 of [3, p.37], Part I *)
4217Theorem INDEP_FAMILIES_SIGMA_lemma2[local] :
4218    !p A (M :'index set) N m S1.
4219       prob_space p /\ (IMAGE A (M UNION N)) SUBSET events p /\
4220       indep_events p A (M UNION N) /\ DISJOINT M N /\ m IN M /\ N <> {} /\
4221       S1 IN (subsets (sigma (p_space p) (IMAGE A M))) ==>
4222       indep_events p (\x. if x IN N then A x else S1) (m INSERT N)
4223Proof
4224    rpt STRIP_TAC
4225 >> Q.ABBREV_TAC `G = {BIGINTER (IMAGE A J) | J SUBSET N /\ FINITE J /\ J <> {}}`
4226 >> fs [GSYM MEMBER_NOT_EMPTY]
4227 >> rename1 `n IN N`
4228 >> Q.ABBREV_TAC `B = \a x. if x IN M then A x else a`
4229 >> Know `!a. a IN G ==> indep_events p (B a) (n INSERT M)`
4230 >- (Q.UNABBREV_TAC `B` >> BETA_TAC \\
4231     Q.UNABBREV_TAC `G` \\
4232     RW_TAC std_ss [GSPECIFICATION, indep_events_def, IN_INSERT] \\
4233     Cases_on `n NOTIN N'` (* easy case *)
4234     >- (`N' SUBSET M` by PROVE_TAC [SUBSET_INSERT] \\
4235         Know `IMAGE (\x. if x IN M then A x else BIGINTER (IMAGE A J)) N' = IMAGE A N'`
4236         >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4237             EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4238             [ (* goal 3.1 (of 2) *)
4239              `x'' IN M` by PROVE_TAC [SUBSET_DEF] >> fs [] \\
4240               Q.EXISTS_TAC `x''` >> art [],
4241               (* goal 3.2 (of 2) *)
4242              `x'' IN M` by PROVE_TAC [SUBSET_DEF] \\
4243               Q.EXISTS_TAC `x''` >> ASM_SIMP_TAC std_ss [] ]) >> Rewr' \\
4244         Know `PI (prob p o (\x. if x IN M then A x else BIGINTER (IMAGE A J))) N' =
4245               PI (prob p o A) N'`
4246         >- (irule EXTREAL_PROD_IMAGE_EQ >> RW_TAC std_ss [] \\
4247             `x' IN M` by PROVE_TAC [SUBSET_DEF]) >> Rewr' \\
4248         fs [indep_events_def] >> FIRST_X_ASSUM MATCH_MP_TAC >> art [] \\
4249         ASM_SET_TAC []) \\
4250     fs [] (* hard case: `n IN N'` *) \\
4251     Q.ABBREV_TAC `N'' = N' DELETE n` \\
4252    `N'' SUBSET M` by ASM_SET_TAC [] \\
4253    `N'' DELETE n = N''` by ASM_SET_TAC [] \\
4254    `N' = n INSERT N''` by ASM_SET_TAC [] >> POP_ORW \\
4255    `n NOTIN N''` by ASM_SET_TAC [] \\
4256    `n NOTIN M` by ASM_SET_TAC [DISJOINT_DEF] \\
4257     ASM_SIMP_TAC std_ss [IMAGE_INSERT] \\
4258     Know `IMAGE (\x. if x IN M then A x else BIGINTER (IMAGE A J)) N'' = IMAGE A N''`
4259     >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4260         EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4261         [ (* goal 3.1 (of 2) *)
4262          `x'' IN M` by PROVE_TAC [SUBSET_DEF] >> fs [] \\
4263           Q.EXISTS_TAC `x''` >> art [],
4264           (* goal 3.2 (of 2) *)
4265          `x'' IN M` by PROVE_TAC [SUBSET_DEF] \\
4266           Q.EXISTS_TAC `x''` >> ASM_SIMP_TAC std_ss [] ]) >> Rewr' \\
4267     REWRITE_TAC [BIGINTER_INSERT, GSYM BIGINTER_UNION, GSYM IMAGE_UNION] \\
4268    `N'' SUBSET N'` by ASM_SET_TAC [] \\
4269    `FINITE N''` by PROVE_TAC [SUBSET_FINITE_I] \\
4270     POP_ASSUM ((ASM_SIMP_TAC std_ss) o wrap o (MATCH_MP EXTREAL_PROD_IMAGE_PROPERTY)) \\
4271     Know `PI (prob p o (\x. if x IN M then A x else BIGINTER (IMAGE A J))) N'' =
4272           PI (prob p o A) N''`
4273     >- (irule EXTREAL_PROD_IMAGE_EQ \\
4274         RW_TAC std_ss [] >- (`x' IN M` by PROVE_TAC [SUBSET_DEF]) \\
4275         PROVE_TAC [SUBSET_FINITE_I]) >> Rewr' \\
4276     FULL_SIMP_TAC std_ss [indep_events_def] \\
4277     Know `prob p (BIGINTER (IMAGE A (J UNION N''))) = PI (prob p o A) (J UNION N'')`
4278     >- (FIRST_X_ASSUM MATCH_MP_TAC >> art [FINITE_UNION] \\
4279         CONJ_TAC >- ASM_SET_TAC [] \\
4280         CONJ_TAC >- ASM_SET_TAC [] \\
4281         PROVE_TAC [SUBSET_FINITE_I]) >> Rewr' \\
4282     Know `prob p (BIGINTER (IMAGE A J)) = PI (prob p o A) J`
4283     >- (FIRST_X_ASSUM MATCH_MP_TAC >> art [] \\
4284         CONJ_TAC >- ASM_SET_TAC [] \\
4285         METIS_TAC [MEMBER_NOT_EMPTY]) >> Rewr' \\
4286     MATCH_MP_TAC EXTREAL_PROD_IMAGE_DISJOINT_UNION >> art [] \\
4287     CONJ_TAC >- PROVE_TAC [SUBSET_FINITE_I] \\
4288     MATCH_MP_TAC SUBSET_DISJOINT \\
4289     qexistsl_tac [`N`, `M`] >> art [DISJOINT_SYM])
4290 >> DISCH_TAC
4291 >> Know `!s a. a IN G /\ s IN subsets (sigma (p_space p) (IMAGE (B a) M)) ==>
4292                indep p (B a n) s`
4293 >- (rpt STRIP_TAC \\
4294     MATCH_MP_TAC INDEP_FAMILIES_SIGMA_lemma1 \\
4295     Q.EXISTS_TAC `M` >> art [] \\
4296     Know `n NOTIN M` >- ASM_SET_TAC [DISJOINT_DEF] >> DISCH_TAC >> art [] \\
4297     reverse CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
4298     RW_TAC std_ss [IMAGE_INSERT, INSERT_SUBSET] >| (* 2 subgoals *)
4299     [ (* goal 1 (of 2) *)
4300       Know `B a n = a` >- (Q.UNABBREV_TAC `B` >> ASM_SIMP_TAC std_ss []) >> Rewr' \\
4301       Q.PAT_X_ASSUM `a IN G` MP_TAC \\
4302       Q.UNABBREV_TAC `G` >> RW_TAC std_ss [GSPECIFICATION] \\
4303       MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [GSYM MEMBER_NOT_EMPTY] \\
4304       CONJ_TAC
4305       >- (MATCH_MP_TAC SUBSET_TRANS >> Q.EXISTS_TAC `IMAGE A N` >> art [] \\
4306           MATCH_MP_TAC IMAGE_SUBSET >> art []) \\
4307       CONJ_TAC >- (MATCH_MP_TAC finite_countable >> art []) \\
4308       Q.EXISTS_TAC `x` >> art [],
4309       (* goal 2 (of 2) *)
4310       Suff `IMAGE (B a) M = IMAGE A M` >- METIS_TAC [] \\
4311       Q.UNABBREV_TAC `B` >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4312       EQ_TAC >> rpt STRIP_TAC >> fs [] >- (Q.EXISTS_TAC `x'` >> art []) \\
4313       Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss [] ])
4314 >> Know `!a. IMAGE (B a) M = IMAGE A M`
4315 >- (GEN_TAC >> Q.UNABBREV_TAC `B` >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4316     EQ_TAC >> rpt STRIP_TAC >> fs [] >- (Q.EXISTS_TAC `x'` >> art []) \\
4317     Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss []) >> Rewr'
4318 >> `n NOTIN M` by ASM_SET_TAC [DISJOINT_DEF]
4319 >> Know `!a. B a n = a`
4320 >- (GEN_TAC >> Q.UNABBREV_TAC `B` >> RW_TAC std_ss [Once EXTENSION]) >> Rewr'
4321 >> DISCH_THEN (MP_TAC o (ONCE_REWRITE_RULE [INDEP_SYM_EQ]) o (Q.SPEC `S1`)) >> art []
4322 >> DISCH_TAC (* !a. a IN G ==> indep p S1 a *)
4323 >> Q.ABBREV_TAC `B' = \x. if x IN N then A x else S1`
4324 >> Know `IMAGE B' N = IMAGE A N`
4325 >- (Q.UNABBREV_TAC `B'` >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4326     EQ_TAC >> rpt STRIP_TAC >> fs [] >- (Q.EXISTS_TAC `x'` >> art []) \\
4327     Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss []) >> DISCH_TAC
4328 >> Q.UNABBREV_TAC `B'` >> BETA_TAC
4329 >> RW_TAC std_ss [indep_events_def, IN_INSERT]
4330 >> Cases_on `m NOTIN N'` (* easy case *)
4331 >- (`N' SUBSET N` by PROVE_TAC [SUBSET_INSERT] \\
4332     Know `IMAGE (\x. if x IN N then A x else S1) N' = IMAGE A N'`
4333     >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4334         EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4335         [ (* goal 3.1 (of 2) *)
4336          `x' IN N` by PROVE_TAC [SUBSET_DEF] >> fs [] \\
4337           Q.EXISTS_TAC `x'` >> art [],
4338           (* goal 3.2 (of 2) *)
4339          `x' IN N` by PROVE_TAC [SUBSET_DEF] \\
4340           Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss [] ]) >> Rewr' \\
4341     Know `PI (prob p o (\x. if x IN N then A x else S1)) N' = PI (prob p o A) N'`
4342     >- (irule EXTREAL_PROD_IMAGE_EQ >> RW_TAC std_ss [] \\
4343        `x IN N` by PROVE_TAC [SUBSET_DEF]) >> Rewr' \\
4344     fs [indep_events_def] >> FIRST_X_ASSUM MATCH_MP_TAC >> art [] \\
4345     ASM_SET_TAC [])
4346 >> fs [] (* hard case: `m IN N'` *)
4347 >> Q.ABBREV_TAC `N'' = N' DELETE m`
4348 >> `N'' SUBSET N` by ASM_SET_TAC []
4349 >> `N'' DELETE m = N''` by ASM_SET_TAC []
4350 >> `N' = m INSERT N''` by ASM_SET_TAC [] >> POP_ORW
4351 >> `m NOTIN N''` by ASM_SET_TAC []
4352 >> `m NOTIN N` by ASM_SET_TAC [DISJOINT_DEF]
4353 >> ASM_SIMP_TAC std_ss [IMAGE_INSERT]
4354 >> Know `IMAGE (\x. if x IN N then A x else S1) N'' = IMAGE A N''`
4355 >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4356     EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4357     [ (* goal 3.1 (of 2) *)
4358      `x' IN N` by PROVE_TAC [SUBSET_DEF] >> fs [] \\
4359       Q.EXISTS_TAC `x'` >> art [],
4360       (* goal 3.2 (of 2) *)
4361      `x' IN N` by PROVE_TAC [SUBSET_DEF] \\
4362       Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss [] ]) >> Rewr'
4363 >> REWRITE_TAC [BIGINTER_INSERT, GSYM BIGINTER_UNION, GSYM IMAGE_UNION]
4364 >> `N'' SUBSET N'` by ASM_SET_TAC []
4365 >> `FINITE N''` by PROVE_TAC [SUBSET_FINITE_I]
4366 >> POP_ASSUM ((ASM_SIMP_TAC std_ss) o wrap o (MATCH_MP EXTREAL_PROD_IMAGE_PROPERTY))
4367 >> Know `PI (prob p o (\x. if x IN N then A x else S1)) N'' = PI (prob p o A) N''`
4368 >- (irule EXTREAL_PROD_IMAGE_EQ \\
4369     RW_TAC std_ss [] >- (`x IN N` by PROVE_TAC [SUBSET_DEF]) \\
4370     PROVE_TAC [SUBSET_FINITE_I]) >> Rewr'
4371 >> Cases_on `N'' = {}`
4372 >- art [IMAGE_EMPTY, BIGINTER_EMPTY, INTER_UNIV, EXTREAL_PROD_IMAGE_EMPTY, mul_rone]
4373 >> Know `prob p (S1 INTER BIGINTER (IMAGE A N'')) =
4374          prob p S1 * prob p (BIGINTER (IMAGE A N''))`
4375 >- (FULL_SIMP_TAC std_ss [indep_def] \\
4376    `!a. a IN G ==> a IN events p` by PROVE_TAC [] \\
4377    `!a. a IN G ==> (prob p (S1 INTER a) = prob p S1 * prob p a)` by PROVE_TAC [] \\
4378     POP_ASSUM MATCH_MP_TAC \\
4379     Q.UNABBREV_TAC `G` >> RW_TAC std_ss [GSPECIFICATION] \\
4380     Q.EXISTS_TAC `N''` >> art [] \\
4381     CONJ_TAC >- PROVE_TAC [SUBSET_FINITE_I] \\
4382     fs [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `x'` >> art []) >> Rewr'
4383 >> FULL_SIMP_TAC std_ss [indep_events_def]
4384 >> Know `prob p (BIGINTER (IMAGE A N'')) = PI (prob p o A) N''`
4385 >- (FIRST_X_ASSUM MATCH_MP_TAC >> art [FINITE_UNION] \\
4386     CONJ_TAC >- ASM_SET_TAC [] \\
4387     PROVE_TAC [SUBSET_FINITE_I]) >> Rewr
4388QED
4389
4390(* Corollary 3.5.3 of [3, p.37], Part II (futhermore, ...) *)
4391Theorem INDEP_FAMILIES_SIGMA :
4392    !p A (M :'index set) N.
4393       prob_space p /\ (IMAGE A (M UNION N)) SUBSET events p /\
4394       indep_events p A (M UNION N) /\ DISJOINT M N /\ M <> {} /\ N <> {} ==>
4395       indep_families p (subsets (sigma (p_space p) (IMAGE A M)))
4396                        (subsets (sigma (p_space p) (IMAGE A N)))
4397Proof
4398    RW_TAC std_ss [indep_families_def]
4399 >> rename1 `indep p S1 S2`
4400 >> FULL_SIMP_TAC std_ss [GSYM MEMBER_NOT_EMPTY]
4401 >> rename1 `m IN M` >> rename1 `n IN N`
4402 >> Q.ABBREV_TAC `B' = \x. if x IN N then A x else S1`
4403 >> Know `IMAGE B' N = IMAGE A N`
4404 >- (Q.UNABBREV_TAC `B'` >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE] \\
4405     EQ_TAC >> rpt STRIP_TAC >> fs [] >- (Q.EXISTS_TAC `x'` >> art []) \\
4406     Q.EXISTS_TAC `x'` >> ASM_SIMP_TAC std_ss []) >> DISCH_TAC
4407 >> Know `indep_events p B' (m INSERT N)`
4408 >- (Q.UNABBREV_TAC `B'` >> BETA_TAC \\
4409     MATCH_MP_TAC INDEP_FAMILIES_SIGMA_lemma2 \\
4410     Q.EXISTS_TAC `M` >> art [] \\
4411     REWRITE_TAC [GSYM MEMBER_NOT_EMPTY] >> Q.EXISTS_TAC `n` >> art [])
4412 >> DISCH_TAC
4413 >> `m NOTIN N` by ASM_SET_TAC [DISJOINT_DEF]
4414 >> Know `S1 = B' m`
4415 >- (Q.UNABBREV_TAC `B'` >> ASM_SIMP_TAC std_ss []) >> Rewr'
4416 >> MATCH_MP_TAC INDEP_FAMILIES_SIGMA_lemma1
4417 >> Q.EXISTS_TAC `N` >> art []
4418 >> ASM_SIMP_TAC std_ss [IMAGE_INSERT, INSERT_SUBSET]
4419 >> Know `B' m = S1`
4420 >- (Q.UNABBREV_TAC `B'` >> ASM_SIMP_TAC std_ss []) >> Rewr'
4421 >> FULL_SIMP_TAC std_ss [IMAGE_UNION, UNION_SUBSET]
4422 >> Suff `subsets (sigma (p_space p) (IMAGE A M)) SUBSET events p` >- METIS_TAC [SUBSET_DEF]
4423 >> MATCH_MP_TAC SIGMA_SUBSET_EVENTS >> art []
4424QED
4425
4426(* c.f. set_limsup_alt, the only difference here is the additional sigma() inside *)
4427Definition tail_algebra_def:
4428    tail_algebra (p :'a p_space) (E :num -> 'a set) =
4429      (p_space p,
4430       BIGINTER (IMAGE (\n. subsets (sigma (p_space p) (IMAGE E (from n)))) UNIV))
4431End
4432
4433Definition tail_algebra_of_rv_def:
4434    tail_algebra_of_rv (p :'a p_space) (X :num -> 'a -> 'b) (A :num -> 'b algebra) =
4435      (p_space p,
4436       BIGINTER (IMAGE (\n. subsets (sigma_functions (p_space p) A X (from n))) UNIV))
4437End
4438
4439Overload tail_algebra = “tail_algebra_of_rv”
4440
4441(* Theorem 3.5.1 of [3, p.37], Kolmogorov 0-1 Law (for independent events).
4442
4443   NOTE: there's a more general version of "Kolmogorov 0-1 Law" for independent r.v.'s
4444  ([5, p.3] or [2, p.264]) under a different definition of "tail field" generated by
4445  `sigma_functions` (martingaleTheory).
4446 *)
4447Theorem Kolmogorov_0_1_Law :
4448    !p E. prob_space p /\ (!n. E n IN events p) /\ indep_events p E UNIV ==>
4449          !e. e IN subsets (tail_algebra p E) ==> (prob p e = 0) \/ (prob p e = 1)
4450Proof
4451    RW_TAC std_ss [tail_algebra_def, subsets_def, IN_BIGINTER_IMAGE, IN_UNIV]
4452 >> Know `e IN events p`
4453 >- (fs [indep_events_def] \\
4454     POP_ASSUM (STRIP_ASSUME_TAC o (REWRITE_RULE [FROM_0]) o (Q.SPEC `0`)) \\
4455     Suff `subsets (sigma (p_space p) (IMAGE E UNIV)) SUBSET events p`
4456     >- METIS_TAC [SUBSET_DEF] \\
4457     MATCH_MP_TAC SIGMA_SUBSET_EVENTS >> art [] \\
4458     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] >> art []) >> DISCH_TAC
4459 >> Know `!n. indep_events p (\x. if x IN (count n) then E x else e)
4460                             (n INSERT count n)`
4461 >- (GEN_TAC >> Cases_on `n = 0`
4462     >- (ASM_SIMP_TAC std_ss [COUNT_ZERO, indep_events_def, IN_SING, NOT_IN_EMPTY] \\
4463         RW_TAC std_ss [SUBSET_DEF, IN_SING, NOT_IN_EMPTY] \\
4464         Know `N = {0}`
4465         >- (RW_TAC std_ss [GSYM UNIQUE_MEMBER_SING] \\
4466             fs [GSYM MEMBER_NOT_EMPTY] >> RES_TAC >> fs []) >> Rewr' \\
4467         SIMP_TAC std_ss [IMAGE_SING, BIGINTER_SING, EXTREAL_PROD_IMAGE_SING]) \\
4468    `0 < n` by RW_TAC arith_ss [] \\
4469     MATCH_MP_TAC INDEP_FAMILIES_SIGMA_lemma2 \\
4470     Q.EXISTS_TAC `from n` >> art [UNION_FROM_COUNT, DISJOINT_FROM_COUNT] \\
4471     CONJ_TAC >- (fs [indep_events_def] \\
4472                  RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] >> art []) \\
4473     CONJ_TAC >- (RW_TAC arith_ss [IN_FROM]) \\
4474     PROVE_TAC [COUNT_NOT_EMPTY]) >> DISCH_TAC
4475 >> Know `indep_events p (\x. if EVEN x then E (DIV2 x) else e)
4476                         (1 INSERT {2 * n | T})`
4477 >- (RW_TAC std_ss [indep_events_def, IN_INSERT, GSPECIFICATION] \\
4478     Cases_on `1 NOTIN N` (* easier case *)
4479     >- (`~EVEN 1` by RW_TAC arith_ss [] \\
4480         `N SUBSET {2 * n | T}` by ASM_SET_TAC [] \\
4481         Know `!x. x IN N ==> EVEN x`
4482         >- (POP_ASSUM MP_TAC >> RW_TAC std_ss [SUBSET_DEF, GSPECIFICATION] \\
4483             `?n. x = 2 * n` by PROVE_TAC [] >> POP_ORW \\
4484             REWRITE_TAC [EVEN_DOUBLE]) >> DISCH_TAC \\
4485         Know `IMAGE (\x. if EVEN x then E (DIV2 x) else e) N = IMAGE (E o DIV2) N`
4486         >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE, o_DEF] \\
4487             EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4488             [ (* goal 3.1 (of 2) *)
4489              `EVEN x'` by PROVE_TAC [] >> fs [] \\
4490              `?v. x' = 2 * v` by PROVE_TAC [EVEN_ODD_EXISTS] \\
4491               Q.EXISTS_TAC `2 * v` >> PROVE_TAC [],
4492               (* goal 3.2 (of 2) *)
4493              `EVEN x'` by PROVE_TAC [] \\
4494               Q.EXISTS_TAC `x'` >> art [] ]) >> Rewr' \\
4495         Know `PI (prob p o (\x. if EVEN x then E (DIV2 x) else e)) N =
4496               PI ((prob p o E) o DIV2) N`
4497         >- (irule EXTREAL_PROD_IMAGE_EQ >> RW_TAC std_ss [o_DEF]) >> Rewr' \\
4498        `IMAGE (E o DIV2) N = IMAGE E (IMAGE DIV2 N)`
4499           by PROVE_TAC [IMAGE_IMAGE] >> POP_ORW \\
4500         Know `PI ((prob p o E) o DIV2) N = PI (prob p o E) (IMAGE DIV2 N)`
4501         >- (MATCH_MP_TAC EQ_SYM >> irule EXTREAL_PROD_IMAGE_IMAGE >> art [] \\
4502             MATCH_MP_TAC INJ_IMAGE >> Q.EXISTS_TAC `IMAGE DIV2 N` \\
4503             RW_TAC std_ss [INJ_DEF, GSPECIFICATION, IN_IMAGE]
4504             >- (Q.EXISTS_TAC `x` >> art []) \\
4505            `(?v1. x = 2 * v1) /\ (?v2. y = 2 * v2)` by PROVE_TAC [EVEN_ODD_EXISTS] \\
4506             fs [DIV2_DOUBLE]) >> Rewr' \\
4507         fs [indep_events_def]) \\
4508     fs [] (* harder case: `1 IN N` *) \\
4509     Q.ABBREV_TAC `N' = N DELETE 1` \\
4510    `N' SUBSET N` by ASM_SET_TAC [] \\
4511    `1 NOTIN N'` by ASM_SET_TAC [] \\
4512    `N' DELETE 1 = N'` by PROVE_TAC [DELETE_NON_ELEMENT] \\
4513    `N = 1 INSERT N'` by ASM_SET_TAC [] >> POP_ORW \\
4514     ASM_SIMP_TAC std_ss [IMAGE_INSERT] \\
4515    `~EVEN 1` by RW_TAC arith_ss [] \\
4516    `N' SUBSET {2 * n | T}` by ASM_SET_TAC [] \\
4517     Know `!x. x IN N'==> EVEN x`
4518     >- (POP_ASSUM MP_TAC >> RW_TAC std_ss [SUBSET_DEF, GSPECIFICATION] \\
4519        `?n. x = 2 * n` by PROVE_TAC [] >> POP_ORW \\
4520         REWRITE_TAC [EVEN_DOUBLE]) >> DISCH_TAC \\
4521     Know `IMAGE (\x. if EVEN x then E (DIV2 x) else e) N' = IMAGE (E o DIV2) N'`
4522     >- (RW_TAC std_ss [Once EXTENSION, IN_IMAGE, o_DEF] \\
4523         EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4524         [ (* goal 3.1 (of 2) *)
4525          `EVEN x'` by PROVE_TAC [] >> fs [] \\
4526          `?v. x' = 2 * v` by PROVE_TAC [EVEN_ODD_EXISTS] \\
4527           Q.EXISTS_TAC `2 * v` >> PROVE_TAC [],
4528           (* goal 3.2 (of 2) *)
4529          `EVEN x'` by PROVE_TAC [] \\
4530           Q.EXISTS_TAC `x'` >> art [] ]) >> Rewr' \\
4531    `FINITE N'` by PROVE_TAC [SUBSET_FINITE_I] \\
4532     ASM_SIMP_TAC std_ss [EXTREAL_PROD_IMAGE_PROPERTY] \\
4533     Know `PI (prob p o (\x. if EVEN x then E (DIV2 x) else e)) N' = PI ((prob p o E) o DIV2) N'`
4534     >- (irule EXTREAL_PROD_IMAGE_EQ \\
4535         RW_TAC std_ss [o_DEF]) >> Rewr' \\
4536    `IMAGE (E o DIV2) N' = IMAGE E (IMAGE DIV2 N')` by PROVE_TAC [IMAGE_IMAGE] >> POP_ORW \\
4537     Know `PI ((prob p o E) o DIV2) N' = PI (prob p o E) (IMAGE DIV2 N')`
4538     >- (MATCH_MP_TAC EQ_SYM >> irule EXTREAL_PROD_IMAGE_IMAGE >> art [] \\
4539         MATCH_MP_TAC INJ_IMAGE >> Q.EXISTS_TAC `IMAGE DIV2 N'` \\
4540         RW_TAC std_ss [INJ_DEF, GSPECIFICATION, IN_IMAGE]
4541         >- (Q.EXISTS_TAC `x` >> art []) \\
4542        `(?v1. x = 2 * v1) /\ (?v2. y = 2 * v2)` by PROVE_TAC [EVEN_ODD_EXISTS] \\
4543         fs [DIV2_DOUBLE]) >> Rewr' \\
4544  (* now applying indep_events_def *)
4545     Q.ABBREV_TAC `n = SUC (MAX_SET N')` \\
4546     Q.PAT_X_ASSUM `!n. indep_events p _ (n INSERT count n)`
4547        (STRIP_ASSUME_TAC o (REWRITE_RULE [indep_events_def]) o (Q.SPEC `n`)) \\
4548     POP_ASSUM (MP_TAC o (Q.SPEC `n INSERT (IMAGE DIV2 N')`)) \\
4549     Know `!x. x IN N' ==> DIV2 x < n`
4550     >- (rpt STRIP_TAC >> Q.UNABBREV_TAC `n` \\
4551         MATCH_MP_TAC LESS_EQ_LESS_TRANS \\
4552         Q.EXISTS_TAC `MAX_SET N'` >> SIMP_TAC arith_ss [] \\
4553         MATCH_MP_TAC LESS_EQ_TRANS \\
4554         Q.EXISTS_TAC `x` >> RW_TAC std_ss [in_max_set] \\
4555         REWRITE_TAC [DIV2_def] >> MATCH_MP_TAC DIV_LESS_EQ >> RW_TAC arith_ss []) \\
4556     DISCH_TAC \\
4557     Know `n INSERT (IMAGE DIV2 N') SUBSET (n INSERT (count n))`
4558     >- (RW_TAC std_ss [SUBSET_DEF, IN_COUNT, IN_INSERT, IN_IMAGE] \\
4559         DISJ2_TAC >> PROVE_TAC []) \\
4560     Know `~(n INSERT (IMAGE DIV2 N') = {})`
4561     >- (RW_TAC std_ss [Once EXTENSION, IN_INSERT, NOT_IN_EMPTY] \\
4562         Q.EXISTS_TAC `n` >> DISJ1_TAC >> REWRITE_TAC []) \\
4563     Know `FINITE (n INSERT (IMAGE DIV2 N'))`
4564     >- (REWRITE_TAC [FINITE_INSERT] \\
4565         MATCH_MP_TAC IMAGE_FINITE >> art []) \\
4566     RW_TAC std_ss [] >> POP_ASSUM MP_TAC \\
4567     SIMP_TAC arith_ss [IMAGE_INSERT] \\
4568     Know `IMAGE (\x. if x < n then E x else e) (IMAGE DIV2 N') = IMAGE (E o DIV2) N'`
4569     >- (RW_TAC arith_ss [Once EXTENSION, IN_IMAGE, o_DEF] \\
4570         EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4571         [ (* goal 3.1 (of 2) *)
4572          `x' < n` by PROVE_TAC [] >> fs [] \\
4573           Q.EXISTS_TAC `x''` >> art [],
4574           (* goal 3.2 (of 2) *)
4575          `EVEN x'` by PROVE_TAC [] \\
4576           Q.EXISTS_TAC `DIV2 x'` \\
4577           reverse CONJ_TAC >- (Q.EXISTS_TAC `x'` >> art []) \\
4578           Suff `DIV2 x' < n` >- ASM_SIMP_TAC std_ss [] \\
4579           PROVE_TAC [] ]) >> Rewr' \\
4580    `IMAGE (E o DIV2) N' = IMAGE E (IMAGE DIV2 N')` by PROVE_TAC [IMAGE_IMAGE] \\
4581     POP_ORW >> Rewr' \\
4582     Know `n NOTIN (IMAGE DIV2 N')`
4583     >- (RW_TAC std_ss [IN_IMAGE] \\
4584         CCONTR_TAC \\
4585        ‘DIV2 x < DIV2 x’ by METIS_TAC [] \\
4586         FULL_SIMP_TAC arith_ss []) >> DISCH_TAC \\
4587    `(IMAGE DIV2 N') DELETE n = IMAGE DIV2 N'` by PROVE_TAC [DELETE_NON_ELEMENT] \\
4588    `FINITE (IMAGE DIV2 N')` by PROVE_TAC [FINITE_INSERT] \\
4589     RW_TAC std_ss [EXTREAL_PROD_IMAGE_PROPERTY] \\
4590     Suff `PI (prob p o (\x. if x < n then E x else e)) (IMAGE DIV2 N') =
4591           PI (prob p o E) (IMAGE DIV2 N')` >- RW_TAC std_ss [] \\
4592     irule EXTREAL_PROD_IMAGE_EQ >> RW_TAC std_ss [IN_IMAGE] \\
4593     Suff `DIV2 x' < n` >- PROVE_TAC [] \\
4594     PROVE_TAC [] ) >> DISCH_TAC
4595 (* applying INDEP_FAMILIES_SIGMA_lemma1 *)
4596 >> Know `!a. a IN subsets
4597                     (sigma (p_space p)
4598                            (IMAGE (\x. if EVEN x then E (DIV2 x) else e) {2 * n | T}))
4599          ==> indep p ((\x. if EVEN x then E (DIV2 x) else e) 1) a`
4600 >- (rpt STRIP_TAC >> irule INDEP_FAMILIES_SIGMA_lemma1 >> art [] \\
4601     Q.EXISTS_TAC `{2 * n | T}` >> art [] \\
4602    `ODD 1` by RW_TAC arith_ss [] \\
4603     CONJ_TAC >- (RW_TAC arith_ss [GSPECIFICATION]) \\
4604     SIMP_TAC std_ss [IMAGE_INSERT] \\
4605     Know `IMAGE (\x. if EVEN x then E (DIV2 x) else e) {2 * n | T} = IMAGE E UNIV`
4606     >- (RW_TAC arith_ss [Once EXTENSION, IN_IMAGE, IN_UNIV, GSPECIFICATION] \\
4607         EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4608         [ (* goal 1 (of 2) *)
4609          `EVEN x'` by PROVE_TAC [EVEN_DOUBLE] >> fs [] \\
4610           Q.EXISTS_TAC `n` >> REWRITE_TAC [],
4611           (* goal 2 (of 2) *)
4612           POP_ORW >> Q.EXISTS_TAC `2 * x'` >> SIMP_TAC std_ss [EVEN_DOUBLE, DIV2_DOUBLE] \\
4613           Q.EXISTS_TAC `x'` >> REWRITE_TAC [] ]) >> Rewr' \\
4614    RW_TAC std_ss [SUBSET_DEF, IN_INSERT] >- art [] \\
4615    fs [indep_events_def, IN_IMAGE, IN_UNIV])
4616 >> Know `IMAGE (\x. if EVEN x then E (DIV2 x) else e) {2 * n | T} = IMAGE E UNIV`
4617 >- (RW_TAC arith_ss [Once EXTENSION, IN_IMAGE, IN_UNIV, GSPECIFICATION] \\
4618     EQ_TAC >> rpt STRIP_TAC >| (* 2 subgoals *)
4619     [ (* goal 1 (of 2) *)
4620      `EVEN x'` by PROVE_TAC [EVEN_DOUBLE] >> fs [] \\
4621       Q.EXISTS_TAC `n` >> REWRITE_TAC [],
4622       (* goal 2 (of 2) *)
4623       POP_ORW >> Q.EXISTS_TAC `2 * x'` >> SIMP_TAC std_ss [EVEN_DOUBLE, DIV2_DOUBLE] \\
4624       Q.EXISTS_TAC `x'` >> REWRITE_TAC [] ]) >> Rewr'
4625 >> `ODD 1` by RW_TAC arith_ss []
4626 >> `~(EVEN 1)` by PROVE_TAC [EVEN_ODD] >> SIMP_TAC arith_ss [] >> DISCH_TAC
4627 >> Know `e IN subsets (sigma (p_space p) (IMAGE E univ(:num)))`
4628 >- (Suff `subsets (sigma (p_space p) (IMAGE E (from n))) SUBSET
4629           subsets (sigma (p_space p) (IMAGE E univ(:num)))` >- METIS_TAC [SUBSET_DEF] \\
4630     MATCH_MP_TAC SIGMA_MONOTONE \\
4631     MATCH_MP_TAC IMAGE_SUBSET >> REWRITE_TAC [SUBSET_UNIV]) >> DISCH_TAC
4632 >> `indep p e e` by PROVE_TAC []
4633 >> METIS_TAC [INDEP_REFL]
4634QED
4635
4636(******************************************************************************)
4637(*  Uncorrelation of r.v.'s [2, p.107-108]                                    *)
4638(******************************************************************************)
4639
4640(* "The requirement of finite second moments seems unnecessary, but it does ensure the
4641    finiteness of E[XY] (Cauchy-Schwarz inequality!) as well as that of E[X] and E[Y]."
4642   [2, p.107] *)
4643Definition uncorrelated_def:
4644    uncorrelated p X Y <=>
4645      finite_second_moments p X /\ finite_second_moments p Y /\
4646      (expectation p (\s. X s * Y s) = expectation p X * expectation p Y)
4647End
4648
4649Definition uncorrelated_vars_def:
4650    uncorrelated_vars p X J <=>
4651      !i j. i IN J /\ j IN J /\ i <> j ==> uncorrelated p (X i) (X j)
4652End
4653
4654Definition orthogonal_def:
4655    orthogonal p X Y <=>
4656      finite_second_moments p X /\ finite_second_moments p Y /\
4657      (expectation p (\s. X s * Y s) = 0)
4658End
4659
4660Definition orthogonal_vars_def:
4661    orthogonal_vars p X J <=>
4662      !i j. i IN J /\ j IN J /\ i <> j ==> orthogonal p (X i) (X j)
4663End
4664
4665Definition covariance_def:
4666    covariance p X Y =
4667      expectation p (\x. (X x - expectation p X) * (Y x - expectation p Y))
4668End
4669
4670Theorem covariance_self :
4671    !p X. covariance p X X = variance p X
4672Proof
4673    RW_TAC std_ss [variance_alt, covariance_def, pow_2]
4674QED
4675
4676(* i.e. `covariance p X Y` is zero if X and Y are uncorelated *)
4677Theorem uncorrelated_thm :
4678    !p X Y. prob_space p /\ real_random_variable X p /\ real_random_variable Y p /\
4679            uncorrelated p X Y ==>
4680           (expectation p (\s. (X s - expectation p X) * (Y s - expectation p Y)) = 0)
4681Proof
4682    RW_TAC std_ss [uncorrelated_def] (* 2 subgoals *)
4683 >> `expectation p X <> PosInf /\ expectation p X <> NegInf /\
4684     expectation p Y <> PosInf /\ expectation p Y <> NegInf`
4685      by PROVE_TAC [finite_second_moments_imp_finite_expectation]
4686 >> `!s. s IN p_space p ==>
4687         X s <> PosInf /\ X s <> NegInf /\ Y s <> PosInf /\ Y s <> NegInf`
4688      by PROVE_TAC [real_random_variable_def]
4689 >> `?c. expectation p X = Normal c` by PROVE_TAC [extreal_cases]
4690 >> `?d. expectation p Y = Normal d` by PROVE_TAC [extreal_cases] >> art []
4691 >> Know `!s. s IN p_space p ==>
4692             (X s - Normal c) * (Y s - Normal d) =
4693             (\x. (X x) * (Y x)) s +
4694             (\x. (Normal c * Normal d - Normal c * (Y x) - Normal d * (X x))) s`
4695 >- (RW_TAC std_ss [] \\
4696    `?a. X s = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4697    `?b. Y s = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4698     rw [extreal_sub_def, extreal_add_def, extreal_mul_def, extreal_11] \\
4699     REAL_ARITH_TAC)
4700 >> DISCH_TAC
4701 >> Know ‘expectation p (\s. (X s - Normal c) * (Y s - Normal d)) =
4702          expectation p (\s. (\x. X x * Y x) s +
4703                             (\x. Normal c * Normal d - Normal c * Y x - Normal d * X x) s)’
4704 >- (MATCH_MP_TAC expectation_cong >> RW_TAC std_ss []) >> Rewr'
4705 >> POP_ASSUM K_TAC (* clean up useless assumption *)
4706 >> `integrable p (\x. X x pow 2) /\ integrable p (\x. Y x pow 2)`
4707       by METIS_TAC [finite_second_moments_eq_integrable_square]
4708 >> Know `integrable p (\x. X x * Y x)`
4709 >- (MATCH_MP_TAC integrable_bounded \\
4710     Q.EXISTS_TAC `\x. Normal (1 / 2) * ((X x) pow 2 + (Y x) pow 2)` \\
4711     fs [prob_space_def, p_space_def, events_def, real_random_variable] \\
4712     rpt STRIP_TAC >| (* 3 subgoals *)
4713     [ (* goal 1 (of 3) *)
4714      `(\x. Normal (1 / 2) * ((X x) pow 2 + (Y x) pow 2)) =
4715       (\x. Normal (1 / 2) * (\x. (X x) pow 2 + (Y x) pow 2) x)` by METIS_TAC [] >> POP_ORW \\
4716       MATCH_MP_TAC integrable_cmul >> art [] \\
4717      `(\x. (X x) pow 2 + (Y x) pow 2) = (\x. (\x. (X x) pow 2) x + (\x. (Y x) pow 2) x)`
4718         by METIS_TAC [] >> POP_ORW \\
4719       MATCH_MP_TAC integrable_add >> RW_TAC std_ss [pow_2] \\
4720       DISJ1_TAC >> CONJ_TAC >| (* 2 subgoals *)
4721       [ `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4722         REWRITE_TAC [extreal_mul_def, extreal_not_infty],
4723         `?r. Y x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4724         REWRITE_TAC [extreal_mul_def, extreal_not_infty] ],
4725       (* goal 2 (of 3) *)
4726       MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL \\
4727       qexistsl_tac [‘X’, ‘Y’] >> fs [measure_space_def],
4728       (* goal 3 (of 3) *)
4729       REWRITE_TAC [abs_le_half_pow2] ]) >> DISCH_TAC
4730 >> `integrable p X /\ integrable p Y` by METIS_TAC [integrable_from_square]
4731 >> FULL_SIMP_TAC pure_ss [expectation_def, prob_space_def, p_space_def]
4732 (* applying "integral_add" *)
4733 >> Know `integral p (\s. (\x. X x * Y x) s +
4734                          (\x. Normal c * Normal d - Normal c * Y x - Normal d * X x) s) =
4735          integral p (\x. X x * Y x) +
4736          integral p (\x. Normal c * Normal d - Normal c * Y x - Normal d * X x)`
4737 >- (MATCH_MP_TAC integral_add \\
4738     RW_TAC std_ss [extreal_mul_def, extreal_not_infty] >| (* 2 subgoals *)
4739     [ (* goal 1 (of 2) *)
4740      `(\x. Normal (c * d) - Normal c * Y x - Normal d * X x) =
4741       (\x. (\x. Normal (c * d) - Normal c * Y x) x - (\x. Normal d * X x) x)`
4742        by METIS_TAC [] >> POP_ORW \\
4743       MATCH_MP_TAC integrable_sub >> RW_TAC std_ss [integrable_cmul] >| (* 3 subgoals *)
4744       [ (* goal 1.1 (of 3) *)
4745        `(\x. Normal (c * d) - Normal c * Y x) =
4746         (\x. (\x. Normal (c * d)) x - (\x. Normal c * Y x) x)` by METIS_TAC [] >> POP_ORW \\
4747         MATCH_MP_TAC integrable_sub >> RW_TAC std_ss [integrable_cmul] >| (* 2 subgoals *)
4748         [ (* goal 1.1.1 (of 2) *)
4749           MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty],
4750           (* goal 1.1.2 (of 2) *)
4751          `?r. Y x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4752           REWRITE_TAC [extreal_mul_def, extreal_not_infty] ],
4753         (* goal 1.2 (of 3) *)
4754        `?r. Y x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4755         REWRITE_TAC [extreal_mul_def, extreal_sub_def, extreal_not_infty],
4756         (* goal 1.3 (of 3) *)
4757        `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4758         REWRITE_TAC [extreal_mul_def, extreal_not_infty] ],
4759       (* goal 2 (of 2) *)
4760       DISJ1_TAC >> CONJ_TAC >| (* 2 subgoals *)
4761       [ (* goal 2.1 (of 2) *)
4762        `?a. X x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4763        `?b. Y x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4764         REWRITE_TAC [extreal_mul_def, extreal_not_infty],
4765         (* goal 2.2 (of 2) *)
4766        `?a. X x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4767        `?b. Y x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4768         REWRITE_TAC [extreal_mul_def, extreal_sub_def, extreal_not_infty] ] ]) >> Rewr'
4769 >> Know `integral p (\x. Normal c * Normal d - Normal c * Y x - Normal d * X x) =
4770          integral p (\x. (\x. Normal c * Normal d) x +
4771                          (\x. (- Normal c) * Y x + (- Normal d) * X x) x)`
4772 >- (MATCH_MP_TAC integral_cong >> RW_TAC std_ss [] \\
4773    `?a. X x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4774    `?b. Y x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4775     SIMP_TAC real_ss [extreal_mul_def, extreal_ainv_def, extreal_add_def, extreal_sub_def,
4776                       extreal_11] \\
4777     REAL_ARITH_TAC)
4778 >> Rewr'
4779 >> Know `integral p (\x. (\x. Normal c * Normal d) x +
4780                          (\x. -Normal c * Y x + -Normal d * X x) x) =
4781          integral p (\x. Normal c * Normal d) +
4782          integral p (\x. -Normal c * Y x + -Normal d * X x)`
4783 >- (MATCH_MP_TAC integral_add \\
4784     RW_TAC std_ss [extreal_ainv_def, extreal_mul_def, extreal_not_infty] >| (* 2 subgoals *)
4785     [ (* goal 1 (of 2) *)
4786       MATCH_MP_TAC integrable_const >> art [extreal_of_num_def, lt_infty],
4787       (* goal 2 (of 2) *)
4788      `(\x. Normal (-c) * Y x + Normal (-d) * X x) =
4789       (\x. (\x. Normal (-c) * Y x) x + (\x. Normal (-d) * X x) x)`
4790         by METIS_TAC [] >> POP_ORW \\
4791       MATCH_MP_TAC integrable_add >> RW_TAC std_ss [integrable_cmul] \\
4792       DISJ1_TAC >> CONJ_TAC >| (* 2 subgoals *)
4793       [ (* goal 2.1 (of 2) *)
4794        `?r. Y x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4795          REWRITE_TAC [extreal_mul_def, extreal_not_infty],
4796         (* goal 2.2 (of 2) *)
4797        `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4798          REWRITE_TAC [extreal_mul_def, extreal_not_infty] ] ]) >> Rewr'
4799 >> Know `integral p (\x. Normal c * Normal d) = Normal c * Normal d`
4800 >- (REWRITE_TAC [GSYM expectation_def, extreal_mul_def] \\
4801     MATCH_MP_TAC expectation_const >> art [prob_space_def, p_space_def]) >> Rewr'
4802 >> `(\x. -Normal c * Y x + -Normal d * X x) =
4803     (\x. (\x. -Normal c * Y x) x + (\x. -Normal d * X x) x)` by METIS_TAC [] >> POP_ORW
4804 >> Know `integral p (\x. (\x. -Normal c * Y x) x + (\x. -Normal d * X x) x) =
4805          integral p (\x. -Normal c * Y x) + integral p (\x. -Normal d * X x)`
4806 >- (MATCH_MP_TAC integral_add >> art [extreal_ainv_def] \\
4807     RW_TAC std_ss [integrable_cmul] \\
4808     DISJ1_TAC >> CONJ_TAC >| (* 2 subgoals *)
4809     [ (* goal 1 (of 2) *)
4810      `?r. Y x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4811       REWRITE_TAC [extreal_mul_def, extreal_not_infty],
4812       (* goal 2.2 (of 2) *)
4813      `?r. X x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4814       REWRITE_TAC [extreal_mul_def, extreal_not_infty] ]) >> Rewr'
4815 >> Know `integral p (\x. -Normal c * Y x) = -Normal c * integral p Y`
4816 >- (REWRITE_TAC [extreal_ainv_def] \\
4817     MATCH_MP_TAC integral_cmul >> art []) >> Rewr'
4818 >> Know `integral p (\x. -Normal d * X x) = -Normal d * integral p X`
4819 >- (REWRITE_TAC [extreal_ainv_def] \\
4820     MATCH_MP_TAC integral_cmul >> art []) >> Rewr'
4821 >> ASM_REWRITE_TAC [extreal_ainv_def, extreal_mul_def, extreal_add_def, extreal_11,
4822                     extreal_of_num_def]
4823 >> REAL_ARITH_TAC
4824QED
4825
4826Theorem uncorrelated_covariance :
4827    !p X Y. prob_space p /\ real_random_variable X p /\ real_random_variable Y p /\
4828            uncorrelated p X Y ==> (covariance p X Y = 0)
4829Proof
4830    RW_TAC std_ss [covariance_def]
4831 >> MATCH_MP_TAC uncorrelated_thm >> art []
4832QED
4833
4834Theorem uncorrelated_orthogonal :
4835    !p X Y. prob_space p /\ real_random_variable X p /\ real_random_variable Y p /\
4836            (expectation p X = 0) /\ (expectation p Y = 0) ==>
4837            (uncorrelated p X Y <=> orthogonal p X Y)
4838Proof
4839    rw [orthogonal_def, uncorrelated_def]
4840QED
4841
4842(* Fundamental relation of uncorrelated r.v.'s [2, p.108] *)
4843Theorem variance_sum :
4844    !p X (J :'index set).
4845            prob_space p /\ FINITE J /\ (!i. i IN J ==> real_random_variable (X i) p) /\
4846            uncorrelated_vars p X J ==>
4847           (variance p (\x. SIGMA (\n. X n x) J) = SIGMA (\n. variance p (X n)) J)
4848Proof
4849    RW_TAC std_ss [uncorrelated_vars_def, variance_alt]
4850 >> Cases_on `J = {}`
4851 >- (Know `expectation p (\x. 0) = 0`
4852     >- (REWRITE_TAC [extreal_of_num_def] \\
4853         MATCH_MP_TAC expectation_const >> art []) \\
4854     RW_TAC std_ss [EXTREAL_SUM_IMAGE_EMPTY, sub_rzero, pow_2, mul_rzero])
4855 >> Cases_on `SING J`
4856 >- (FULL_SIMP_TAC std_ss [SING_DEF] \\
4857     RW_TAC std_ss [EXTREAL_SUM_IMAGE_SING] >> METIS_TAC [])
4858 (* LHS: applying integral_sum *)
4859 >> Know `expectation p (\x. SIGMA (\n. X n x) J) = SIGMA (\n. expectation p (X n)) J`
4860 >- (fs [expectation_def, prob_space_def, p_space_def, real_random_variable_def,
4861         random_variable_def, events_def] \\
4862     MATCH_MP_TAC integral_sum >> RW_TAC std_ss [] \\
4863     MATCH_MP_TAC finite_second_moments_imp_integrable \\
4864     fs [uncorrelated_def, prob_space_def, p_space_def, real_random_variable_def,
4865         random_variable_def, events_def] \\
4866    `?j. i <> j /\ j IN J` by ASM_SET_TAC [SING_DEF] >> METIS_TAC [])
4867 >> Rewr'
4868 >> Know `!n. n IN J ==> finite_second_moments p (X n)`
4869 >- (fs [uncorrelated_def] >> RW_TAC std_ss [] \\
4870    `?n'. n <> n' /\ n' IN J` by ASM_SET_TAC [SING_DEF] >> METIS_TAC [])
4871 >> DISCH_TAC
4872 >> `!n. n IN J ==> expectation p (X n) <> PosInf /\ expectation p (X n) <> NegInf`
4873     by METIS_TAC [finite_second_moments_imp_finite_expectation]
4874 >> Know `!i x. i IN J /\ x IN p_space p ==> X i x <> PosInf /\ X i x <> NegInf`
4875 >- fs [real_random_variable_def] >> DISCH_TAC
4876 (* LHS: applying EXTREAL_SUM_IMAGE_SUB *)
4877 >> Know `!x. x IN p_space p ==>
4878              SIGMA (\n. X n x) J - SIGMA (\n. expectation p (X n)) J =
4879              SIGMA (\n. (\n. X n x) n - (\n. expectation p (X n)) n) J`
4880 >- (rpt STRIP_TAC >> MATCH_MP_TAC EQ_SYM \\
4881     irule EXTREAL_SUM_IMAGE_SUB >> art [] >> DISJ1_TAC >> RW_TAC std_ss [])
4882 >> DISCH_TAC
4883 >> Know ‘expectation p
4884            (\x. (SIGMA (\n. X n x) J - SIGMA (\n. expectation p (X n)) J) pow 2) =
4885          expectation p
4886            (\x. (SIGMA (\n. (\n. X n x) n - (\n. expectation p (X n)) n) J) pow 2)’
4887 >- (MATCH_MP_TAC expectation_cong >> RW_TAC std_ss [])
4888 >> Rewr' >> BETA_TAC
4889 >> POP_ASSUM K_TAC
4890 (* LHS: applying EXTREAL_SUM_IMAGE_POW *)
4891 >> Know `!x. x IN p_space p ==>
4892              (SIGMA (\n. X n x - expectation p (X n)) J) pow 2 =
4893              SIGMA (\(i,j). (\n. X n x - expectation p (X n)) i *
4894                             (\n. X n x - expectation p (X n)) j) (J CROSS J)`
4895 >- (rpt STRIP_TAC \\
4896     irule EXTREAL_SUM_IMAGE_POW >> RW_TAC std_ss [] \\ (* 2 subgoals, same tactics *)
4897    `?a. X x' x = Normal a` by METIS_TAC [extreal_cases] >> POP_ORW \\
4898    `?b. expectation p (X x') = Normal b` by METIS_TAC [extreal_cases] >> POP_ORW \\
4899     REWRITE_TAC [extreal_sub_def, extreal_not_infty])
4900 >> DISCH_TAC
4901 >> Know ‘expectation p (\x. SIGMA (\n. X n x - expectation p (X n)) J pow 2) =
4902          expectation p (\x. SIGMA (\(i,j). (\n. X n x - expectation p (X n)) i *
4903                                            (\n. X n x - expectation p (X n)) j) (J CROSS J))’
4904 >- (MATCH_MP_TAC expectation_cong >> RW_TAC std_ss [])
4905 >> Rewr' >> BETA_TAC
4906 >> POP_ASSUM K_TAC
4907 (* LHS: applying EXTREAL_SUM_IMAGE_DISJOINT_UNION *)
4908 >> Q.ABBREV_TAC `A = {(i,i) | i IN J}`
4909 >> Q.ABBREV_TAC `B = {(i,j) | i IN J /\ j IN J /\ i <> j}`
4910 >> Know `DISJOINT A B`
4911 >- (Q.UNABBREV_TAC `A` >> Q.UNABBREV_TAC `B` \\
4912     RW_TAC std_ss [DISJOINT_DEF, Once EXTENSION, NOT_IN_EMPTY, GSPECIFICATION, IN_INTER] \\
4913     Cases_on `x` >> Cases_on `q = r`
4914     >- (DISJ2_TAC >> GEN_TAC >> Cases_on `x'` >> RW_TAC std_ss [] \\
4915         METIS_TAC []) \\
4916     DISJ1_TAC >> GEN_TAC >> RW_TAC std_ss [] >> METIS_TAC [])
4917 >> DISCH_TAC
4918 >> Know `J CROSS J = A UNION B`
4919 >- (Q.UNABBREV_TAC `A` >> Q.UNABBREV_TAC `B` \\
4920     RW_TAC std_ss [IN_CROSS, Once EXTENSION] >> Cases_on `x` \\
4921     RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, IN_UNION] \\
4922     EQ_TAC >> rpt STRIP_TAC >| (* 5 subgoals *)
4923     [ (* goal 1 (of 5) *)
4924       Cases_on `r = q` >- (DISJ1_TAC >> art []) \\
4925       DISJ2_TAC >> Q.EXISTS_TAC `(q,r)` >> RW_TAC std_ss [],
4926       (* goal 2 (of 5) *) art [],
4927       (* goal 3 (of 5) *) art [],
4928       (* goal 4 (of 5) *) Cases_on `x` >> fs [],
4929       (* goal 5 (of 5) *) Cases_on `x` >> fs [] ])
4930 >> DISCH_TAC >> art []
4931 >> Know ‘expectation p
4932            (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
4933                                (X j x - expectation p (X j))) (A UNION B)) =
4934          expectation p
4935            (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
4936                                (X j x - expectation p (X j))) A +
4937                 SIGMA (\(i,j). (X i x - expectation p (X i)) *
4938                                (X j x - expectation p (X j))) B)’
4939 >- (MATCH_MP_TAC expectation_cong >> RW_TAC std_ss [] \\
4940     irule EXTREAL_SUM_IMAGE_DISJOINT_UNION \\
4941
4942    `FINITE (J CROSS J)` by PROVE_TAC [FINITE_CROSS] \\
4943    `A SUBSET (J CROSS J) /\ B SUBSET (J CROSS J)` by ASM_SET_TAC [] \\
4944    `FINITE A /\ FINITE B` by PROVE_TAC [SUBSET_FINITE] \\
4945     Q.PAT_X_ASSUM `J CROSS J = A UNION B` (art o wrap o SYM) \\
4946     DISJ2_TAC >> RW_TAC std_ss [IN_CROSS] >> Cases_on `x'` \\
4947     FULL_SIMP_TAC std_ss [] \\
4948    `?a. X q x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4949    `?b. X r x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4950    `?c. expectation p (X q) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4951    `?d. expectation p (X r) = Normal d` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4952     REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty]) >> Rewr'
4953 (* LHS: applying EXTREAL_SUM_IMAGE_IMAGE *)
4954 >> `A = IMAGE (\x. (x,x)) J`
4955       by (RW_TAC std_ss [Abbr ‘A’, Once EXTENSION, IN_IMAGE, GSPECIFICATION])
4956 >> Know ‘!x. x IN p_space p ==>
4957              SIGMA (\(i,j). (X i x - expectation p (X i)) *
4958                             (X j x - expectation p (X j))) A =
4959              SIGMA ((\(i,j). (X i x - expectation p (X i)) *
4960                              (X j x - expectation p (X j))) o (\x. (x,x))) J’
4961 >- (rpt STRIP_TAC >> art [] >> irule EXTREAL_SUM_IMAGE_IMAGE >> art [] \\
4962     reverse CONJ_TAC
4963     >- (MATCH_MP_TAC INJ_IMAGE >> Q.EXISTS_TAC `J CROSS J` \\
4964         Q.PAT_X_ASSUM `J CROSS J = A UNION B` K_TAC \\
4965         RW_TAC std_ss [INJ_DEF, IN_IMAGE, IN_CROSS]) \\
4966     Q.PAT_X_ASSUM `A = IMAGE (\x. (x,x)) J` (REWRITE_TAC o wrap o SYM) \\
4967     DISJ2_TAC >> RW_TAC std_ss [] >> Cases_on `x'` >> SIMP_TAC std_ss [] \\
4968    `A SUBSET (J CROSS J) /\ B SUBSET (J CROSS J)` by ASM_SET_TAC [] \\
4969     Know `q IN J /\ r IN J`
4970     >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
4971         POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) >> STRIP_TAC \\
4972    `?a. X q x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4973    `?b. X r x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4974    `?c. expectation p (X q) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4975    `?d. expectation p (X r) = Normal d` by PROVE_TAC [extreal_cases] >> POP_ORW \\
4976     REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty])
4977 >> SIMP_TAC std_ss [o_DEF, GSYM pow_2]
4978 >> DISCH_TAC
4979 >> Know ‘expectation p
4980            (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
4981                                (X j x - expectation p (X j))) A +
4982                 SIGMA (\(i,j). (X i x - expectation p (X i)) *
4983                                (X j x - expectation p (X j))) B) =
4984          expectation p
4985            (\x. SIGMA (\n. (X n x - expectation p (X n)) pow 2) J +
4986                 SIGMA (\(i,j). (X i x - expectation p (X i)) *
4987                                (X j x - expectation p (X j))) B)’
4988 >- (MATCH_MP_TAC expectation_cong >> RW_TAC std_ss []) >> Rewr'
4989 >> POP_ASSUM K_TAC
4990 (* an important shared result *)
4991 >> Know `!q r. q IN J /\ r IN J ==>
4992                integrable p (\x. (X q x - expectation p (X q)) *
4993                                  (X r x - expectation p (X r)))`
4994 >- (rpt STRIP_TAC \\
4995     Q.ABBREV_TAC `E1 = expectation p (X q)` \\
4996     Q.ABBREV_TAC `E2 = expectation p (X r)` \\
4997  (* integrable p (\x. (X q x - E1) * (X r x - E2)) *)
4998     MATCH_MP_TAC integrable_bounded \\
4999     Q.EXISTS_TAC `\x. Normal (1 / 2) * ((X q x - E1) pow 2 + (X r x - E2) pow 2)` \\
5000     CONJ_TAC >- fs [prob_space_def] \\
5001     CONJ_TAC
5002     >- (`(\x. Normal (1 / 2) * ((X q x - E1) pow 2 + (X r x - E2) pow 2)) =
5003          (\x. Normal (1 / 2) * (\x. (X q x - E1) pow 2 + (X r x - E2) pow 2) x)`
5004           by METIS_TAC [] >> POP_ORW \\
5005         MATCH_MP_TAC integrable_cmul >> CONJ_TAC >- fs [prob_space_def] \\
5006        `!x. (X q x - E1) pow 2 + (X r x - E2) pow 2 =
5007             (\x. (X q x - E1) pow 2) x + (\x. (X r x - E2) pow 2) x`
5008           by METIS_TAC [] >> POP_ORW \\
5009         MATCH_MP_TAC integrable_add \\
5010         CONJ_TAC >- fs [prob_space_def] \\
5011        `?e1. E1 = Normal e1` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5012        `?e2. E2 = Normal e2` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5013         REWRITE_TAC [CONJ_ASSOC] \\
5014         CONJ_TAC >- METIS_TAC [finite_second_moments_eq_integrable_squares] \\
5015         GEN_TAC >> DISCH_TAC >> DISJ1_TAC >> BETA_TAC \\
5016         CONJ_TAC >> MATCH_MP_TAC pos_not_neginf >> REWRITE_TAC [le_pow2]) \\
5017     CONJ_TAC
5018     >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_TIMES \\
5019         qexistsl_tac [`\x. X q x - E1`, `\x. X r x - E2`] \\
5020         fs [prob_space_def, measure_space_def, space_def, p_space_def, events_def] \\
5021         CONJ_TAC
5022         >- (`!x. X q x - E1 = X q x - (\x. E1) x` by METIS_TAC [] >> POP_ORW \\
5023             MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5024             qexistsl_tac [`X q`, `\x. E1`] \\
5025             fs [real_random_variable, space_def, p_space_def, events_def] \\
5026             MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
5027             Q.EXISTS_TAC `E1` >> fs [space_def]) \\
5028        `!x. X r x - E2 = X r x - (\x. E2) x` by METIS_TAC [] >> POP_ORW \\
5029         MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5030         qexistsl_tac [`X r`, `\x. E2`] \\
5031         fs [real_random_variable, space_def, p_space_def, events_def] \\
5032         MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST \\
5033         Q.EXISTS_TAC `E2` >> fs [space_def]) \\
5034     RW_TAC std_ss [abs_le_half_pow2])
5035 >> DISCH_TAC
5036 (* LHS: applying integral_add *)
5037 >> Know `expectation p
5038            (\x. (\x. SIGMA (\n. (X n x - expectation p (X n)) pow 2) J) x +
5039                 (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
5040                                     (X j x - expectation p (X j))) B) x) =
5041          expectation p (\x. SIGMA (\n. (X n x - expectation p (X n)) pow 2) J) +
5042          expectation p (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
5043                                            (X j x - expectation p (X j))) B)`
5044 >- (REWRITE_TAC [expectation_def] >> MATCH_MP_TAC integral_add \\
5045     CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
5046     REWRITE_TAC [CONJ_ASSOC] \\
5047     reverse CONJ_TAC (* easy goals first *)
5048     >- (GEN_TAC >> BETA_TAC >> DISCH_TAC >> DISJ1_TAC \\
5049         CONJ_TAC
5050         >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> RW_TAC std_ss [lt_infty] \\
5051             MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC `0` \\
5052             REWRITE_TAC [le_pow2] >> REWRITE_TAC [lt_infty, extreal_of_num_def]) \\
5053         MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF \\
5054        `B SUBSET (J CROSS J)` by ASM_SET_TAC [] \\
5055        `FINITE (J CROSS J)` by PROVE_TAC [FINITE_CROSS] \\
5056        `FINITE B` by PROVE_TAC [SUBSET_FINITE] >> art [] \\
5057         Q.X_GEN_TAC `n` >> Cases_on `n` >> DISCH_TAC >> SIMP_TAC std_ss [] \\
5058         Know `q IN J /\ r IN J`
5059         >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
5060             POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) >> STRIP_TAC \\
5061         REWRITE_TAC [GSYM expectation_def] \\
5062         FULL_SIMP_TAC std_ss [p_space_def] \\
5063        `?a. X q x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5064        `?b. X r x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5065        `?c. expectation p (X q) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5066        `?d. expectation p (X r) = Normal d` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5067         REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty]) \\
5068  (* integrable p (\x. SIGMA (\n. (X n x - integral p (X n)) pow 2) J) *)
5069     CONJ_TAC
5070     >- (`!x n. (X n x - integral p (X n)) pow 2 =
5071                 (\n x. (X n x - integral p (X n)) pow 2) n x` by METIS_TAC [] \\
5072         POP_ORW >> MATCH_MP_TAC integrable_sum >> ASM_SIMP_TAC std_ss [] \\
5073         CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
5074         CONJ_TAC
5075         >- (RW_TAC std_ss [GSYM expectation_def] \\
5076            `?r. expectation p (X i) = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5077             METIS_TAC [finite_second_moments_eq_integrable_squares]) \\
5078         rpt GEN_TAC >> SIMP_TAC std_ss [GSYM expectation_def] >> STRIP_TAC \\
5079        `?r. expectation p (X i) = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5080         FULL_SIMP_TAC std_ss [p_space_def] \\
5081        `?c. X i x = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5082         REWRITE_TAC [pow_2, extreal_sub_def, extreal_mul_def, extreal_not_infty]) \\
5083  (* applying integrable_sum *)
5084     Know `!x. (\(i,j). (X i x - integral p (X i)) * (X j x - integral p (X j))) =
5085               (\i. (\i x. (X (FST i) x - integral p (X (FST i))) *
5086                           (X (SND i) x - integral p (X (SND i)))) i x)`
5087     >- (GEN_TAC >> FUN_EQ_TAC >> Q.X_GEN_TAC `y` >> Cases_on `y` \\
5088         SIMP_TAC std_ss []) >> Rewr' \\
5089     MATCH_MP_TAC integrable_sum \\
5090    `B SUBSET (J CROSS J)` by ASM_SET_TAC [] \\
5091    `FINITE (J CROSS J)` by PROVE_TAC [FINITE_CROSS] \\
5092    `FINITE B` by PROVE_TAC [SUBSET_FINITE] >> art [] \\
5093     CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
5094     reverse CONJ_TAC
5095     >- (rpt GEN_TAC >> STRIP_TAC \\
5096         Cases_on `i` >> FULL_SIMP_TAC std_ss [] \\
5097         Know `q IN J /\ r IN J`
5098         >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
5099             POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) >> STRIP_TAC \\
5100         REWRITE_TAC [GSYM expectation_def] \\
5101         FULL_SIMP_TAC std_ss [p_space_def] \\
5102        `?a. X q x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5103        `?b. X r x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5104        `?c. expectation p (X q) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5105        `?d. expectation p (X r) = Normal d` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5106         REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty]) \\
5107     GEN_TAC >> DISCH_TAC \\
5108     Cases_on `i` >> FULL_SIMP_TAC std_ss [] \\
5109     Know `q IN J /\ r IN J`
5110     >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
5111         POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) >> STRIP_TAC \\
5112     REWRITE_TAC [GSYM expectation_def] \\
5113     FIRST_X_ASSUM MATCH_MP_TAC >> art [])
5114 >> BETA_TAC >> Rewr'
5115 (* LHS: applying integral_sum *)
5116 >> Know `expectation p (\x. SIGMA (\n. (\i x. (X i x - expectation p (X i)) pow 2) n x) J) =
5117          SIGMA (\n. expectation p ((\i x. (X i x - expectation p (X i)) pow 2) n)) J`
5118 >- (REWRITE_TAC [expectation_def] \\
5119     MATCH_MP_TAC integral_sum >> ASM_SIMP_TAC std_ss [] \\
5120     CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
5121     reverse CONJ_TAC
5122     >- (RW_TAC std_ss [GSYM expectation_def, pow_2] \\
5123         FULL_SIMP_TAC std_ss [p_space_def] \\
5124        `?r. X i x = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5125        `?c. expectation p (X i) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5126         REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty]) \\
5127     RW_TAC std_ss [GSYM expectation_def] \\
5128    `?c. expectation p (X i) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5129     METIS_TAC [finite_second_moments_eq_integrable_squares])
5130 >> BETA_TAC >> Rewr'
5131 >> Suff `expectation p (\x. SIGMA (\(i,j). (X i x - expectation p (X i)) *
5132                                            (X j x - expectation p (X j))) B) = 0`
5133 >- (Rewr' >> REWRITE_TAC [add_rzero])
5134 (* LHS: applying integral_sum again *)
5135 >> Know `!x. (\(i,j). (X i x - expectation p (X i)) * (X j x - expectation p (X j))) =
5136              (\i. (X (FST i) x - expectation p (X (FST i))) *
5137                   (X (SND i) x - expectation p (X (SND i))))`
5138 >- (GEN_TAC >> RW_TAC std_ss [FUN_EQ_THM] \\
5139     Cases_on `i` >> SIMP_TAC std_ss [])
5140 >> Rewr'
5141 >> Know `expectation p (\x. SIGMA (\i. (\i x. (X (FST i) x - expectation p (X (FST i))) *
5142                                               (X (SND i) x - expectation p (X (SND i)))) i x) B) =
5143          SIGMA (\i. expectation p ((\i x. (X (FST i) x - expectation p (X (FST i))) *
5144                                           (X (SND i) x - expectation p (X (SND i)))) i)) B`
5145 >- (REWRITE_TAC [expectation_def] >> MATCH_MP_TAC integral_sum \\
5146    `B SUBSET (J CROSS J)` by ASM_SET_TAC [] \\
5147    `FINITE (J CROSS J)` by PROVE_TAC [FINITE_CROSS] \\
5148    `FINITE B` by PROVE_TAC [SUBSET_FINITE] \\
5149     ASM_SIMP_TAC std_ss [] \\
5150     CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
5151     reverse CONJ_TAC
5152     >- (rpt GEN_TAC >> STRIP_TAC \\
5153         Cases_on `i` >> FULL_SIMP_TAC std_ss [] \\
5154         Know `q IN J /\ r IN J`
5155         >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
5156             POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) \\
5157         STRIP_TAC \\
5158         REWRITE_TAC [GSYM expectation_def] \\
5159         FULL_SIMP_TAC std_ss [p_space_def] \\
5160        `?a. X q x = Normal a` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5161        `?b. X r x = Normal b` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5162        `?c. expectation p (X q) = Normal c` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5163        `?d. expectation p (X r) = Normal d` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5164         REWRITE_TAC [extreal_sub_def, extreal_mul_def, extreal_not_infty]) \\
5165     GEN_TAC >> DISCH_TAC \\
5166     Cases_on `i` >> FULL_SIMP_TAC std_ss [] \\
5167     Know `q IN J /\ r IN J`
5168     >- (CONJ_TAC >> `(q,r) IN (J CROSS J)` by PROVE_TAC [SUBSET_DEF] \\
5169         POP_ASSUM MP_TAC >> SIMP_TAC std_ss [IN_CROSS]) >> STRIP_TAC \\
5170     REWRITE_TAC [GSYM expectation_def] \\
5171     FIRST_X_ASSUM MATCH_MP_TAC >> art [])
5172 >> BETA_TAC >> Rewr'
5173 >> `B SUBSET (J CROSS J)` by ASM_SET_TAC []
5174 >> `FINITE (J CROSS J)` by PROVE_TAC [FINITE_CROSS]
5175 >> `FINITE B` by PROVE_TAC [SUBSET_FINITE]
5176 >> Suff `SIGMA (\i. expectation p (\x. (X (FST i) x - expectation p (X (FST i))) *
5177                                        (X (SND i) x - expectation p (X (SND i))))) B =
5178          SIGMA (\i. 0) B`
5179 >- (Rewr' >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_ZERO >> art [])
5180 (* final step: applying EXTREAL_SUM_IMAGE_EQ *)
5181 >> irule EXTREAL_SUM_IMAGE_EQ
5182 >> ASM_SIMP_TAC std_ss [extreal_of_num_def, extreal_not_infty]
5183 >> Suff `!x. x IN B ==>
5184             (expectation p (\x'. (X (FST x) x' - expectation p (X (FST x))) *
5185                                  (X (SND x) x' - expectation p (X (SND x)))) = 0)`
5186 >- (RW_TAC std_ss [extreal_of_num_def, extreal_not_infty])
5187 >> Q.X_GEN_TAC `n` >> Cases_on `n`
5188 >> Q.UNABBREV_TAC `B` >> RW_TAC std_ss [GSPECIFICATION]
5189 >> Cases_on `x` >> FULL_SIMP_TAC std_ss []
5190 >> MATCH_MP_TAC uncorrelated_thm
5191 >> PROVE_TAC []
5192QED
5193
5194(******************************************************************************)
5195(*  Almost sure convergence; Borel-Cantelli Lemma [2, p.75]                   *)
5196(******************************************************************************)
5197
5198Theorem INDICATOR_FN_REAL_RV:
5199    !p s. prob_space p /\ s IN events p ==> real_random_variable (indicator_fn s) p
5200Proof
5201    RW_TAC std_ss [real_random_variable, INDICATOR_FN_NOT_INFTY]
5202 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR
5203 >> Q.EXISTS_TAC `s`
5204 >> RW_TAC std_ss [subsets_def, space_def]
5205 >> fs [prob_space_def, measure_space_def, p_space_def, events_def]
5206QED
5207
5208Theorem EVENTS_LIMSUP:
5209    !p E. prob_space p /\ (!n. E n IN events p) ==> limsup E IN events p
5210Proof
5211 (* proof *)
5212    RW_TAC std_ss [prob_space_def, measure_space_def, events_def, set_limsup_def]
5213 >> IMP_RES_TAC SIGMA_ALGEBRA_FN_BIGINTER
5214 >> fs [space_def, subsets_def, IN_FUNSET, IN_UNIV]
5215 >> POP_ASSUM MATCH_MP_TAC
5216 >> GEN_TAC >> BETA_TAC
5217 >> fs [sigma_algebra_def, space_def, subsets_def]
5218 >> FIRST_X_ASSUM MATCH_MP_TAC
5219 >> RW_TAC std_ss [tail_countable, SUBSET_DEF, GSPECIFICATION]
5220 >> ASM_REWRITE_TAC []
5221QED
5222
5223Theorem EVENTS_LIMINF:
5224    !p E. prob_space p /\ (!n. E n IN events p) ==> liminf E IN events p
5225Proof
5226 (* proof *)
5227    RW_TAC std_ss [prob_space_def, measure_space_def, events_def, set_liminf_def]
5228 >> STRIP_ASSUME_TAC
5229      (REWRITE_RULE [ASSUME ``sigma_algebra (m_space p,measurable_sets p)``, subsets_def]
5230                    (Q.SPEC `(m_space p,measurable_sets p)` SIGMA_ALGEBRA_ALT))
5231 >> POP_ASSUM MATCH_MP_TAC
5232 >> RW_TAC std_ss [IN_FUNSET, IN_UNIV]
5233 >> Know `{E n | m <= n} <> {}` >- METIS_TAC [tail_not_empty]
5234 >> Know `countable {E n | m <= n}` >- METIS_TAC [tail_countable]
5235 >> RW_TAC std_ss [COUNTABLE_ENUM] >> art []
5236 >> IMP_RES_TAC SIGMA_ALGEBRA_FN_BIGINTER
5237 >> fs [space_def, subsets_def, IN_FUNSET, IN_UNIV]
5238 >> POP_ASSUM MATCH_MP_TAC
5239 >> Q.PAT_X_ASSUM `{E n | m <= n} = IMAGE f univ(:num)` (MP_TAC o (MATCH_MP EQ_SYM))
5240 >> RW_TAC std_ss [Once EXTENSION, IN_IMAGE, IN_UNIV, GSPECIFICATION]
5241 >> POP_ASSUM (STRIP_ASSUME_TAC o (Q.SPEC `f (x :num)`))
5242 >> Know `?x'. f x = f x'` >- (Q.EXISTS_TAC `x` >> REWRITE_TAC [])
5243 >> RW_TAC std_ss []
5244 >> PROVE_TAC []
5245QED
5246
5247Theorem PROB_LIMSUP:
5248    !p E. prob_space p /\ (!n. E n IN events p) ==>
5249         (prob p (limsup E) = inf (IMAGE (\m. prob p (BIGUNION {E n | m <= n})) UNIV))
5250Proof
5251    RW_TAC std_ss [prob_space_def, p_space_def, events_def, prob_def]
5252 >> MATCH_MP_TAC measure_limsup_finite >> art [extreal_of_num_def, lt_infty]
5253QED
5254
5255Theorem PROB_LIMINF:
5256    !p E. prob_space p /\ (!n. E n IN events p) ==>
5257         (prob p (liminf E) = sup (IMAGE (\m. prob p (BIGINTER {E n | m <= n})) UNIV))
5258Proof
5259    RW_TAC std_ss [prob_space_def, p_space_def, events_def, prob_def]
5260 >> MATCH_MP_TAC measure_liminf >> art []
5261QED
5262
5263Theorem expectation_indicator:
5264    !p s. prob_space p /\ s IN events p ==> (expectation p (indicator_fn s) = prob p s)
5265Proof
5266    RW_TAC std_ss [prob_space_def, events_def, expectation_def, prob_def]
5267 >> MATCH_MP_TAC integral_indicator >> art []
5268QED
5269
5270(* The "easy" part of Borel-Cantelli Lemma
5271
5272   The following proof is taken from Theorem 24.9 of [9, p.296], which depends on
5273   Beppo Levi's monotone convergence theorem, IN_limsup and a collorary from Marokv
5274   inequality.
5275
5276   Its usual "simple" proofs [2, p.77] [3, p.35] [4, p.308] [6, p.59] all
5277   require Bool's inequality for p.m.'s, and the convergence (to zero) of the
5278   remainders of `suminf (prob p o E)`, which the latter part is not easy to
5279   formalize as is.
5280 *)
5281Theorem Borel_Cantelli_Lemma1 :
5282    !p E. prob_space p /\ (!n. E n IN events p) /\
5283          suminf (prob p o E) < PosInf ==> (prob p (limsup E) = 0)
5284Proof
5285    RW_TAC std_ss [o_DEF]
5286 >> Know `limsup E = {x | x IN m_space p /\ (suminf (\n. indicator_fn (E n) x) = PosInf)}`
5287 >- (MATCH_MP_TAC (((REWRITE_RULE [space_def, subsets_def]) o
5288                    (Q.SPECL [`(m_space p,measurable_sets p)`, `E`]))
5289                       limsup_suminf_indicator_space) \\
5290     fs [prob_space_def, measure_space_def, events_def]) >> Rewr'
5291 >> Q.PAT_X_ASSUM `suminf (\x. prob p (E x)) < PosInf` MP_TAC
5292 >> Know `!x. prob p (E x) = integral p (indicator_fn (E x))`
5293 >- (GEN_TAC >> MATCH_MP_TAC EQ_SYM \\
5294     MATCH_MP_TAC (REWRITE_RULE [expectation_def] expectation_indicator) >> art [])
5295 >> Rewr'
5296 >> Know `!x. integral p (indicator_fn (E x)) = pos_fn_integral p (indicator_fn (E x))`
5297 >- (GEN_TAC >> MATCH_MP_TAC integral_pos_fn \\
5298     fs [prob_space_def, INDICATOR_FN_POS]) >> Rewr'
5299 >> Know `!x. pos_fn_integral p (indicator_fn (E x)) =
5300              pos_fn_integral p ((indicator_fn o E) x)`
5301 >- RW_TAC std_ss [o_DEF] >> Rewr'
5302 >> FULL_SIMP_TAC bool_ss [prob_space_def, events_def, p_space_def, prob_def]
5303 >> `sigma_algebra (m_space p,measurable_sets p)` by PROVE_TAC [measure_space_def]
5304 (* applying "pos_fn_integral_suminf" *)
5305 >> Know `suminf (\x. pos_fn_integral p ((indicator_fn o E) x)) =
5306          pos_fn_integral p (\x. suminf (\i. (indicator_fn o E) i x))`
5307 >- (MATCH_MP_TAC EQ_SYM \\
5308     MATCH_MP_TAC pos_fn_integral_suminf >> RW_TAC std_ss [INDICATOR_FN_POS] \\
5309     MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR \\
5310     Q.EXISTS_TAC `E i` >> art [subsets_def, space_def])
5311 >> Rewr'
5312 >> RW_TAC std_ss [o_DEF]
5313 >> Know `integrable p (\x. suminf (\i. indicator_fn (E i) x))`
5314 >- (RW_TAC std_ss [integrable_def, lt_infty] >| (* 3 subgoals *)
5315     [ (* goal 1 (of 3) *)
5316       MATCH_MP_TAC IN_MEASURABLE_BOREL_SUMINF >> BETA_TAC \\
5317       Q.EXISTS_TAC `indicator_fn o E` \\
5318       ASM_SIMP_TAC std_ss [o_DEF, space_def, INDICATOR_FN_POS] \\
5319       GEN_TAC >> MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR \\
5320       Q.EXISTS_TAC `E n` >> ASM_SIMP_TAC std_ss [subsets_def, space_def],
5321       (* goal 2 (of 3) *)
5322       Know `fn_plus (\x. suminf (\i. indicator_fn (E i) x)) =
5323                     (\x. suminf (\i. indicator_fn (E i) x))`
5324       >- (MATCH_MP_TAC FN_PLUS_POS_ID >> GEN_TAC >> BETA_TAC \\
5325           MATCH_MP_TAC ext_suminf_pos >> RW_TAC std_ss [INDICATOR_FN_POS]) \\
5326       DISCH_THEN (art o wrap),
5327       (* goal 3 (of 3) *)
5328       Know `fn_minus (\x. suminf (\i. indicator_fn (E i) x)) = (\x. 0)`
5329       >- (MATCH_MP_TAC FN_MINUS_POS_ZERO >> GEN_TAC >> BETA_TAC \\
5330           MATCH_MP_TAC ext_suminf_pos >> RW_TAC std_ss [INDICATOR_FN_POS]) \\
5331       Rewr' \\
5332      `pos_fn_integral p (\x. 0) = 0` by PROVE_TAC [pos_fn_integral_zero] >> POP_ORW \\
5333       REWRITE_TAC [lt_infty, extreal_of_num_def] ])
5334 >> DISCH_TAC
5335 >> Know `pos_fn_integral p (\x. suminf (\i. indicator_fn (E i) x)) =
5336                 integral p (\x. suminf (\i. indicator_fn (E i) x))`
5337 >- (MATCH_MP_TAC EQ_SYM \\
5338     MATCH_MP_TAC integral_pos_fn >> RW_TAC std_ss [] \\
5339     MATCH_MP_TAC ext_suminf_pos >> RW_TAC std_ss [INDICATOR_FN_POS])
5340 >> DISCH_THEN (fs o wrap)
5341 >> IMP_RES_TAC integrable_infty_null >> fs [null_set_def]
5342QED
5343
5344Theorem finite_second_moments_indicator_fn:
5345    !p s. prob_space p /\ s IN events p ==> finite_second_moments p (indicator_fn s)
5346Proof
5347    rpt STRIP_TAC
5348 >> Know `finite_second_moments p (indicator_fn s) <=>
5349          second_moment p (indicator_fn s) 0 < PosInf`
5350 >- (MATCH_MP_TAC finite_second_moments_alt >> art [] \\
5351     MATCH_MP_TAC INDICATOR_FN_REAL_RV >> art []) >> Rewr'
5352 >> fs [second_moment_def, moment_def, sub_rzero]
5353 >> Know `expectation p (\x. (indicator_fn s x) pow 2) = expectation p (indicator_fn s)`
5354 >- (fs [prob_space_def, p_space_def, expectation_def, events_def] \\
5355     MATCH_MP_TAC integral_indicator_pow_eq >> ASM_SIMP_TAC arith_ss []) >> Rewr'
5356 >> Know `expectation p (indicator_fn s) = prob p s`
5357 >- (MATCH_MP_TAC expectation_indicator >> art []) >> Rewr'
5358 >> MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `1`
5359 >> METIS_TAC [PROB_LE_1, extreal_of_num_def, lt_infty]
5360QED
5361
5362Theorem variance_eq_indicator_fn :
5363    !p s. prob_space p /\ s IN events p ==>
5364         (variance p (indicator_fn s) =
5365          expectation p (indicator_fn s) - (expectation p (indicator_fn s)) pow 2)
5366Proof
5367    rpt STRIP_TAC
5368 >> Suff `variance p (indicator_fn s) =
5369          expectation p (\x. (indicator_fn s x) pow 2) - (expectation p (indicator_fn s)) pow 2`
5370 >- (Know `expectation p (\x. (indicator_fn s x) pow 2) = expectation p (indicator_fn s)`
5371     >- (fs [prob_space_def, p_space_def, expectation_def, events_def] \\
5372         MATCH_MP_TAC integral_indicator_pow_eq >> ASM_SIMP_TAC arith_ss []) >> Rewr)
5373 >> MATCH_MP_TAC variance_eq >> art []
5374 >> STRONG_CONJ_TAC
5375 >- (MATCH_MP_TAC INDICATOR_FN_REAL_RV >> art []) >> DISCH_TAC
5376 >> Know `integrable p (\x. (indicator_fn s x) pow 2) <=> finite_second_moments p (indicator_fn s)`
5377 >- (MATCH_MP_TAC EQ_SYM \\
5378     MATCH_MP_TAC finite_second_moments_eq_integrable_square >> art []) >> Rewr'
5379 >> MATCH_MP_TAC finite_second_moments_indicator_fn >> art []
5380QED
5381
5382Theorem variance_le_indicator_fn :
5383    !p s. prob_space p /\ s IN events p ==>
5384          variance p (indicator_fn s) <= expectation p (indicator_fn s)
5385Proof
5386    rpt STRIP_TAC
5387 >> Suff `variance p (indicator_fn s) <= expectation p (\x. (indicator_fn s x) pow 2)`
5388 >- (Know `expectation p (\x. (indicator_fn s x) pow 2) = expectation p (indicator_fn s)`
5389     >- (fs [prob_space_def, p_space_def, expectation_def, events_def] \\
5390         MATCH_MP_TAC integral_indicator_pow_eq >> ASM_SIMP_TAC arith_ss []) >> Rewr)
5391 >> MATCH_MP_TAC variance_le >> art []
5392 >> STRONG_CONJ_TAC
5393 >- (MATCH_MP_TAC INDICATOR_FN_REAL_RV >> art []) >> DISCH_TAC
5394 >> Know `integrable p (\x. (indicator_fn s x) pow 2) <=> finite_second_moments p (indicator_fn s)`
5395 >- (MATCH_MP_TAC EQ_SYM \\
5396     MATCH_MP_TAC finite_second_moments_eq_integrable_square >> art []) >> Rewr'
5397 >> MATCH_MP_TAC finite_second_moments_indicator_fn >> art []
5398QED
5399
5400(* for indicator_fn r.v.'s, pairwise independence implies additive of variances *)
5401Theorem variance_sum_indicator_fn :
5402    !p E J. prob_space p /\ (!n. n IN J ==> (E n) IN events p) /\
5403            pairwise_indep_events p E J /\ FINITE J ==>
5404           (variance p (\x. SIGMA (\n. (indicator_fn o E) n x) J) =
5405            SIGMA (\n. variance p ((indicator_fn o E) n)) J)
5406Proof
5407    RW_TAC bool_ss [pairwise_indep_events_def]
5408 >> MATCH_MP_TAC variance_sum
5409 >> RW_TAC std_ss [o_DEF, uncorrelated_vars_def, uncorrelated_def,
5410                   finite_second_moments_indicator_fn, INDICATOR_FN_REAL_RV]
5411 >> REWRITE_TAC [GSYM INDICATOR_FN_INTER]
5412 >> `E i INTER E j IN events p` by PROVE_TAC [EVENTS_INTER]
5413 >> ASM_SIMP_TAC std_ss [expectation_indicator] >> fs [indep_def]
5414QED
5415
5416(* The harder part of Borel-Cantelli Lemma (of pairwise independence) *)
5417Theorem Borel_Cantelli_Lemma2p :
5418    !p E. prob_space p /\ (!n. (E n) IN events p) /\
5419          pairwise_indep_events p E univ(:num) /\
5420         (suminf (prob p o E) = PosInf) ==> (prob p (limsup E) = 1)
5421Proof
5422    RW_TAC std_ss [pairwise_indep_events_def, IN_UNIV]
5423 >> Q.ABBREV_TAC `X = indicator_fn o E`
5424 >> Know `!n. real_random_variable (X n) p`
5425 >- (GEN_TAC >> Q.UNABBREV_TAC `X` >> SIMP_TAC std_ss [o_DEF] \\
5426     MATCH_MP_TAC INDICATOR_FN_REAL_RV >> art []) >> DISCH_TAC
5427 >> Know `!n. (prob p o E) n = expectation p (X n)`
5428 >- (Q.UNABBREV_TAC `X` \\
5429     RW_TAC std_ss [o_DEF] >> MATCH_MP_TAC EQ_SYM \\
5430     MATCH_MP_TAC expectation_indicator >> art []) >> DISCH_TAC
5431 (* this result can be also derived directly from independence (for any events) *)
5432 >> Know `!i j. i <> j ==> (expectation p (\x. (X i) x * (X j) x) =
5433                            expectation p (X i) * expectation p (X j))`
5434 >- (Q.UNABBREV_TAC `X` >> RW_TAC std_ss [o_DEF] \\
5435     REWRITE_TAC [GSYM INDICATOR_FN_INTER] \\
5436    `E i INTER E j IN events p` by PROVE_TAC [EVENTS_INTER] \\
5437     ASM_SIMP_TAC std_ss [expectation_indicator] >> fs [indep_def]) >> DISCH_TAC
5438 (* X n is uncorrelated *)
5439 >> Know `!i j. i <> j ==> uncorrelated p (X i) (X j)`
5440 >- (Q.UNABBREV_TAC `X` >> RW_TAC std_ss [uncorrelated_def] \\ (* 2 subgoals *)
5441     MATCH_MP_TAC finite_second_moments_indicator_fn >> art []) >> DISCH_TAC
5442 (* S is the partial sums of X, always finite *)
5443 >> Q.ABBREV_TAC `S = \n s. SIGMA (\i. X i s) (count n)`
5444 >> Know `!n x. S n x <> PosInf /\ S n x <> NegInf`
5445 >- (rpt GEN_TAC >> Q.UNABBREV_TAC `S` >> BETA_TAC \\
5446     Q.UNABBREV_TAC `X` >> RW_TAC std_ss [o_DEF] >| (* 2 subgoals, similar tactics *)
5447     [ (* goal 1 (of 2) *)
5448       MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> RW_TAC std_ss [FINITE_COUNT, IN_COUNT] \\
5449       PROVE_TAC [INDICATOR_FN_NOT_INFTY],
5450       (* goal 2 (of 2) *)
5451       MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> RW_TAC std_ss [FINITE_COUNT, IN_COUNT] \\
5452       PROVE_TAC [INDICATOR_FN_NOT_INFTY] ]) >> DISCH_TAC
5453 (* S is Borel-measurable (needed later) *)
5454 >> Know `!n. S n IN measurable (p_space p,events p) Borel`
5455 >- (GEN_TAC >> Q.UNABBREV_TAC `S` \\
5456     MATCH_MP_TAC (INST_TYPE [``:'b`` |-> ``:num``] IN_MEASURABLE_BOREL_SUM) \\
5457     BETA_TAC >> Q.EXISTS_TAC `X` >> Q.EXISTS_TAC `count n` \\
5458     fs [measure_space_def, real_random_variable] \\
5459     RW_TAC std_ss [space_def, FINITE_COUNT, IN_COUNT] \\
5460     fs [prob_space_def, p_space_def, events_def, measure_space_def]) >> DISCH_TAC
5461 (* M is the mean of S, also always finite *)
5462 >> Q.ABBREV_TAC `M = \n. expectation p (S n)`
5463 >> Know `!n. M n = SIGMA (prob p o E) (count n)`
5464 >- (GEN_TAC >> Q.UNABBREV_TAC `M` >> BETA_TAC \\
5465     Q.UNABBREV_TAC `S` >> BETA_TAC \\
5466     Q.UNABBREV_TAC `X` >> BETA_TAC \\
5467     REWRITE_TAC [expectation_def] \\
5468  (* applying integral_pos_fn, pos_fn_integral_sum *)
5469     Know `integral p (\s. SIGMA (\i. (indicator_fn o E) i s) (count n)) =
5470    pos_fn_integral p (\s. SIGMA (\i. (indicator_fn o E) i s) (count n))`
5471     >- (MATCH_MP_TAC integral_pos_fn >> fs [o_DEF, prob_space_def] \\
5472         rpt STRIP_TAC >> MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS \\
5473         RW_TAC std_ss [FINITE_COUNT, INDICATOR_FN_POS]) >> Rewr' \\
5474     Know `(prob p o E) = \x. expectation p ((indicator_fn o E) x)`
5475     >- RW_TAC std_ss [o_DEF, FUN_EQ_THM] >> Rewr' \\
5476     Know `!x. expectation p ((indicator_fn o E) x) = pos_fn_integral p ((indicator_fn o E) x)`
5477     >- (RW_TAC std_ss [o_DEF, expectation_def] \\
5478         MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, INDICATOR_FN_POS]) >> Rewr' \\
5479     MATCH_MP_TAC pos_fn_integral_sum \\
5480     fs [o_DEF, FINITE_COUNT, prob_space_def, INDICATOR_FN_POS, IN_COUNT] \\
5481     rpt STRIP_TAC >> MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR \\
5482     Q.EXISTS_TAC `E i` >> fs [measure_space_def, subsets_def, events_def, space_def])
5483 >> DISCH_TAC
5484 >> Know `!n. M n <> PosInf /\ M n <> NegInf`
5485 >- (GEN_TAC >> POP_ASSUM (ONCE_REWRITE_TAC o wrap) \\
5486     Q.PAT_X_ASSUM `!n. (prob p o E) n = expectation p (X n)` K_TAC \\
5487     STRIP_TAC >| (* 2 subgoals, similar tactics *)
5488     [ (* goal 1 (of 2) *)
5489       MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> RW_TAC std_ss [FINITE_COUNT, IN_COUNT, o_DEF] \\
5490       PROVE_TAC [PROB_FINITE],
5491       (* goal 2 (of 2) *)
5492       MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> RW_TAC std_ss [FINITE_COUNT, IN_COUNT, o_DEF] \\
5493       PROVE_TAC [PROB_FINITE] ]) >> DISCH_TAC
5494 >> Know `!n. 0 <= M n`
5495 >- (GEN_TAC >> art [] \\
5496     MATCH_MP_TAC EXTREAL_SUM_IMAGE_POS \\
5497     Q.PAT_X_ASSUM `!n. (prob p o E) n = P` K_TAC \\
5498     RW_TAC std_ss [o_DEF, FINITE_COUNT, IN_COUNT] \\
5499     MATCH_MP_TAC PROB_POSITIVE >> art []) >> DISCH_TAC
5500 >> Know `!m n. m <= n ==> M m <= M n`
5501 >- (rpt STRIP_TAC \\
5502     Q.PAT_X_ASSUM `!n. M n = SIGMA (prob p o E) (count n)` (REWRITE_TAC o wrap) \\
5503     MATCH_MP_TAC EXTREAL_SUM_IMAGE_MONO_SET \\
5504     Q.PAT_X_ASSUM `!n. (prob p o E) n = expectation p (X n)` K_TAC \\
5505     RW_TAC std_ss [FINITE_COUNT, COUNT_MONO, IN_COUNT, o_DEF] \\
5506     MATCH_MP_TAC PROB_POSITIVE >> art []) >> DISCH_TAC
5507 (* Step 1: variance of S is smaller than M, by noncorrelation *)
5508 >> Know `!n. variance p (S n) <= M n`
5509 >- (GEN_TAC >> Q.UNABBREV_TAC `S` >> Q.UNABBREV_TAC `X` >> BETA_TAC \\
5510     Know `variance p (\s. SIGMA (\i. (indicator_fn o E) i s) (count n)) =
5511           SIGMA (\n. variance p ((indicator_fn o E) n)) (count n)`
5512     >- (MATCH_MP_TAC variance_sum_indicator_fn \\
5513         ASM_SIMP_TAC std_ss [pairwise_indep_events_def, FINITE_COUNT]) >> Rewr' \\
5514     Q.PAT_X_ASSUM `!n. M n = SIGMA (prob p o E) (count n)` (REWRITE_TAC o wrap) \\
5515     irule EXTREAL_SUM_IMAGE_MONO >> RW_TAC bool_ss [IN_COUNT, FINITE_COUNT]
5516     >- (SIMP_TAC std_ss [o_DEF] \\
5517         MATCH_MP_TAC variance_le_indicator_fn >> art []) \\
5518     DISJ2_TAC >> GEN_TAC >> DISCH_TAC \\
5519    `x <> n` by RW_TAC arith_ss [] \\
5520     Q.PAT_X_ASSUM `!i j. i <> j ==> uncorrelated p ((indicator_fn o E) i) ((indicator_fn o E) j)`
5521       (MP_TAC o (PURE_REWRITE_RULE [uncorrelated_def]) o (Q.SPECL [`x`, `n`])) \\
5522     RW_TAC bool_ss [] >| (* 2 subgoals *)
5523     [ METIS_TAC [lt_infty, finite_second_moments_eq_finite_variance],
5524       METIS_TAC [finite_second_moments_imp_finite_expectation] ]) >> DISCH_TAC
5525 >> Know `!n. real_random_variable (S n) p`
5526 >- (RW_TAC std_ss [real_random_variable]) >> DISCH_TAC
5527 >> Know `!n. finite_second_moments p (S n)`
5528 >- (RW_TAC std_ss [finite_second_moments_eq_finite_variance] \\
5529     MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `M n` >> art [GSYM lt_infty]) >> DISCH_TAC
5530 (* Now rewriting the goal, eliminating `limsup` *)
5531 >> `limsup E IN events p` by PROVE_TAC [EVENTS_LIMSUP]
5532 >> Know `limsup E = {x | x IN p_space p /\ (suminf (\n. X n x) = PosInf)}`
5533 >- (Q.UNABBREV_TAC `X` >> SIMP_TAC std_ss [o_DEF] \\
5534     MATCH_MP_TAC (((REWRITE_RULE [space_def, subsets_def]) o
5535                    (Q.SPECL [`(p_space p,events p)`, `E`])) limsup_suminf_indicator_space) \\
5536     fs [prob_space_def, measure_space_def, p_space_def, events_def]) >> DISCH_TAC
5537 >> Q.ABBREV_TAC `S' = \x. sup (IMAGE (\n. S n x) univ(:num))`
5538 >> Know `!n x. S n x <= S' x`
5539 >- (rpt GEN_TAC >> Q.UNABBREV_TAC `S'` \\
5540     RW_TAC std_ss [le_sup', IN_IMAGE, IN_UNIV] \\
5541     POP_ASSUM MATCH_MP_TAC >> Q.EXISTS_TAC `n` >> REWRITE_TAC []) >> DISCH_TAC
5542 >> Know `!x. suminf (\n. X n x) = S' x`
5543 >- (GEN_TAC >> Q.UNABBREV_TAC `S'` >> Q.UNABBREV_TAC `S` >> BETA_TAC \\
5544     MATCH_MP_TAC ext_suminf_def \\
5545     Q.UNABBREV_TAC `X` >> RW_TAC std_ss [INDICATOR_FN_POS])
5546 >> DISCH_TAC >> fs []
5547 (* S' is also Borel-measurable (needed later) *)
5548 >> Know `S' IN measurable (p_space p,events p) Borel`
5549 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_SUMINF >> Q.EXISTS_TAC `X` \\
5550     fs [real_random_variable, space_def] \\
5551     CONJ_TAC >- fs [prob_space_def, measure_space_def, p_space_def, events_def] \\
5552     Q.UNABBREV_TAC `X` >> RW_TAC std_ss [o_DEF, INDICATOR_FN_POS]) >> DISCH_TAC
5553 (* prob p {x | x IN p_space p /\ S' x = PosInf} = 1 *)
5554 >> Q.ABBREV_TAC `s = {x | x IN p_space p /\ S' x < PosInf}`
5555 >> Know `limsup E = (p_space p) DIFF s`
5556 >- (Q.UNABBREV_TAC `s` >> art [] >> RW_TAC std_ss [Once EXTENSION, IN_DIFF, GSPECIFICATION] \\
5557     EQ_TAC >> RW_TAC std_ss [GSYM lt_infty]) >> DISCH_TAC
5558 >> Know `s IN events p`
5559 >- (`s = (p_space p) DIFF (limsup E)` by ASM_SET_TAC [] >> POP_ORW \\
5560     MATCH_MP_TAC EVENTS_COMPL >> METIS_TAC []) >> DISCH_TAC
5561 >> Suff `prob p s = 0`
5562 >- (DISCH_TAC >> `1 = 1 - prob p s` by METIS_TAC [sub_rzero] >> POP_ORW \\
5563    `{x | x IN p_space p /\ (S' x = PosInf)} = (p_space p) DIFF s` by METIS_TAC [] \\
5564     POP_ORW >> MATCH_MP_TAC PROB_COMPL >> art [])
5565 >> Q.UNABBREV_TAC `s`
5566 >> Know `sup (IMAGE (\n. M n) univ(:num)) = PosInf`
5567 >- (Q.PAT_X_ASSUM `!n. M n = P` (ONCE_REWRITE_TAC o wrap) \\
5568     Suff `suminf (prob p o E) =
5569           sup (IMAGE (\n. SIGMA (prob p o E) (count n)) univ(:num))` >- rw [] \\
5570     MATCH_MP_TAC ext_suminf_def \\
5571     GEN_TAC >> SIMP_TAC std_ss [o_DEF] \\
5572     MATCH_MP_TAC PROB_POSITIVE >> art [])
5573 >> REWRITE_TAC [ETA_THM] >> DISCH_TAC
5574 (* M n can be larger than any given positive real *)
5575 >> Know `!e. 0 < e /\ e <> PosInf ==> ?m. e <= M m`
5576 >- (Q.PAT_X_ASSUM `!n. M n = P` K_TAC >> RW_TAC std_ss [] \\
5577     CCONTR_TAC >> fs [GSYM extreal_lt_def] \\
5578     Know `sup (IMAGE M UNIV) <= e`
5579     >- (RW_TAC std_ss [sup_le', IN_IMAGE, IN_UNIV] \\
5580         MATCH_MP_TAC lt_imp_le >> art []) >> DISCH_TAC \\
5581     Know `sup (IMAGE M UNIV) < PosInf`
5582     >- (MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `e` >> art [GSYM lt_infty]) \\
5583     RW_TAC std_ss [GSYM lt_infty]) >> DISCH_TAC
5584 (* Step 2: P {S' x <= (1 / 2) * M n} <= 4 * inv (M n) *)
5585 >> Know `!n. {x | x IN p_space p /\ S' x <= (1 / 2) * M n} IN events p`
5586 >- (GEN_TAC >> Q.PAT_X_ASSUM `!n. M n = P` K_TAC \\
5587     Know `{x | x IN p_space p /\ S' x <= (1 / 2) * M n} =
5588           PREIMAGE S' {x | x <= (1 / 2) * M n} INTER space (p_space p,events p)`
5589     >- (RW_TAC std_ss [Once EXTENSION, PREIMAGE_def, IN_INTER, space_def, GSPECIFICATION] \\
5590         METIS_TAC []) >> Rewr' \\
5591     fs [IN_MEASURABLE, space_def, subsets_def] >> FIRST_X_ASSUM irule \\
5592     REWRITE_TAC [BOREL_MEASURABLE_SETS_RC]) >> DISCH_TAC
5593 >> Know `!n. 0 < M n ==>
5594              prob p {x | x IN p_space p /\ S' x <= (1 / 2) * M n} <= 4 * inv (M n)`
5595 >- (rpt STRIP_TAC >> MATCH_MP_TAC le_trans \\
5596     Q.EXISTS_TAC `prob p {x | x IN p_space p /\ S n x <= (1 / 2) * M n}` \\
5597     CONJ_TAC
5598     >- (MATCH_MP_TAC PROB_INCREASING >> CONJ_TAC >- art [] \\
5599         REWRITE_TAC [CONJ_ASSOC] >> reverse CONJ_TAC
5600         >- (RW_TAC std_ss [SUBSET_DEF, GSPECIFICATION] \\
5601             MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `S' x` >> art []) \\
5602         Q.PAT_X_ASSUM `!n. M n = P` K_TAC \\
5603         CONJ_TAC >- art [] \\
5604         Know `{x | x IN p_space p /\ S n x <= (1 / 2) * M n} =
5605               PREIMAGE (S n) {x | x <= (1 / 2) * M n} INTER space (p_space p,events p)`
5606         >- (RW_TAC std_ss [Once EXTENSION, PREIMAGE_def, IN_INTER, space_def, GSPECIFICATION] \\
5607             METIS_TAC []) >> Rewr' \\
5608         fs [IN_MEASURABLE, space_def, subsets_def] \\
5609         Q.PAT_X_ASSUM `!n. S n IN (p_space p -> space Borel) /\ P`
5610             (STRIP_ASSUME_TAC o (Q.SPEC `n`)) >> POP_ASSUM MATCH_MP_TAC \\
5611         REWRITE_TAC [BOREL_MEASURABLE_SETS_RC]) \\
5612     Know `!x. S n x <= (1 / 2) * M n <=> S n x - M n <= -(1 / 2) * M n`
5613     >- (GEN_TAC \\
5614         Suff `(1 / 2) * M n = -(1 / 2) * M n + 1 * M n`
5615         >- (Rewr' >> MATCH_MP_TAC EQ_SYM >> REWRITE_TAC [mul_lone] \\
5616             MATCH_MP_TAC sub_le_eq >> art []) \\
5617         Suff `1 / 2 = -(1 / 2) + 1`
5618         >- (DISCH_THEN ((GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites) o wrap) \\
5619            `?r. M n = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5620             MATCH_MP_TAC add_rdistrib_normal \\
5621             RW_TAC real_ss [extreal_of_num_def, extreal_not_infty, extreal_div_eq,
5622                             extreal_ainv_def]) \\
5623         RW_TAC real_ss [extreal_of_num_def, extreal_not_infty, extreal_div_eq, extreal_ainv_def,
5624                         extreal_add_def, extreal_11]) >> DISCH_TAC \\
5625     Q.PAT_ASSUM `!x. S n x <= (1 / 2) * M n <=> P` (ONCE_REWRITE_TAC o wrap) \\
5626     MATCH_MP_TAC le_trans \\
5627     Q.EXISTS_TAC `prob p {x | x IN p_space p /\ (1 / 2) * M n <= abs (S n x - M n)}` \\
5628     CONJ_TAC
5629     >- (MATCH_MP_TAC PROB_INCREASING >> CONJ_TAC >- art [] \\
5630         Q.PAT_X_ASSUM `!n. M n = P` K_TAC \\
5631         REWRITE_TAC [CONJ_ASSOC] >> reverse CONJ_TAC
5632         >- (Know `0 <= (1 / 2) * M n` >- (MATCH_MP_TAC le_mul >> art [half_between]) \\
5633             RW_TAC std_ss [SUBSET_DEF, GSPECIFICATION, abs_unbounds] \\
5634             DISJ1_TAC >> art [GSYM mul_lneg]) \\
5635         STRIP_TAC >| (* 2 subgoals, similar tactics *)
5636         [ (* goal 1 (of 2) *)
5637           POP_ASSUM (ONCE_REWRITE_TAC o wrap o GSYM) \\
5638           Know `{x | x IN p_space p /\ S n x <= (1 / 2) * M n} =
5639                 PREIMAGE (S n) {x | x <= (1 / 2) * M n} INTER space (p_space p,events p)`
5640           >- (RW_TAC std_ss [Once EXTENSION, PREIMAGE_def, IN_INTER, space_def, GSPECIFICATION] \\
5641               METIS_TAC []) >> Rewr' \\
5642           fs [IN_MEASURABLE, space_def, subsets_def] \\
5643           Q.PAT_X_ASSUM `!n. S n IN (p_space p -> space Borel) /\ P`
5644             (STRIP_ASSUME_TAC o (Q.SPEC `n`)) >> POP_ASSUM MATCH_MP_TAC \\
5645           REWRITE_TAC [BOREL_MEASURABLE_SETS_RC],
5646           (* goal 2 (of 2) *)
5647           Know `0 <= (1 / 2) * M n` >- (MATCH_MP_TAC le_mul >> art [half_between]) \\
5648           DISCH_THEN (MP_TAC o (MATCH_MP abs_unbounds)) >> Rewr' \\
5649           REWRITE_TAC [GSYM mul_lneg] \\
5650           POP_ASSUM (ONCE_REWRITE_TAC o wrap o GSYM) \\
5651           Know `!x. 1 / 2 * M n <= S n x - M n <=> (1 / 2 + 1) * M n <= S n x`
5652           >- (GEN_TAC \\
5653               Suff `(1 / 2 + 1) * M n = (1 / 2) * M n + 1 * M n`
5654               >- (Rewr' >> REWRITE_TAC [mul_lone] \\
5655                   MATCH_MP_TAC le_sub_eq2 >> art [] \\
5656                   SIMP_TAC real_ss [extreal_of_num_def, extreal_div_eq] \\
5657                  `0 <= 1 / 2r` by RW_TAC real_ss [] \\
5658                   METIS_TAC [mul_not_infty]) \\
5659              `?r. M n = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5660               MATCH_MP_TAC add_rdistrib_normal \\
5661               RW_TAC real_ss [extreal_of_num_def, extreal_not_infty, extreal_div_eq,
5662                               extreal_ainv_def]) >> Rewr' \\
5663           Know `{x | x IN p_space p /\ (S n x <= 1 / 2 * M n \/ (1 / 2 + 1) * M n <= S n x)} =
5664                 (PREIMAGE (S n) {x | x <= (1 / 2) * M n} INTER space (p_space p,events p)) UNION
5665                 (PREIMAGE (S n) {x | (1 / 2 + 1) * M n <= x} INTER space (p_space p,events p))`
5666           >- (RW_TAC std_ss [Once EXTENSION, PREIMAGE_def, IN_UNION, IN_INTER,
5667                              space_def, GSPECIFICATION] \\
5668               METIS_TAC []) >> Rewr' \\
5669           MATCH_MP_TAC EVENTS_UNION \\
5670           fs [IN_MEASURABLE, space_def, subsets_def] \\
5671           Q.PAT_X_ASSUM `!n. S n IN (p_space p -> space Borel) /\ P`
5672             (STRIP_ASSUME_TAC o (Q.SPEC `n`)) \\
5673           STRIP_TAC >| (* 2 subgoals *)
5674           [ (* goal 2.1 (of 2) *)
5675             POP_ASSUM MATCH_MP_TAC >> REWRITE_TAC [BOREL_MEASURABLE_SETS_RC],
5676             (* goal 2.2 (of 2) *)
5677             POP_ASSUM MATCH_MP_TAC >> REWRITE_TAC [BOREL_MEASURABLE_SETS_CR] ] ]) \\
5678  (* applying chebyshev_ineq_variance *)
5679     Know `!x. S n x - M n = S n x - expectation p (S n)`
5680     >- (GEN_TAC >> Q.UNABBREV_TAC `M` >> SIMP_TAC std_ss []) >> Rewr' \\
5681     MATCH_MP_TAC le_trans \\
5682     Q.EXISTS_TAC `inv ((1 / 2 * M n) pow 2) * variance p (S n)` \\
5683     Q.PAT_X_ASSUM `!n. M n = P` K_TAC \\
5684     CONJ_TAC
5685     >- (SIMP_TAC std_ss [PROB_GSPEC] \\
5686         MATCH_MP_TAC chebyshev_ineq_variance >> art [] \\
5687         MATCH_MP_TAC lt_mul >> art [half_between]) \\
5688     Suff `4 * inv (M n) = inv ((1 / 2 * M n) pow 2) * M n`
5689     >- (Rewr' >> MATCH_MP_TAC le_lmul_imp >> art [] \\
5690         MATCH_MP_TAC le_inv >> MATCH_MP_TAC pow_pos_lt \\
5691         MATCH_MP_TAC lt_mul >> art [half_between]) \\
5692    `?r. M n = Normal r` by PROVE_TAC [extreal_cases] >> art [] \\
5693    `0 < r` by PROVE_TAC [extreal_lt_eq, extreal_of_num_def] \\
5694    `r <> 0` by PROVE_TAC [REAL_LT_LE] \\
5695     Know `1 / 2 * r * (1 / 2 * r) <> 0` >- (CCONTR_TAC >> fs []) >> DISCH_TAC \\
5696     ASM_SIMP_TAC real_ss [extreal_of_num_def, extreal_inv_def, extreal_mul_def, pow_2,
5697                           extreal_div_eq, extreal_11] \\
5698     ASM_SIMP_TAC real_ss [GSYM REAL_INV_1OVER, REAL_MUL_ASSOC] \\
5699    `inv 2r <> 0` by RW_TAC real_ss [REAL_INV_EQ_0] \\
5700     Know `inv 2 * r <> 0` >- (CCONTR_TAC >> fs [] >> PROVE_TAC []) >> DISCH_TAC \\
5701     Know `inv 2 * r * inv 2 <> 0` >- (CCONTR_TAC >> fs [] >> PROVE_TAC []) >> DISCH_TAC \\
5702     ASM_SIMP_TAC real_ss [REAL_INV_MUL, REAL_INV_INV] \\
5703     ASM_SIMP_TAC real_ss [GSYM REAL_MUL_ASSOC, REAL_MUL_LINV] >> REAL_ARITH_TAC)
5704 >> DISCH_TAC
5705 >> Q.ABBREV_TAC `f = \n. {x | x IN p_space p /\ S' x <= 1 / 2 * M n}` >> fs []
5706 >> Know `!m n. m <= n ==> f m SUBSET f n`
5707 >- (Q.PAT_X_ASSUM `!n. M n = P` K_TAC \\
5708     Q.UNABBREV_TAC `f` >> RW_TAC bool_ss [SUBSET_DEF, GSPECIFICATION] \\
5709     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `(1 / 2) * M m` >> art [] \\
5710     MATCH_MP_TAC le_lmul_imp >> ASM_SIMP_TAC arith_ss [half_between]) >> DISCH_TAC
5711 (* Step 3: P {S' x < PosInf} = sup (IMAGE (prob p o f) UNIV) *)
5712 >> Know `prob p {x | x IN p_space p /\ S' x < PosInf} = sup (IMAGE (prob p o f) univ(:num))`
5713 >- (REWRITE_TAC [prob_def] >> MATCH_MP_TAC EQ_SYM \\
5714     MATCH_MP_TAC MONOTONE_CONVERGENCE \\
5715     CONJ_TAC >- fs [prob_space_def] \\
5716     CONJ_TAC >- fs [events_def, IN_FUNSET, IN_UNIV] \\
5717     CONJ_TAC >- ASM_SIMP_TAC arith_ss [] \\
5718     Q.PAT_X_ASSUM `!n. M n = P` K_TAC >> Q.UNABBREV_TAC `f` \\
5719     RW_TAC std_ss [Once EXTENSION, GSPECIFICATION, IN_BIGUNION_IMAGE, IN_UNIV] \\
5720     reverse EQ_TAC >> rpt STRIP_TAC >- art [] >| (* 2 subgoals left *)
5721     [ (* goal 1 (of 2) *)
5722       MATCH_MP_TAC let_trans >> Q.EXISTS_TAC `(1 / 2) * M n` >> art [GSYM lt_infty] \\
5723      `?r. M n = Normal r` by PROVE_TAC [extreal_cases] >> POP_ORW \\
5724       SIMP_TAC real_ss [extreal_div_eq, extreal_of_num_def, extreal_mul_def, extreal_not_infty],
5725       (* goal 2 (of 2) *)
5726       Know `2 * (S' x) < 2 * PosInf`
5727       >- (Know `0 < 2 /\ 2 <> PosInf`
5728           >- PROVE_TAC [lt_02, extreal_of_num_def, extreal_not_infty] \\
5729           DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP lt_lmul)) >> art []) \\
5730       Know `2 * PosInf = PosInf`
5731       >- (SIMP_TAC real_ss [extreal_of_num_def, extreal_mul_def]) >> Rewr' \\
5732       Q.PAT_X_ASSUM `sup (IMAGE M univ(:num)) = PosInf` (REWRITE_TAC o wrap o SYM) \\
5733       RW_TAC std_ss [GSYM sup_lt', IN_IMAGE, IN_UNIV] \\
5734       Q.EXISTS_TAC `x''` >> MATCH_MP_TAC lt_imp_le \\
5735       Suff `S' x = (1 / 2) * 2 * S' x`
5736       >- (Rewr' >> REWRITE_TAC [GSYM mul_assoc] \\
5737           Know `0 < (1 / 2) /\ (1 / 2) <> PosInf`
5738           >- (REWRITE_TAC [half_between] \\
5739               SIMP_TAC real_ss [extreal_of_num_def, extreal_div_eq, extreal_not_infty]) \\
5740           DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP lt_lmul)) >> art []) \\
5741       Know `1 / 2 = extreal_inv 2`
5742       >- (MATCH_MP_TAC (GSYM inv_1over) \\
5743           SIMP_TAC real_ss [extreal_of_num_def, extreal_11]) >> Rewr' \\
5744       Know `extreal_inv 2 * 2 = 1`
5745       >- (MATCH_MP_TAC mul_linv_pos \\
5746           SIMP_TAC real_ss [lt_02, extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
5747       REWRITE_TAC [mul_lone] ]) >> Rewr'
5748 >> REWRITE_TAC [GSYM le_antisym]
5749 >> reverse CONJ_TAC
5750 >- (MATCH_MP_TAC le_sup_imp2 >> RW_TAC std_ss [o_DEF, IN_IMAGE, IN_UNIV] \\
5751     MATCH_MP_TAC PROB_POSITIVE >> art [])
5752 (* Step 4: sup (IMAGE (prob p o f) univ(:num)) <= 0 *)
5753 >> MATCH_MP_TAC le_epsilon >> RW_TAC std_ss [add_lzero]
5754 >> Know `!m n. m <= n ==> (prob p o f) m <= (prob p o f) n`
5755 >- (RW_TAC std_ss [o_DEF] >> MATCH_MP_TAC PROB_INCREASING >> art [] \\
5756     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
5757 >> Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> P` (MP_TAC o (Q.SPEC `4 * inv e`))
5758 >> Know `0 < 4 * inv e /\ 4 * inv e <> PosInf`
5759 >- (CONJ_TAC
5760     >- (MATCH_MP_TAC lt_mul \\
5761         CONJ_TAC >- RW_TAC real_ss [extreal_of_num_def, extreal_lt_eq] \\
5762         MATCH_MP_TAC inv_pos' >> art []) \\
5763    `e <> NegInf` by PROVE_TAC [pos_not_neginf, lt_imp_le] \\
5764    `?r. e = Normal r` by PROVE_TAC [extreal_cases] >> art [] \\
5765    `0 < r` by PROVE_TAC [extreal_of_num_def, extreal_lt_eq] \\
5766    `r <> 0` by PROVE_TAC [REAL_LT_LE] \\
5767     ASM_SIMP_TAC std_ss [extreal_of_num_def, extreal_inv_def, extreal_mul_def, extreal_not_infty])
5768 >> Q.PAT_X_ASSUM `!n. M n = P` K_TAC
5769 >> RW_TAC std_ss []
5770 >> Know `0 < M m` >- (MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC `4 * inv e` >> art [])
5771 >> DISCH_TAC
5772 >> Know `(prob p o f) m <= 4 * inv (M m)`
5773 >- (SIMP_TAC std_ss [o_DEF] \\
5774     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
5775 >> Know `4 * inv e * e <= M m * e`
5776 >- (MATCH_MP_TAC le_rmul_imp >> art [] \\
5777     MATCH_MP_TAC lt_imp_le >> art [])
5778 >> REWRITE_TAC [GSYM mul_assoc]
5779 >> Know `inv e * e = 1`
5780 >- (MATCH_MP_TAC mul_linv_pos >> art []) >> Rewr'
5781 >> REWRITE_TAC [mul_rone] >> DISCH_TAC
5782 >> Know `inv (M m) * 4 <= inv (M m) * (M m * e)`
5783 >- (MATCH_MP_TAC le_lmul_imp >> art [] \\
5784     MATCH_MP_TAC lt_imp_le >> MATCH_MP_TAC inv_pos' >> art [])
5785 >> REWRITE_TAC [mul_assoc]
5786 >> Know `inv (M m) * M m = 1`
5787 >- (MATCH_MP_TAC mul_linv_pos >> art []) >> Rewr'
5788 >> REWRITE_TAC [mul_lone, Once mul_comm] >> DISCH_TAC
5789 >> Know `!n. m <= n ==> (prob p o f) n <= e`
5790 >- (RW_TAC std_ss [] \\
5791     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `4 * inv (M n)` \\
5792     Know `0 < M n`
5793     >- (MATCH_MP_TAC lte_trans >> Q.EXISTS_TAC `M m` >> art [] \\
5794         FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
5795     RW_TAC std_ss [] \\
5796     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC `4 * inv (M m)` >> art [] \\
5797     MATCH_MP_TAC le_lmul_imp \\
5798     CONJ_TAC >- RW_TAC real_ss [extreal_of_num_def, extreal_le_eq] \\
5799     METIS_TAC [inv_le_antimono]) >> DISCH_TAC
5800 >> Know `sup (IMAGE (prob p o f) UNIV) = sup (IMAGE (\n. (prob p o f) (n + m)) UNIV)`
5801 >- (MATCH_MP_TAC EQ_SYM \\
5802     MATCH_MP_TAC sup_shift >> RW_TAC std_ss []) >> Rewr'
5803 >> RW_TAC bool_ss [sup_le', IN_IMAGE, IN_UNIV]
5804 >> POP_ASSUM MATCH_MP_TAC
5805 >> RW_TAC arith_ss []
5806QED
5807
5808(* The hardest part of Borel-Cantelli Lemma (of full independency)
5809
5810   TODO: prove it directly without using Borel_Cantelli_Lemma2p
5811 *)
5812Theorem Borel_Cantelli_Lemma2 :
5813    !p E. prob_space p /\ (!n. (E n) IN events p) /\
5814          indep_events p E univ(:num) /\
5815         (suminf (prob p o E) = PosInf) ==> (prob p (limsup E) = 1)
5816Proof
5817    rpt STRIP_TAC
5818 >> MATCH_MP_TAC Borel_Cantelli_Lemma2p >> art []
5819 >> MATCH_MP_TAC total_imp_pairwise_indep_events >> art []
5820QED
5821
5822(* An easy corollary of Borel-Cantelli Lemma [2, p.82] *)
5823Theorem Borel_0_1_Law :
5824    !p E. prob_space p /\ (!n. (E n) IN events p) /\
5825          pairwise_indep_events p E univ(:num) ==>
5826         (prob p (limsup E) = 0) \/ (prob p (limsup E) = 1)
5827Proof
5828    rpt STRIP_TAC
5829 >> Cases_on `suminf (prob p o E) = PosInf`
5830 >| [ (* goal 1 (of 2) *)
5831      DISJ2_TAC >> MATCH_MP_TAC Borel_Cantelli_Lemma2p >> art [],
5832      (* goal 2 (of 2) *)
5833      DISJ1_TAC >> MATCH_MP_TAC Borel_Cantelli_Lemma1 \\
5834      fs [GSYM lt_infty, pairwise_indep_events_def] ]
5835QED
5836
5837(* ========================================================================= *)
5838(* Convergence Concepts and The Law(s) of Large Numbers (uncorrelated_rv)    *)
5839(* ========================================================================= *)
5840
5841(* convergence modes *)
5842Datatype:  convergence_mode = almost_everywhere   ('a p_space)
5843                                   | in_probability      ('a p_space)
5844                                   | in_lebesgue extreal ('a p_space)
5845                                   | in_distribution     ('a p_space)
5846End
5847
5848(* convergence of extreal-valued random series [1, p.68,70], only works
5849   for real-valued random variables (cf. real_random_variable_def)
5850 *)
5851Definition converge_def[nocompute] :
5852   (* X(n) converges to Y (a.e.) *)
5853   (converge (X :num -> 'a -> extreal) (Y :'a -> extreal) (almost_everywhere p) =
5854    AE x::p. ((\n. X n x) --> Y x) sequentially) /\
5855
5856   (* X(n) converges to Y (in pr.) *)
5857   (converge (X :num -> 'a -> extreal) (Y :'a -> extreal) (in_probability p) =
5858    !e. 0 < e /\ e <> PosInf ==>
5859        ((\n. prob p {x | x IN p_space p /\ e < abs (X n x - Y x)}) --> 0)
5860          sequentially) /\
5861
5862   (* X(n) converges to Y (in L^r), assuming ‘0 < r /\ r <> PosInf’ *)
5863   (converge (X :num -> 'a -> extreal) (Y :'a -> extreal) (in_lebesgue r p) <=>
5864    (!n. X n IN lp_space r p) /\ Y IN lp_space r p /\
5865    ((\n. expectation p (\x. (abs (X n x - Y x)) powr r)) --> 0) sequentially) /\
5866
5867   (* X(n) converges to Y in distribution (see [4, p.425] or [2, p.96]) *)
5868   (converge (X :num -> 'a -> extreal) (Y :'a -> extreal) (in_distribution p) =
5869    !(f :extreal -> real).
5870        f IN C_b ext_euclidean ==>
5871       ((\n. expectation p (Normal o f o (X n))) --> expectation p (Normal o f o Y))
5872        sequentially)
5873End
5874
5875(* "-->" was defined in util_probTheory for IN_DFUNSET *)
5876Overload "-->" = “converge”
5877
5878(* NOTE: see distributionTheory for supporting theorems *)
5879Theorem converge_in_dist_def = cj 4 converge_def
5880
5881(* |- !X Y p.
5882        (X --> Y) (almost_everywhere p) <=>
5883        AE x::p. ((\n. X n x) --> Y x) sequentially
5884 *)
5885Theorem converge_AE = cj 1 converge_def
5886
5887(* The old definition based on LIM_SEQUENTIALLY *)
5888Theorem converge_AE_def :
5889    !p X Y. (!n. real_random_variable (X n) p) /\ real_random_variable Y p ==>
5890            ((X --> Y) (almost_everywhere p) <=>
5891             AE x::p. ((\n. real (X n x)) --> real (Y x)) sequentially)
5892Proof
5893    rw [converge_AE, real_random_variable_def]
5894 >> HO_MATCH_MP_TAC AE_cong
5895 >> rw [GSYM p_space_def]
5896 >> HO_MATCH_MP_TAC (REWRITE_RULE [o_DEF] extreal_lim_sequentially_eq)
5897 >> rw []
5898QED
5899
5900(* |- !X Y p.
5901        (X --> Y) (in_probability p) <=>
5902        !e. 0 < e /\ e <> PosInf ==>
5903            ((\n. prob p {x | x IN p_space p /\ e < abs (X n x - Y x)}) --> 0)
5904              sequentially
5905 *)
5906Theorem converge_PR = cj 2 converge_def
5907
5908(* The old definition based on LIM_SEQUENTIALLY *)
5909Theorem converge_PR_def :
5910    !p X Y. prob_space p /\
5911           (!n. real_random_variable (X n) p) /\ real_random_variable Y p ==>
5912           ((X --> Y) (in_probability p) <=>
5913            !e. 0 < e /\ e <> PosInf ==>
5914                ((\n. real (prob p {x | x IN p_space p /\ e < abs (X n x - Y x)})) -->
5915                 0) sequentially)
5916Proof
5917    rw [converge_PR, real_random_variable_def]
5918 >> Q.ABBREV_TAC ‘f = \n x. X n x - Y x’
5919 >> Know ‘!n. (f n) IN measurable (m_space p,measurable_sets p) Borel’
5920 >- (rw [Abbr ‘f’] \\
5921     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
5922     qexistsl_tac [‘X n’, ‘Y’] \\
5923     fs [prob_space_def, p_space_def, events_def, space_def,
5924         measure_space_def, random_variable_def])
5925 >> DISCH_TAC
5926 >> Q.ABBREV_TAC ‘A = \e n. {x | x IN p_space p /\ e < abs (f n x)}’
5927 >> Know ‘!e n. A e n IN events p’
5928 >- (RW_TAC std_ss [Abbr ‘A’] \\
5929    ‘{x | x IN p_space p /\ e < abs (f n x)} =
5930        p_space p DIFF {x | x IN p_space p /\ abs (f n x) <= e}’
5931        by (RW_TAC set_ss [Once EXTENSION, GSYM extreal_lt_def] >> METIS_TAC []) >> POP_ORW \\
5932     MATCH_MP_TAC EVENTS_COMPL >> art [] \\
5933     REWRITE_TAC [abs_bounds] \\
5934    ‘{x | x IN p_space p /\ -e <= f n x /\ f n x <= e} =
5935     ({x | -e <= f n x} INTER p_space p) INTER ({x | f n x <= e} INTER p_space p)’
5936        by SET_TAC [] >> POP_ORW \\
5937     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
5938    ‘sigma_algebra (measurable_space p)’ by fs [prob_space_def, measure_space_def] \\
5939     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
5940 >> DISCH_TAC
5941 >> Q.ABBREV_TAC ‘g = \e n. prob p (A e n)’
5942 >> Know ‘!e. (\n. prob p {x | x IN p_space p /\ e < abs (X n x - Y x)}) = g e’
5943 >- rw [Abbr ‘A’, Abbr ‘g’, FUN_EQ_THM]
5944 >> Rewr'
5945 >> Know ‘!e. (\n. real (prob p {x | x IN p_space p /\ e < abs (X n x - Y x)})) = real o (g e)’
5946 >- rw [Abbr ‘A’, Abbr ‘g’, FUN_EQ_THM]
5947 >> Rewr'
5948 >> EQ_TAC >> rw []
5949 >> Q.PAT_X_ASSUM ‘!e. 0 < e /\ e <> PosInf ==> P’ (MP_TAC o (Q.SPEC ‘e’))
5950 >> RW_TAC std_ss [] (* 2 subgoals, same initial & ending tactics *)
5951 >| [ (* goal 1 (of 2) *)
5952      Suff ‘(g e --> 0) sequentially <=> (real o g e --> real 0) sequentially’
5953      >- rw [real_0],
5954      (* goal 2 (of 2) *)
5955      Suff ‘(g e --> 0) sequentially <=> (real o g e --> real 0) sequentially’
5956      >- fs [real_0] ]
5957 >> MATCH_MP_TAC extreal_lim_sequentially_eq >> rw []
5958 >> Q.EXISTS_TAC ‘0’ >> GEN_TAC >> simp [Abbr ‘g’]
5959 >> PROVE_TAC [PROB_FINITE]
5960QED
5961
5962(* |- !X Y r p.
5963        (X --> Y) (in_lebesgue r p) <=>
5964        (!n. X n IN lp_space r p) /\ Y IN lp_space r p /\
5965        ((\n. expectation p (\x. abs (X n x - Y x) powr r)) --> 0)
5966          sequentially
5967 *)
5968Theorem converge_LP = cj 3 converge_def
5969
5970Theorem converge_LP_def :
5971    !p X Y r. prob_space p /\
5972             (!n. real_random_variable (X n) p) /\ real_random_variable Y p /\
5973              0 < r /\ r <> PosInf ==>
5974       ((X --> Y) (in_lebesgue r p) <=>
5975        (!n. X n IN lp_space r p) /\ Y IN lp_space r p /\
5976        ((\n. real (expectation p (\x. (abs (X n x - Y x)) powr r))) --> 0)
5977          sequentially)
5978Proof
5979    rw [converge_LP, real_random_variable, expectation_def, prob_space_def,
5980        p_space_def, events_def]
5981 >> EQ_TAC >> rw [lp_space_alt_finite']
5982 (* 2 subgoals, same initial & ending tactics *)
5983 >> ‘(!n. X n IN lp_space r p) /\ Y IN lp_space r p’
5984      by METIS_TAC [lp_space_alt_finite']
5985 >> ‘!n. (\x. X n x - Y x) IN lp_space r p’ by METIS_TAC [lp_space_sub]
5986 >> ‘!n. integral p (\x. abs (X n x - Y x) powr r) <> PosInf’
5987      by METIS_TAC [lp_space_alt_finite']
5988 >> Q.ABBREV_TAC ‘f = (\n. integral p (\x. abs (X n x - Y x) powr r))’
5989 >> ‘(\n. real (integral p (\x. abs (X n x - Y x) powr r))) = real o f’
5990      by rw [Abbr ‘f’, FUN_EQ_THM] >> fs []
5991 >| [ Suff ‘(f --> 0) sequentially <=> (real o f --> real 0) sequentially’
5992      >- rw [real_0],
5993      Suff ‘(f --> 0) sequentially <=> (real o f --> real 0) sequentially’
5994      >- fs [real_0] ]
5995 >> MATCH_MP_TAC extreal_lim_sequentially_eq >> rw []
5996 >> Q.EXISTS_TAC ‘0’ >> rw []
5997 >> MATCH_MP_TAC pos_not_neginf
5998 >> simp [Abbr ‘f’]
5999 >> MATCH_MP_TAC integral_pos >> rw [powr_pos]
6000QED
6001
6002(* alternative definition of converge_LP based on absolute moment *)
6003Theorem converge_LP_alt_absolute_moment :
6004   !p X Y k. prob_space p /\ (!n. real_random_variable (X n) p) /\
6005             real_random_variable Y p /\ 0 < k ==>
6006       ((X --> Y) (in_lebesgue (&k :extreal) p) <=>
6007        (!n. expectation p (\x. (abs (X n x)) pow k) <> PosInf) /\
6008        (expectation p (\x. (abs (Y x)) pow k) <> PosInf) /\
6009        ((\n. real (absolute_moment p (\x. X n x - Y x) 0 k)) --> 0) sequentially)
6010Proof
6011    rpt GEN_TAC >> STRIP_TAC
6012 >> ‘0 < &k /\ &k <> PosInf’ by rw [extreal_of_num_def, extreal_lt_eq, extreal_not_infty]
6013 >> rw [converge_LP_def, absolute_moment_def, sub_rzero, num_not_infty]
6014 >> fs [prob_space_def, p_space_def, events_def, real_random_variable]
6015 >> rw [lp_space_alt_finite', expectation_def]
6016 >> Know `!Z. 0 < k ==> abs Z powr &k = abs Z pow k`
6017 >- (rpt STRIP_TAC >> MATCH_MP_TAC EQ_SYM \\
6018     MATCH_MP_TAC gen_powr >> REWRITE_TAC [abs_pos])
6019 >> DISCH_TAC
6020 >> EQ_TAC >> rw []
6021QED
6022
6023(* alternative definition of converge_LP using `pow k` explicitly;
6024   |- !p X Y k.
6025        prob_space p /\ (!n. real_random_variable (X n) p) /\
6026        real_random_variable Y p /\ 0 < k ==>
6027        ((X --> Y) (in_lebesgue (&k) p) <=>
6028         (!n. expectation p (\x. abs (X n x) pow k) <> PosInf) /\
6029         expectation p (\x. abs (Y x) pow k) <> PosInf /\
6030         ((\n. real (expectation p (\x. abs (X n x - Y x) pow k))) --> 0)
6031           sequentially)
6032 *)
6033Theorem converge_LP_alt_pow =
6034        SIMP_RULE std_ss [absolute_moment_def, sub_rzero]
6035                  converge_LP_alt_absolute_moment
6036
6037(* Theorem 4.1.1 [1, p.69] (2) *)
6038Theorem converge_AE_alt_sup :
6039    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6040            real_random_variable Y p ==>
6041       ((X --> Y) (almost_everywhere p) <=>
6042        !e. 0 < e /\ e <> PosInf ==>
6043            (sup (IMAGE (\m. prob p {x | x IN p_space p /\
6044                                         !n. m <= n ==> abs (X n x - Y x) <= e})
6045                        univ(:num)) = 1))
6046Proof
6047    RW_TAC std_ss [converge_AE_def]
6048 >> fs [real_random_variable_def]
6049 >> Q.ABBREV_TAC
6050     `A = \m e. BIGINTER
6051                  (IMAGE (\n. {x | x IN p_space p /\ abs (X n x - Y x) <= e}) (from m))`
6052 >> Q.ABBREV_TAC
6053     `E = \m e. {x | x IN p_space p /\ !n. m <= n ==> abs (X n x - Y x) <= e}`
6054 >> Know `!m e. {x | x IN p_space p /\
6055                     !n. m <= n ==> abs (X n x - Y x) <= e} = E m e`
6056 >- METIS_TAC [] >> Rewr'
6057 >> Know `!m e. E m e = A m e`
6058 >- (RW_TAC set_ss [Abbr `E`, Abbr `A`, Once EXTENSION, IN_BIGINTER_IMAGE, IN_FROM] \\
6059     EQ_TAC >> RW_TAC std_ss [] \\
6060     POP_ASSUM (STRIP_ASSUME_TAC o
6061                 (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) >> Rewr'
6062 >> ‘sigma_algebra (measurable_space p)’
6063      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6064 >> Know `!e n. {x | x IN p_space p /\ abs (X n x - Y x) <= e} IN events p`
6065 >- (RW_TAC std_ss [abs_bounds] \\
6066     Q.ABBREV_TAC `f = \x. X n x - Y x` \\
6067    `f IN measurable (m_space p,measurable_sets p) Borel`
6068       by (Q.UNABBREV_TAC `f` \\
6069           MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
6070           qexistsl_tac [`X n`, `Y`] \\
6071           fs [prob_space_def, p_space_def, events_def, space_def,
6072               measure_space_def, random_variable_def]) \\
6073     Know `{x | x IN p_space p /\ -e <= X n x - Y x /\ X n x - Y x <= e} =
6074           ({x | -e <= f x} INTER p_space p) INTER ({x | f x <= e} INTER p_space p)`
6075     >- (Q.UNABBREV_TAC `f` >> BETA_TAC >> SET_TAC []) >> Rewr' \\
6076     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6077     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6078 >> Know `!m e. A m e IN events p`
6079 >- (RW_TAC std_ss [Abbr `A`] \\
6080     MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [COUNTABLE_FROM, FROM_NOT_EMPTY] \\
6081     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_FROM] \\
6082     METIS_TAC []) >> DISCH_TAC
6083 >> Q.UNABBREV_TAC `E`
6084 >> Know `!e. BIGUNION (IMAGE (\m. A m e) univ(:num)) IN events p`
6085 >- (GEN_TAC \\
6086     MATCH_MP_TAC EVENTS_COUNTABLE_UNION >> art [] \\
6087     reverse CONJ_TAC
6088     >- (MATCH_MP_TAC image_countable >> REWRITE_TAC [COUNTABLE_NUM]) \\
6089     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] >> PROVE_TAC []) >> DISCH_TAC
6090 >> Know `!m e. A m e SUBSET A (SUC m) e`
6091 >- (RW_TAC set_ss [Abbr `A`, SUBSET_DEF, IN_BIGINTER_IMAGE, IN_FROM]
6092     >- (Q.PAT_X_ASSUM `!n. m <= n ==> P`
6093          (STRIP_ASSUME_TAC o (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) \\
6094    `m <= n` by RW_TAC arith_ss [] >> METIS_TAC []) >> DISCH_TAC
6095 (* Part I: AE ==> (liminf = 1) *)
6096 >> EQ_TAC
6097 >- (RW_TAC std_ss [AE_DEF, null_set_def, LIM_SEQUENTIALLY, dist] \\
6098     Know `!x. x IN m_space p DIFF N ==> ?m. x IN (A m e)`
6099     >- (rpt STRIP_TAC \\
6100         Q.PAT_X_ASSUM `!x. x IN m_space p DIFF N ==> P` (MP_TAC o (Q.SPEC `x`)) \\
6101         RW_TAC std_ss [] \\
6102        `e <> NegInf` by METIS_TAC [pos_not_neginf, lt_imp_le] \\
6103        `?r. e = Normal r` by METIS_TAC [extreal_cases] \\
6104        `0 < r` by METIS_TAC [extreal_lt_eq, extreal_of_num_def] \\
6105         Q.PAT_X_ASSUM `!e. 0 < e ==> P` (MP_TAC o (Q.SPEC `r`)) \\
6106         RW_TAC std_ss [] \\
6107         Q.EXISTS_TAC `N'` \\
6108         RW_TAC set_ss [Abbr `A`, IN_BIGINTER_IMAGE, IN_FROM]
6109         >- METIS_TAC [DIFF_SUBSET, SUBSET_DEF, p_space_def] \\
6110         Q.PAT_X_ASSUM `!n. N' <= n ==> P` (MP_TAC o (Q.SPEC `n`)) \\
6111         RW_TAC std_ss [] \\
6112         FULL_SIMP_TAC std_ss [p_space_def] \\
6113        ‘m_space p DIFF N SUBSET m_space p’ by SET_TAC [] \\
6114        ‘x IN m_space p’ by METIS_TAC [SUBSET_DEF] \\
6115        `?a. X n x = Normal a` by METIS_TAC [extreal_cases] \\
6116        `?b. Y x = Normal b` by METIS_TAC [extreal_cases] \\
6117         MATCH_MP_TAC lt_imp_le \\
6118         FULL_SIMP_TAC std_ss [real_normal, extreal_sub_def, extreal_abs_def, extreal_lt_eq]) \\
6119     DISCH_TAC \\
6120    `(m_space p DIFF N) SUBSET BIGUNION (IMAGE (\m. A m e) univ(:num))`
6121        by (RW_TAC std_ss [SUBSET_DEF, IN_BIGUNION_IMAGE, IN_UNIV]) \\
6122     Know `sup (IMAGE (prob p o (\m. A m e)) univ(:num)) =
6123           prob p (BIGUNION (IMAGE (\m. A m e) univ(:num)))`
6124     >- (REWRITE_TAC [prob_def] \\
6125         MATCH_MP_TAC MONOTONE_CONVERGENCE \\
6126         CONJ_TAC >- fs [prob_space_def] \\
6127         RW_TAC std_ss [IN_FUNSET, IN_UNIV, GSYM events_def]) \\
6128     SIMP_TAC std_ss [o_DEF] >> DISCH_THEN K_TAC \\
6129     REWRITE_TAC [GSYM le_antisym] \\
6130     CONJ_TAC >- (MATCH_MP_TAC PROB_LE_1 >> art []) \\
6131     fs [GSYM p_space_def, GSYM events_def, GSYM prob_def] \\
6132     Know `prob p (p_space p DIFF N) = 1 - prob p N`
6133     >- (MATCH_MP_TAC PROB_COMPL >> art []) >> art [sub_rzero] \\
6134     DISCH_THEN (ONCE_REWRITE_TAC o wrap o (MATCH_MP EQ_SYM)) \\
6135     MATCH_MP_TAC PROB_INCREASING >> art [] \\
6136     MATCH_MP_TAC EVENTS_COMPL >> PROVE_TAC [EVENTS_SPACE])
6137 (* Part II: (liminf = 1) ==> AE *)
6138 >> RW_TAC std_ss [AE_DEF, null_set_def, LIM_SEQUENTIALLY, dist]
6139 >> Q.ABBREV_TAC `B = \e. BIGUNION (IMAGE (\m. A m e) univ(:num))`
6140 >> Know `!e. 0 < e /\ e <> PosInf ==> (prob p (B e) = 1)`
6141 >- (RW_TAC std_ss [Abbr `B`] \\
6142     Suff `sup (IMAGE (prob p o (\m. A m e)) univ(:num)) =
6143           prob p (BIGUNION (IMAGE (\m. A m e) univ(:num)))` >- METIS_TAC [] \\
6144     REWRITE_TAC [prob_def] \\
6145     MATCH_MP_TAC MONOTONE_CONVERGENCE \\
6146     CONJ_TAC >- fs [prob_space_def] \\
6147     RW_TAC std_ss [IN_FUNSET, IN_UNIV, GSYM events_def])
6148 >> Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> P` K_TAC
6149 >> DISCH_TAC
6150 >> Q.ABBREV_TAC `C = BIGINTER (IMAGE (\n. B (1 / &SUC n)) univ(:num))`
6151 >> Know `C IN events p`
6152 >- (Q.UNABBREV_TAC `C` \\
6153     MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [COUNTABLE_NUM] \\
6154     reverse CONJ_TAC >- (SET_TAC []) \\
6155     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] \\
6156     Q.UNABBREV_TAC `B` >> METIS_TAC [])
6157 >> DISCH_TAC
6158 >> Know `prob p C = 1`
6159 >- (Q.UNABBREV_TAC `C` >> REWRITE_TAC [prob_def] \\
6160    `measure p (BIGINTER (IMAGE (\n. B (1 / &SUC n)) univ(:num))) =
6161      inf (IMAGE (measure p o (\n. B (1 / &SUC n))) univ(:num))`
6162     by (MATCH_MP_TAC EQ_SYM \\
6163         MATCH_MP_TAC MONOTONE_CONVERGENCE_BIGINTER \\
6164         ASM_SIMP_TAC std_ss [] \\
6165         CONJ_TAC >- fs [prob_space_def] \\
6166         STRONG_CONJ_TAC
6167         >- RW_TAC std_ss [IN_FUNSET, IN_UNIV, Abbr `B`, GSYM events_def] \\
6168         RW_TAC std_ss [IN_FUNSET, IN_UNIV, GSYM events_def, GSYM prob_def]
6169         >- METIS_TAC [PROB_FINITE] \\
6170         RW_TAC std_ss [Abbr `B`, SUBSET_DEF, IN_BIGUNION_IMAGE, IN_UNIV] \\
6171         Q.EXISTS_TAC `m` >> POP_ASSUM MP_TAC \\
6172         NTAC 6 (POP_ASSUM K_TAC) \\ (* up to Abbrev A *)
6173         RW_TAC set_ss [Abbr `A`, IN_BIGINTER_IMAGE, IN_FROM]
6174         >- (Q.PAT_X_ASSUM `!n'. m <= n' ==> x IN p_space p /\ _`
6175               (STRIP_ASSUME_TAC o (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) \\
6176         rename1 `m <= N` \\
6177         Q.PAT_X_ASSUM `!n'. m <= n' ==> x IN p_space p /\ _`
6178           (MP_TAC o (Q.SPEC `N`)) >> RW_TAC std_ss [] \\
6179         fs [abs_bounds] \\
6180        `(&SUC n) :real <> 0` by RW_TAC real_ss [] \\
6181        `(&SUC (SUC n)) :real <> 0` by RW_TAC real_ss [] \\
6182         CONJ_TAC >| (* 2 subgoals *)
6183         [ (* goal 1 (of 2) *)
6184           MATCH_MP_TAC le_trans \\
6185           Q.EXISTS_TAC `-(1 / &SUC (SUC n))` >> art [] \\
6186           rw [extreal_of_num_def, extreal_div_eq, extreal_ainv_def,
6187               extreal_le_eq] \\
6188           rw [GSYM REAL_INV_1OVER],
6189           (* goal 2 (of 2) *)
6190           MATCH_MP_TAC le_trans \\
6191           Q.EXISTS_TAC `1 / &SUC (SUC n)` >> art [] \\
6192           rw [extreal_of_num_def, extreal_div_eq, extreal_ainv_def, extreal_le_eq] \\
6193           rw [GSYM REAL_INV_1OVER]
6194         ]) >> POP_ORW \\
6195     REWRITE_TAC [GSYM prob_def] \\
6196     Suff `IMAGE (prob p o (\n. B (1 / &SUC n))) univ(:num) = (\y. y = 1)`
6197     >- (Rewr' >> REWRITE_TAC [inf_const]) \\
6198     RW_TAC std_ss [Once EXTENSION, IN_IMAGE, IN_UNIV] \\
6199     SIMP_TAC std_ss [IN_APP] \\
6200     EQ_TAC >> RW_TAC std_ss []
6201     >- (FIRST_X_ASSUM MATCH_MP_TAC \\
6202        `(&SUC x') :real <> 0` by RW_TAC real_ss [] \\
6203         rw [extreal_of_num_def, extreal_div_eq, extreal_lt_eq, extreal_not_infty] \\
6204         MATCH_MP_TAC REAL_LT_DIV >> RW_TAC real_ss []) \\
6205     Q.EXISTS_TAC `0` (* any number is fine *) \\
6206     MATCH_MP_TAC EQ_SYM \\
6207     FIRST_X_ASSUM MATCH_MP_TAC \\
6208    `(&SUC 0) :real <> 0` by RW_TAC real_ss [] \\
6209     rw [extreal_of_num_def, extreal_div_eq, extreal_lt_eq, extreal_not_infty])
6210 >> DISCH_TAC
6211 >> Q.EXISTS_TAC `p_space p DIFF C`
6212 >> REWRITE_TAC [GSYM CONJ_ASSOC, GSYM events_def, GSYM prob_def, GSYM p_space_def]
6213 >> STRONG_CONJ_TAC
6214 >- (MATCH_MP_TAC EVENTS_COMPL >> art []) >> DISCH_TAC
6215 >> CONJ_TAC
6216 >- (Know `prob p (p_space p DIFF C) = 1 - prob p C`
6217     >- (MATCH_MP_TAC PROB_COMPL >> art []) >> Rewr' >> art [] \\
6218     MATCH_MP_TAC sub_refl >> rw [extreal_of_num_def])
6219 >> rw [] (* p_space p DIFF (p_space p DIFF C) is simplified *)
6220 >> Q.PAT_X_ASSUM `x IN C` MP_TAC
6221 >> Q.PAT_X_ASSUM `C IN events p` K_TAC
6222 >> Q.PAT_X_ASSUM `prob p C = 1` K_TAC
6223 >> Q.PAT_X_ASSUM `p_space p DIFF C IN events p` K_TAC
6224 >> Q.UNABBREV_TAC `C`
6225 >> RW_TAC std_ss [IN_BIGINTER_IMAGE, IN_UNIV]
6226 >> Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> _` K_TAC
6227 >> Q.UNABBREV_TAC `B` >> fs []
6228 >> MP_TAC (Q.SPEC `e` REAL_ARCH_INV_SUC) >> RW_TAC std_ss []
6229 >> Q.PAT_X_ASSUM `!n. ?s. x IN s /\ P` (STRIP_ASSUME_TAC o (Q.SPEC `n`))
6230 >> Q.PAT_X_ASSUM `x IN s` MP_TAC >> POP_ORW
6231 >> Q.PAT_X_ASSUM `!m e. A m e SUBSET A (SUC m) e` K_TAC
6232 >> Q.PAT_X_ASSUM `!e. BIGUNION (IMAGE (\m. A m e) UNIV) IN events p` K_TAC
6233 >> Q.PAT_X_ASSUM `!m e. A m e IN events p` K_TAC
6234 >> Q.UNABBREV_TAC `A`
6235 >> RW_TAC set_ss [IN_BIGINTER_IMAGE, IN_FROM]
6236 >> Q.EXISTS_TAC `m`
6237 >> RW_TAC std_ss []
6238 >> MATCH_MP_TAC REAL_LET_TRANS
6239 >> Q.EXISTS_TAC `inv (&SUC n)` >> art []
6240 >> rename1 `m <= N`
6241 >> Q.PAT_X_ASSUM `!n'. m <= n' ==> P` (MP_TAC o (Q.SPEC `N`))
6242 >> RW_TAC std_ss []
6243 >> `?a. X N x = Normal a` by METIS_TAC [extreal_cases]
6244 >> `?b. Y x = Normal b` by METIS_TAC [extreal_cases]
6245 >> `(&SUC n) :real <> 0` by RW_TAC real_ss []
6246 >> fs [real_normal, extreal_sub_def, extreal_abs_def, extreal_inv_eq,
6247        extreal_of_num_def, extreal_div_eq, extreal_le_eq, real_div]
6248QED
6249
6250(* Theorem 4.1.1 [1, p.69] (2') *)
6251Theorem converge_AE_alt_inf :
6252    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6253            real_random_variable Y p ==>
6254       ((X --> Y) (almost_everywhere p) <=>
6255        !e. 0 < e /\ e <> PosInf ==>
6256            (inf (IMAGE (\m. prob p {x | x IN p_space p /\
6257                                         ?n. m <= n /\ e < abs (X n x - Y x)})
6258                        univ(:num)) = 0))
6259Proof
6260    rpt STRIP_TAC
6261 >> MP_TAC (Q.SPECL [`p`, `X`, `Y`] converge_AE_alt_sup)
6262 >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6263 >> Q.ABBREV_TAC
6264     `E = \m e. {x | x IN p_space p /\ !n. m <= n ==> abs (X n x - Y x) <= e}`
6265 >> `!m e. {x | x IN p_space p /\
6266                     !n. m <= n ==> abs (X n x - Y x) <= e} = E m e`
6267      by METIS_TAC [] >> POP_ORW
6268 >> Know `!m e. {x | x IN p_space p /\ ?n. m <= n /\ e < abs (X n x - Y x)} =
6269                p_space p DIFF (E m e)`
6270 >- (RW_TAC set_ss [Abbr `E`, Once EXTENSION] \\
6271     EQ_TAC >> RW_TAC std_ss [GSYM extreal_lt_def] \\
6272     Q.EXISTS_TAC `n` >> art []) >> Rewr'
6273 >> Q.ABBREV_TAC
6274     `A = \m e. BIGINTER
6275                  (IMAGE (\n. {x | x IN p_space p /\ abs (X n x - Y x) <= e}) (from m))`
6276 >> Know `!m e. E m e = A m e`
6277 >- (RW_TAC set_ss [Abbr `E`, Abbr `A`, Once EXTENSION, IN_BIGINTER_IMAGE, IN_FROM] \\
6278     EQ_TAC >> RW_TAC std_ss [] \\
6279     POP_ASSUM (STRIP_ASSUME_TAC o
6280                 (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) >> Rewr'
6281 >> ‘sigma_algebra (measurable_space p)’
6282      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6283 >> fs [real_random_variable_def]
6284 >> Know `!e n. {x | x IN p_space p /\ abs (X n x - Y x) <= e} IN events p`
6285 >- (RW_TAC std_ss [abs_bounds] \\
6286     Q.ABBREV_TAC `f = \x. X n x - Y x` \\
6287    `f IN measurable (m_space p,measurable_sets p) Borel`
6288       by (Q.UNABBREV_TAC `f` \\
6289           MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
6290           qexistsl_tac [`X n`, `Y`] \\
6291           fs [prob_space_def, p_space_def, events_def, space_def,
6292               measure_space_def, random_variable_def]) \\
6293     Know `{x | x IN p_space p /\ -e <= X n x - Y x /\ X n x - Y x <= e} =
6294           ({x | -e <= f x} INTER p_space p) INTER ({x | f x <= e} INTER p_space p)`
6295     >- (Q.UNABBREV_TAC `f` >> BETA_TAC >> SET_TAC []) >> Rewr' \\
6296     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6297     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6298 >> Know `!m e. A m e IN events p`
6299 >- (RW_TAC std_ss [Abbr `A`] \\
6300     MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [COUNTABLE_FROM, FROM_NOT_EMPTY] \\
6301     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_FROM] \\
6302     METIS_TAC []) >> DISCH_TAC
6303 >> Q.UNABBREV_TAC `E`
6304 >> Know `!e. BIGUNION (IMAGE (\m. A m e) univ(:num)) IN events p`
6305 >- (GEN_TAC >> MATCH_MP_TAC EVENTS_COUNTABLE_UNION >> art [] \\
6306     reverse CONJ_TAC >- (MATCH_MP_TAC image_countable >> REWRITE_TAC [COUNTABLE_NUM]) \\
6307     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] >> PROVE_TAC []) >> DISCH_TAC
6308 >> Know `!m e. A m e SUBSET A (SUC m) e`
6309 >- (RW_TAC set_ss [Abbr `A`, SUBSET_DEF, IN_BIGINTER_IMAGE, IN_FROM]
6310     >- (Q.PAT_X_ASSUM `!n. m <= n ==> P`
6311          (STRIP_ASSUME_TAC o (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) \\
6312    `m <= n` by RW_TAC arith_ss [] >> METIS_TAC []) >> DISCH_TAC
6313 >> Q.PAT_X_ASSUM `!e n. {x | x IN p_space p /\ P} IN events p` K_TAC
6314 >> Q.ABBREV_TAC `B = \m e. p_space p DIFF A m e`
6315 >> Know `!m e. p_space p DIFF A m e = B m e` >- METIS_TAC [] >> Rewr'
6316 >> `!m e. B m e IN events p` by METIS_TAC [EVENTS_COMPL]
6317 >> Know `!e. BIGINTER (IMAGE (\m. B m e) univ(:num)) IN events p`
6318 >- (GEN_TAC >> MATCH_MP_TAC EVENTS_COUNTABLE_INTER >> art [] \\
6319     CONJ_TAC
6320     >- (RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_UNIV] >> PROVE_TAC []) \\
6321     CONJ_TAC >- (MATCH_MP_TAC image_countable >> REWRITE_TAC [COUNTABLE_NUM]) \\
6322     RW_TAC std_ss [Once EXTENSION, NOT_IN_EMPTY, IN_IMAGE, IN_UNIV]) >> DISCH_TAC
6323 >> Know `!m e. B (SUC m) e SUBSET B m e`
6324 >- (RW_TAC set_ss [Abbr `B`, SUBSET_DEF, IN_BIGINTER_IMAGE, IN_FROM] \\
6325     ASM_SET_TAC []) >> DISCH_TAC
6326 >> Suff `!e. 0 < e /\ e <> PosInf ==>
6327            ((sup (IMAGE (\m. prob p (A m e)) univ(:num)) = 1) <=>
6328             (inf (IMAGE (\m. prob p (B m e)) univ(:num)) = 0))` >- METIS_TAC []
6329 >> rpt STRIP_TAC
6330 >> Know `sup (IMAGE (prob p o (\m. A m e)) univ(:num)) =
6331          prob p (BIGUNION (IMAGE (\m. A m e) univ(:num)))`
6332 >- (REWRITE_TAC [prob_def] \\
6333     MATCH_MP_TAC MONOTONE_CONVERGENCE \\
6334     CONJ_TAC >- fs [prob_space_def] \\
6335     RW_TAC std_ss [IN_FUNSET, IN_UNIV, GSYM events_def])
6336 >> SIMP_TAC std_ss [o_DEF] >> DISCH_THEN K_TAC
6337 >> Know `inf (IMAGE (prob p o (\m. B m e)) univ(:num)) =
6338          prob p (BIGINTER (IMAGE (\m. B m e) univ(:num)))`
6339 >- (REWRITE_TAC [prob_def] \\
6340     MATCH_MP_TAC MONOTONE_CONVERGENCE_BIGINTER \\
6341     CONJ_TAC >- fs [prob_space_def] \\
6342     RW_TAC std_ss [IN_FUNSET, IN_UNIV, GSYM events_def, GSYM prob_def] \\
6343     PROVE_TAC [PROB_FINITE])
6344 >> SIMP_TAC std_ss [o_DEF] >> DISCH_THEN K_TAC
6345 >> Know `BIGUNION (IMAGE (\m. A m e) univ(:num)) =
6346          p_space p DIFF (BIGINTER (IMAGE (\m. B m e) univ(:num)))`
6347 >- (RW_TAC std_ss [Once EXTENSION, Abbr `B`, IN_DIFF, IN_UNIV,
6348                    IN_BIGUNION_IMAGE, IN_BIGINTER_IMAGE] \\
6349     EQ_TAC >> RW_TAC std_ss [] >| (* 3 subgoals *)
6350     [ (* goal 1 (of 3) *)
6351       irule PROB_SPACE_IN_PSPACE >> art [] \\
6352       Q.EXISTS_TAC `A m e` >> art [],
6353       (* goal 2 (of 3) *)
6354       Q.EXISTS_TAC `m` >> DISJ2_TAC >> art [],
6355       (* goal 3 (of 3) *)
6356       Q.EXISTS_TAC `m` >> art [] ]) >> Rewr'
6357 >> Know `prob p (p_space p DIFF BIGINTER (IMAGE (\m. B m e) univ(:num))) =
6358          1 - prob p (BIGINTER (IMAGE (\m. B m e) univ(:num)))`
6359 >- (MATCH_MP_TAC PROB_COMPL >> art []) >> Rewr'
6360 >> `prob p (BIGINTER (IMAGE (\m. B m e) univ(:num))) <> PosInf /\
6361     prob p (BIGINTER (IMAGE (\m. B m e) univ(:num))) <> NegInf`
6362       by METIS_TAC [PROB_FINITE]
6363 >> `?r. prob p (BIGINTER (IMAGE (\m. B m e) univ(:num))) = Normal r`
6364       by METIS_TAC [extreal_cases] >> POP_ORW
6365 >> rw [extreal_of_num_def, extreal_sub_def, extreal_11]
6366 >> REAL_ARITH_TAC
6367QED
6368
6369(* Theorem 4.1.2 [1, p.70]: convergence a.e. implies convergence in pr. *)
6370Theorem converge_AE_imp_PR :
6371    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6372            real_random_variable Y p /\
6373           (X --> Y) (almost_everywhere p) ==> (X --> Y) (in_probability p)
6374Proof
6375    rpt GEN_TAC >> STRIP_TAC
6376 >> POP_ASSUM MP_TAC
6377 >> MP_TAC (Q.SPECL [`p`, `X`, `Y`] converge_AE_alt_inf)
6378 >> RW_TAC std_ss []
6379 >> Q.PAT_X_ASSUM `(X --> Y) (almost_everywhere p) <=> P` K_TAC
6380 >> RW_TAC real_ss [converge_PR_def, LIM_SEQUENTIALLY, dist]
6381 >> rename1 `0 < r`
6382 >> fs [real_random_variable_def]
6383 >> Q.ABBREV_TAC `D = \n. {x | x IN p_space p /\ e < abs (X n x - Y x)}`
6384 >> `!n. {x | x IN p_space p /\ e < abs (X n x - Y x)} = D n`
6385      by METIS_TAC [] >> POP_ORW
6386 >> Q.ABBREV_TAC `B = \m. {x | x IN p_space p /\ ?n. m <= n /\ e < abs (X n x - Y x)}`
6387 >> Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> P` (MP_TAC o (Q.SPEC `e`))
6388 >> `!m. {x | x IN p_space p /\ ?n. m <= n /\ e < abs (X n x - Y x)} = B m`
6389      by METIS_TAC [] >> POP_ORW
6390 >> RW_TAC std_ss []
6391 >> Know `!n. D n SUBSET B n`
6392 >- (RW_TAC set_ss [Abbr `D`, Abbr `B`, SUBSET_DEF] \\
6393     Q.EXISTS_TAC `n` >> art [LESS_EQ_REFL]) >> DISCH_TAC
6394 >> ‘sigma_algebra (measurable_space p)’
6395      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6396 >> Q.ABBREV_TAC `f = \n x. X n x - Y x`
6397 >> Know `!n. (f n) IN measurable (m_space p,measurable_sets p) Borel`
6398 >- (GEN_TAC >> Q.UNABBREV_TAC `f` >> BETA_TAC \\
6399     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
6400     qexistsl_tac [`X n`, `Y`] \\
6401     fs [prob_space_def, p_space_def, events_def, space_def,
6402         measure_space_def, random_variable_def]) >> DISCH_TAC
6403 >> Know `!n. D n IN events p`
6404 >- (GEN_TAC >> Q.UNABBREV_TAC `D` >> BETA_TAC \\
6405    `{x | x IN p_space p /\ e < abs (X n x - Y x)} =
6406     p_space p DIFF {x | x IN p_space p /\ abs (X n x - Y x) <= e}`
6407        by (RW_TAC set_ss [Once EXTENSION, GSYM extreal_lt_def] \\
6408            METIS_TAC []) >> POP_ORW \\
6409     MATCH_MP_TAC EVENTS_COMPL >> art [] \\
6410     RW_TAC std_ss [abs_bounds] \\
6411    `{x | x IN p_space p /\ -e <= f n x /\ f n x <= e} =
6412     ({x | -e <= f n x} INTER p_space p) INTER ({x | f n x <= e} INTER p_space p)`
6413        by SET_TAC [] >> POP_ORW \\
6414     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6415     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6416 >> `!n. 0 <= prob p (D n)` by METIS_TAC [PROB_POSITIVE]
6417 >> `!n. prob p (D n) <> PosInf /\ prob p (D n) <> NegInf` by METIS_TAC [PROB_FINITE]
6418 >> Know `!n. abs (real (prob p (D n))) = real (prob p (D n))`
6419 >- (RW_TAC std_ss [ABS_REFL] \\
6420     ASM_SIMP_TAC std_ss [GSYM extreal_le_eq, normal_real,
6421                          GSYM extreal_of_num_def]) >> Rewr'
6422 >> ASM_SIMP_TAC std_ss [GSYM extreal_lt_eq, normal_real]
6423 >> Q.ABBREV_TAC
6424     `E = \m. {x | x IN p_space p /\ !n. m <= n ==> abs (X n x - Y x) <= e}`
6425 >> Know `!m. {x | x IN p_space p /\ ?n. m <= n /\ e < abs (X n x - Y x)} =
6426              p_space p DIFF (E m)`
6427 >- (RW_TAC set_ss [Abbr `E`, Once EXTENSION] \\
6428     EQ_TAC >> RW_TAC std_ss [GSYM extreal_lt_def] \\
6429     Q.EXISTS_TAC `n` >> art [])
6430 >> DISCH_THEN (fs o wrap)
6431 >> Q.ABBREV_TAC
6432     `A = \m. BIGINTER
6433                (IMAGE (\n. {x | x IN p_space p /\ abs (X n x - Y x) <= e}) (from m))`
6434 >> Know `!m. E m = A m`
6435 >- (RW_TAC set_ss [Abbr `E`, Abbr `A`, Once EXTENSION, IN_BIGINTER_IMAGE, IN_FROM] \\
6436     EQ_TAC >> RW_TAC std_ss [] \\
6437     POP_ASSUM (STRIP_ASSUME_TAC o
6438                 (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`)))
6439 >> DISCH_THEN (fs o wrap)
6440 >> Know `!m. A m SUBSET A (SUC m)`
6441 >- (RW_TAC set_ss [Abbr `A`, SUBSET_DEF, IN_BIGINTER_IMAGE, IN_FROM]
6442     >- (Q.PAT_X_ASSUM `!n. m <= n ==> P`
6443           (STRIP_ASSUME_TAC o (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))) \\
6444    `m <= n` by RW_TAC arith_ss [] >> METIS_TAC []) >> DISCH_TAC
6445 >> Know `!m. B (SUC m) SUBSET B m`
6446 >- (RW_TAC set_ss [Abbr `B`, SUBSET_DEF, IN_BIGINTER_IMAGE, IN_FROM] \\
6447     ASM_SET_TAC []) >> DISCH_TAC
6448 >> Know `!m n. m <= n ==> B n SUBSET B m`
6449 >- (GEN_TAC >> Induct_on `n`
6450     >- (DISCH_TAC >> `m = 0` by RW_TAC arith_ss [] >> art [SUBSET_REFL]) \\
6451     DISCH_TAC \\
6452    `m = SUC n \/ m < SUC n` by RW_TAC arith_ss [] >- art [SUBSET_REFL] \\
6453    `m <= n` by RW_TAC arith_ss [] \\
6454     MATCH_MP_TAC SUBSET_TRANS >> Q.EXISTS_TAC `B n` >> art [] \\
6455     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
6456 >> Know `!n. B n IN events p`
6457 >- (GEN_TAC >> Q.UNABBREV_TAC `B` >> BETA_TAC \\
6458     MATCH_MP_TAC EVENTS_COMPL >> art [] \\
6459     Q.UNABBREV_TAC `A` >> BETA_TAC \\
6460     MATCH_MP_TAC EVENTS_BIGINTER_FN >> art [COUNTABLE_FROM, FROM_NOT_EMPTY] \\
6461     RW_TAC std_ss [SUBSET_DEF, IN_IMAGE, IN_FROM] \\
6462     rename1 `n <= m` >> REWRITE_TAC [abs_bounds] \\
6463    `{x | x IN p_space p /\ -e <= f m x /\ f m x <= e} =
6464     ({x | -e <= f m x} INTER p_space p) INTER ({x | f m x <= e} INTER p_space p)`
6465        by SET_TAC [] >> POP_ORW \\
6466     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6467     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6468 >> `!n. prob p (D n) <= prob p (B n)` by METIS_TAC [PROB_INCREASING]
6469 >> Know `inf (IMAGE (\m. prob p (B m)) univ(:num)) < Normal r`
6470 >- (ASM_SIMP_TAC std_ss [extreal_of_num_def, extreal_lt_eq])
6471 >> RW_TAC std_ss [GSYM inf_lt', IN_IMAGE, IN_UNIV]
6472 >> Q.EXISTS_TAC `m` >> rpt STRIP_TAC
6473 >> MATCH_MP_TAC let_trans
6474 >> Q.EXISTS_TAC `prob p (B n)`  >> art []
6475 >> MATCH_MP_TAC let_trans
6476 >> Q.EXISTS_TAC `prob p (B m)`  >> art []
6477 >> MATCH_MP_TAC PROB_INCREASING >> art []
6478 >> FIRST_X_ASSUM MATCH_MP_TAC   >> art []
6479QED
6480
6481(* converge_AE_alt_sup restated by liminf, cf. PROB_LIMINF *)
6482Theorem converge_AE_alt_liminf :
6483    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6484            real_random_variable Y p ==>
6485       ((X --> Y) (almost_everywhere p) <=>
6486        !e. 0 < e /\ e <> PosInf ==>
6487            prob p (liminf (\n. {x | x IN p_space p /\ abs (X n x - Y x) <= e})) = 1)
6488Proof
6489    rpt STRIP_TAC
6490 >> MP_TAC (Q.SPECL [`p`, `X`, `Y`] converge_AE_alt_sup)
6491 >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6492 >> Suff `!e. 0 < e /\ e <> PosInf ==>
6493            ((sup
6494               (IMAGE
6495                  (\m. prob p
6496                         {x |
6497                          x IN p_space p /\
6498                          !n. m <= n ==> abs (X n x - Y x) <= e}) univ(:num)) = 1) <=>
6499             (prob p (liminf (\n. {x | x IN p_space p /\ abs (X n x - Y x) <= e})) = 1))`
6500 >- METIS_TAC []
6501 >> rpt STRIP_TAC
6502 >> fs [real_random_variable_def]
6503 >> Q.ABBREV_TAC `f = \n x. X n x - Y x`
6504 >> ‘sigma_algebra (measurable_space p)’
6505      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6506 >> Know `!n. (f n) IN measurable (m_space p,measurable_sets p) Borel`
6507 >- (GEN_TAC >> Q.UNABBREV_TAC `f` >> BETA_TAC \\
6508     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
6509     qexistsl_tac [`X n`, `Y`] \\
6510     fs [prob_space_def, p_space_def, events_def, space_def,
6511         measure_space_def, random_variable_def]) >> DISCH_TAC
6512 >> Q.ABBREV_TAC `E = \n. {x | x IN p_space p /\ abs (X n x - Y x) <= e}`
6513 >> Know `!n. E n IN events p`
6514 >- (RW_TAC std_ss [Abbr `E`, abs_bounds] \\
6515    `{x | x IN p_space p /\ -e <= f n x /\ f n x <= e} =
6516     ({x | -e <= f n x} INTER p_space p) INTER ({x | f n x <= e} INTER p_space p)`
6517        by SET_TAC [] >> POP_ORW \\
6518     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6519     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6520 >> ASM_SIMP_TAC std_ss [PROB_LIMINF]
6521 >> Suff `!m. {x | x IN p_space p /\ !n. m <= n ==> abs (f n x) <= e} =
6522              (BIGINTER {E n | m <= n})` >- rw []
6523 >> GEN_TAC
6524 >> `{E n | m <= n} = (IMAGE E (from m))`
6525      by (RW_TAC set_ss [Abbr `E`, IN_FROM, Once EXTENSION]) >> POP_ORW
6526 >> RW_TAC set_ss [Abbr `E`, Abbr `f`, Once EXTENSION, IN_BIGINTER_IMAGE, IN_FROM]
6527 >> EQ_TAC >> RW_TAC std_ss []
6528 >> POP_ASSUM (STRIP_ASSUME_TAC o
6529                 (REWRITE_RULE [LESS_EQ_REFL]) o (Q.SPEC `m`))
6530QED
6531
6532(* converge_AE_alt_inf restated by limsup, cf. PROB_LIMSUP
6533
6534   Theorem 4.2.2 [1, p.77] (extended version), also see Borel_Cantelli_Lemma1.
6535 *)
6536Theorem converge_AE_alt_limsup :
6537    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6538            real_random_variable Y p ==>
6539       ((X --> Y) (almost_everywhere p) <=>
6540        !e. 0 < e /\ e <> PosInf ==>
6541            prob p (limsup (\n. {x | x IN p_space p /\ e < abs (X n x - Y x)})) = 0)
6542Proof
6543    rpt STRIP_TAC
6544 >> MP_TAC (Q.SPECL [`p`, `X`, `Y`] converge_AE_alt_inf)
6545 >> RW_TAC std_ss [] >> POP_ASSUM K_TAC
6546 >> Suff `!e. 0 < e /\ e <> PosInf ==>
6547            ((inf
6548               (IMAGE
6549                  (\m. prob p
6550                         {x |
6551                          x IN p_space p /\
6552                          ?n. m <= n /\ e < abs (X n x - Y x)}) univ(:num)) = 0) <=>
6553             (prob p (limsup (\n. {x | x IN p_space p /\ e < abs (X n x - Y x)})) = 0))`
6554 >- METIS_TAC []
6555 >> rpt STRIP_TAC
6556 >> ‘sigma_algebra (measurable_space p)’
6557      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6558 >> fs [real_random_variable_def]
6559 >> Q.ABBREV_TAC `f = \n x. X n x - Y x`
6560 >> Know `!n. (f n) IN measurable (m_space p,measurable_sets p) Borel`
6561 >- (GEN_TAC >> Q.UNABBREV_TAC `f` >> BETA_TAC \\
6562     MATCH_MP_TAC IN_MEASURABLE_BOREL_SUB \\
6563     qexistsl_tac [`X n`, `Y`] \\
6564     fs [prob_space_def, p_space_def, events_def, space_def,
6565         measure_space_def, random_variable_def]) >> DISCH_TAC
6566 >> Q.ABBREV_TAC `E = \n. {x | x IN p_space p /\ e < abs (X n x - Y x)}`
6567 >> Know `!n. E n IN events p`
6568 >- (RW_TAC std_ss [Abbr `E`] \\
6569   `{x | x IN p_space p /\ e < abs (f n x)} =
6570     p_space p DIFF {x | x IN p_space p /\ abs (f n x) <= e}`
6571        by (RW_TAC set_ss [Once EXTENSION, GSYM extreal_lt_def] \\
6572            METIS_TAC []) >> POP_ORW \\
6573     MATCH_MP_TAC EVENTS_COMPL >> art [] \\
6574     REWRITE_TAC [abs_bounds] \\
6575    `{x | x IN p_space p /\ -e <= f n x /\ f n x <= e} =
6576     ({x | -e <= f n x} INTER p_space p) INTER ({x | f n x <= e} INTER p_space p)`
6577        by SET_TAC [] >> POP_ORW \\
6578     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6579     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
6580 (* applying PROB_LIMSUP *)
6581 >> ASM_SIMP_TAC std_ss [PROB_LIMSUP]
6582 >> Suff `!m. {x | x IN p_space p /\ ?n. m <= n /\ e < abs (f n x)} =
6583              (BIGUNION {E n | m <= n})` >- rw []
6584 >> GEN_TAC
6585 >> `{E n | m <= n} = (IMAGE E (from m))`
6586      by (RW_TAC set_ss [Abbr `E`, IN_FROM, Once EXTENSION]) >> POP_ORW
6587 >> RW_TAC set_ss [Abbr `E`, Abbr `f`, Once EXTENSION, IN_BIGUNION_IMAGE, IN_FROM]
6588 >> EQ_TAC >> RW_TAC std_ss [] >- art []
6589 >> Q.EXISTS_TAC `n` >> art []
6590QED
6591
6592(* Theorem 4.2.2 [1, p.77] (original version) *)
6593Theorem converge_AE_alt_limsup' :
6594    !p X. prob_space p /\ (!n. real_random_variable (X n) p) ==>
6595         ((X --> (\x. 0)) (almost_everywhere p) <=>
6596          !e. 0 < e /\ e <> PosInf ==>
6597              prob p (limsup (\n. {x | x IN p_space p /\ e < abs (X n x)})) = 0)
6598Proof
6599    rpt STRIP_TAC
6600 >> ‘real_random_variable (\x. 0) p’ by METIS_TAC [real_random_variable_zero]
6601 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘\x. 0’] converge_AE_alt_limsup)
6602 >> RW_TAC std_ss [sub_rzero]
6603QED
6604
6605Theorem converge_AE_to_zero :
6606    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6607            real_random_variable Y p ==>
6608       ((X --> Y) (almost_everywhere p) <=>
6609        ((\n x. X n x - Y x) --> (\x. 0)) (almost_everywhere p))
6610Proof
6611    rpt STRIP_TAC
6612 >> `real_random_variable (\x. 0) p` by PROVE_TAC [real_random_variable_zero]
6613 >> Q.ABBREV_TAC `Z = \n x. X n x - Y x`
6614 >> Know ‘!n. real_random_variable (Z n) p’
6615 >- (RW_TAC std_ss [Abbr `Z`] \\
6616     MATCH_MP_TAC real_random_variable_sub >> art [])
6617 >> RW_TAC std_ss [converge_AE_alt_limsup, sub_rzero]
6618QED
6619
6620Theorem converge_PR_to_zero :
6621    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
6622            real_random_variable Y p ==>
6623       ((X --> Y) (in_probability p) <=>
6624        ((\n x. X n x - Y x) --> (\x. 0)) (in_probability p))
6625Proof
6626    rpt STRIP_TAC
6627 >> `real_random_variable (\x. 0) p` by PROVE_TAC [real_random_variable_zero]
6628 >> Q.ABBREV_TAC `Z = \n x. X n x - Y x`
6629 >> Know ‘!n. real_random_variable (Z n) p’
6630 >- (RW_TAC std_ss [Abbr `Z`] \\
6631     MATCH_MP_TAC real_random_variable_sub >> art [])
6632 >> DISCH_TAC
6633 >> RW_TAC std_ss [converge_PR_def, sub_rzero]
6634QED
6635
6636Theorem converge_AE_imp_PR' :
6637    !p X. prob_space p /\ (!n. real_random_variable (X n) p) /\
6638         (X --> (\x. 0)) (almost_everywhere p) ==>
6639         (X --> (\x. 0)) (in_probability p)
6640Proof
6641    rpt STRIP_TAC
6642 >> irule converge_AE_imp_PR
6643 >> rw [real_random_variable_zero]
6644QED
6645
6646(* Theorem 4.1.4 [2, p.71], for moments (integer-valued) only. *)
6647Theorem converge_LP_imp_PR' :
6648    !p X k. prob_space p /\ (!n. real_random_variable (X n) p) /\ 0 < k /\
6649            (X --> (\x. 0)) (in_lebesgue (&k :extreal) p) ==>
6650            (X --> (\x. 0)) (in_probability p)
6651Proof
6652    rpt GEN_TAC >> STRIP_TAC
6653 >> POP_ASSUM MP_TAC
6654 >> `real_random_variable (\x. 0) p` by PROVE_TAC [real_random_variable_zero]
6655 >> RW_TAC real_ss [converge_LP_alt_pow, converge_PR_def, LIM_SEQUENTIALLY,
6656                    dist, expectation_def, sub_rzero, REAL_SUB_RZERO]
6657 >> ‘sigma_algebra (measurable_space p)’
6658      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
6659 >> fs [real_random_variable_def]
6660 >> rename1 `0 < d` (* the last assumption *)
6661 >> Know `!n. {x | x IN p_space p /\ e < abs (X n x)} IN events p`
6662 >- (GEN_TAC \\
6663    `{x | x IN p_space p /\ e < abs (X n x)} =
6664     p_space p DIFF {x | x IN p_space p /\ abs (X n x) <= e}`
6665        by (RW_TAC set_ss [Once EXTENSION, GSYM extreal_lt_def] \\
6666            METIS_TAC []) >> POP_ORW \\
6667     MATCH_MP_TAC EVENTS_COMPL >> art [] \\
6668     REWRITE_TAC [abs_bounds] \\
6669    `{x | x IN p_space p /\ -e <= X n x /\ X n x <= e} =
6670     ({x | -e <= X n x} INTER p_space p) INTER ({x | X n x <= e} INTER p_space p)`
6671        by SET_TAC [] >> POP_ORW \\
6672     MATCH_MP_TAC EVENTS_INTER >> fs [events_def, p_space_def] \\
6673     fs [random_variable_def, events_def, p_space_def] \\
6674     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
6675 >> DISCH_TAC
6676 >> Know `!n. abs (real (prob p {x | x IN p_space p /\ e < abs (X n x)})) =
6677                   real (prob p {x | x IN p_space p /\ e < abs (X n x)})`
6678 >- (GEN_TAC \\
6679    `prob p {x | x IN p_space p /\ e < abs (X n x)} <> PosInf /\
6680     prob p {x | x IN p_space p /\ e < abs (X n x)} <> NegInf`
6681        by METIS_TAC [PROB_FINITE] \\
6682     ASM_SIMP_TAC std_ss [ABS_REFL, GSYM extreal_le_eq, normal_real,
6683                          GSYM extreal_of_num_def] \\
6684     MATCH_MP_TAC PROB_POSITIVE >> art []) >> Rewr'
6685 >> Know `!n. 0 <= integral p (\x. abs (X n x) pow k)`
6686 >- (GEN_TAC >> MATCH_MP_TAC integral_pos \\
6687     fs [prob_space_def] \\
6688     rpt STRIP_TAC >> MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [abs_pos])
6689 >> DISCH_TAC
6690 >> `!n. integral p (\x. abs (X n x) pow k) <> NegInf`
6691       by METIS_TAC [pos_not_neginf]
6692 >> Know `!n. abs (real (integral p (\x. abs (X n x) pow k))) =
6693                   real (integral p (\x. abs (X n x) pow k))`
6694 >- (GEN_TAC \\
6695     ASM_SIMP_TAC std_ss [ABS_REFL, GSYM extreal_le_eq, normal_real,
6696                          GSYM extreal_of_num_def])
6697 >> DISCH_THEN (fs o wrap)
6698 >> Know `!n. integrable p (\x. abs (X n x) pow k)`
6699 >- (Q.X_GEN_TAC ‘n’ \\
6700     fs [prob_space_def, random_variable_def, p_space_def, events_def] \\
6701     Know `measure_space p /\
6702           (!x. x IN m_space p ==> 0 <= (\x. abs (X n x) pow k) x)`
6703     >- (RW_TAC std_ss [] \\
6704         MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [abs_pos]) \\
6705     DISCH_THEN (REWRITE_TAC o wrap o (MATCH_MP integrable_pos)) \\
6706     reverse CONJ_TAC
6707     >- (Suff `pos_fn_integral p (\x. abs (X n x) pow k) =
6708                      integral p (\x. abs (X n x) pow k)` >- rw [] \\
6709         MATCH_MP_TAC EQ_SYM \\
6710         MATCH_MP_TAC integral_pos_fn \\
6711         RW_TAC std_ss [] \\
6712         MATCH_MP_TAC pow_pos_le >> REWRITE_TAC [abs_pos]) \\
6713     ONCE_REWRITE_TAC [METIS_PROVE []
6714       ``(\x. abs (X n x) pow k) = (\x. (\x. abs (X n x)) x pow k)``] \\
6715     MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
6716     MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS \\
6717     Q.EXISTS_TAC `X n` >> fs [measure_space_def])
6718 >> DISCH_TAC
6719 (* eliminate all `real (prob p ...)` *)
6720 >> `!n. real (prob p {x | x IN p_space p /\ e < abs (X n x)}) < d <=>
6721               prob p {x | x IN p_space p /\ e < abs (X n x)} < Normal d`
6722       by (METIS_TAC [PROB_FINITE, normal_real, extreal_lt_eq]) >> POP_ORW
6723 >> `!n. integral p (\x. abs (X n x) pow k) <> NegInf`
6724       by (METIS_TAC [pos_not_neginf])
6725 >> `!e n. real (integral p (\x. abs (X n x) pow k)) < e <=>
6726                 integral p (\x. abs (X n x) pow k) < Normal e`
6727       by (METIS_TAC [normal_real, extreal_lt_eq])
6728 >> POP_ASSUM (fs o wrap)
6729 (* prepare for prob_markov_ineq *)
6730 >> `e <> NegInf` by METIS_TAC [lt_imp_le, pos_not_neginf]
6731 >> `?E. e = Normal E` by METIS_TAC [extreal_cases]
6732 >> `0 < E` by METIS_TAC [extreal_of_num_def, extreal_lt_eq]
6733 >> Q.PAT_X_ASSUM `!e. 0 < e ==> ?N. P` (MP_TAC o (Q.SPEC `d * E pow k`))
6734 >> `0 < E pow k` by PROVE_TAC [REAL_POW_LT]
6735 >> Know `0 < d * E pow k` >- (MATCH_MP_TAC REAL_LT_MUL >> art [])
6736 >> RW_TAC std_ss []
6737 >> Q.EXISTS_TAC `N` >> rpt STRIP_TAC
6738 >> Q.PAT_X_ASSUM `!n. N <= n ==> P`
6739      (MP_TAC o (REWRITE_RULE [GSYM expectation_def]) o (Q.SPEC `n`))
6740 >> RW_TAC std_ss [GSYM extreal_mul_def]
6741 >> Know `!m x. x IN p_space p ==>
6742               (Normal E < abs (X m x) <=> Normal (E pow k) < abs (X m x) pow k)`
6743 >- (rpt STRIP_TAC \\
6744    `?r. X m x = Normal r` by METIS_TAC [extreal_cases] >> POP_ORW \\
6745     SIMP_TAC std_ss [extreal_abs_def, extreal_pow_def, extreal_lt_eq] \\
6746    `k <> 0` by RW_TAC arith_ss [] \\
6747     EQ_TAC >> STRIP_TAC
6748     >- (MATCH_MP_TAC REAL_POW_LT2 >> art [] \\
6749         MATCH_MP_TAC REAL_LT_IMP_LE >> art []) \\
6750     SPOSE_NOT_THEN (ASSUME_TAC o (REWRITE_RULE [GSYM real_lte])) \\
6751    `abs r pow k <= E pow k` by METIS_TAC [POW_LE, ABS_POS] \\
6752     METIS_TAC [REAL_LTE_ANTISYM])
6753 >> DISCH_TAC
6754 >> Know ‘!m. {x | x IN p_space p /\ Normal E < abs (X m x)} =
6755              {x | x IN p_space p /\ Normal (E pow k) < abs (X m x) pow k}’
6756 >- (rw [Once EXTENSION] \\
6757     METIS_TAC [])
6758 >> DISCH_THEN (fs o wrap)
6759 >> MATCH_MP_TAC let_trans
6760 >> Q.EXISTS_TAC `prob p {x | x IN p_space p /\ Normal (E pow k) <= abs (X n x) pow k}`
6761 >> CONJ_TAC (* from `<` to `<=` *)
6762 >- (MATCH_MP_TAC PROB_INCREASING >> art [] \\
6763     reverse CONJ_TAC
6764     >- (RW_TAC set_ss [SUBSET_DEF] >> MATCH_MP_TAC lt_imp_le >> art []) \\
6765     fs [random_variable_def, prob_space_def, events_def, p_space_def] \\
6766    `{x | x IN m_space p /\ Normal (E pow k) <= abs (X n x) pow k} =
6767     {x | Normal (E pow k) <= (\x. abs (X n x) pow k) x} INTER m_space p`
6768        by SET_TAC [] >> POP_ORW \\
6769     Suff `(\x. abs (X n x) pow k) IN measurable (m_space p,measurable_sets p) Borel`
6770     >- rw [IN_MEASURABLE_BOREL_ALL_MEASURE] \\
6771    `!x. abs (X n x) = (\x. abs (X n x)) x` by METIS_TAC [] >> POP_ORW \\
6772     MATCH_MP_TAC IN_MEASURABLE_BOREL_POW \\
6773     MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS >> Q.EXISTS_TAC `X n` \\
6774     FULL_SIMP_TAC std_ss [measure_space_def])
6775 (* applying prob_markov_ineq *)
6776 >> Q.ABBREV_TAC `Y = \x. abs (X n x) pow k`
6777 >> Know `!x. abs (X n x) pow k = abs (Y x)`
6778 >- (RW_TAC std_ss [Abbr `Y`, Once EQ_SYM_EQ, abs_refl] \\
6779     MATCH_MP_TAC pow_pos_le >> rw [abs_pos]) >> Rewr'
6780 >> `{x | x IN p_space p /\ Normal (E pow k) <= abs (Y x)} =
6781     {x | Normal (E pow k) <= abs (Y x)} INTER p_space p` by SET_TAC [] >> POP_ORW
6782 >> MATCH_MP_TAC let_trans
6783 >> Q.EXISTS_TAC `inv (Normal (E pow k)) * expectation p (abs o Y)`
6784 >> CONJ_TAC
6785 >- (MATCH_MP_TAC prob_markov_ineq \\
6786     RW_TAC std_ss [Abbr `Y`, extreal_of_num_def, extreal_lt_eq])
6787 >> Know `abs o Y = Y`
6788 >- (RW_TAC std_ss [o_DEF, Abbr `Y`, abs_refl, FUN_EQ_THM] \\
6789     MATCH_MP_TAC pow_pos_le >> rw [abs_pos]) >> Rewr'
6790 >> `0 < Normal (E pow k) /\ Normal (E pow k) <> PosInf`
6791       by (ASM_SIMP_TAC std_ss [extreal_not_infty, extreal_of_num_def, extreal_lt_eq])
6792 >> Know `inv (Normal (E pow k)) * expectation p Y < Normal d <=>
6793          Normal (E pow k) * (inv (Normal (E pow k)) * expectation p Y) <
6794          Normal (E pow k) * Normal d`
6795 >- (MATCH_MP_TAC EQ_SYM >> MATCH_MP_TAC lt_lmul >> art []) >> Rewr'
6796 >> ASM_SIMP_TAC std_ss [mul_assoc, mul_lone,
6797                         ONCE_REWRITE_RULE [mul_comm] mul_linv_pos]
6798 >> ASM_REWRITE_TAC [Once mul_comm]
6799QED
6800
6801Theorem converge_AE_cong_full :
6802    !p X Y A B m. (!n x. m <= n /\ x IN p_space p ==> X n x = Y n x) /\
6803                  (!x. x IN p_space p ==> A x = B x) ==>
6804                  ((X --> A) (almost_everywhere p) <=> (Y --> B) (almost_everywhere p))
6805Proof
6806    rw [p_space_def, converge_AE, AE_DEF, EXTREAL_LIM_SEQUENTIALLY]
6807 >> EQ_TAC >> rw []
6808 >| [ (* goal 1 (of 2) *)
6809      Q.EXISTS_TAC ‘N’ >> rw [] \\
6810      Q.PAT_X_ASSUM ‘!x. x IN m_space p /\ x NOTIN N ==> P’ (MP_TAC o (Q.SPEC ‘x’)) \\
6811      rw [] >> POP_ASSUM (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6812      Q.EXISTS_TAC ‘MAX N' m’ >> rw [MAX_LE] \\
6813     ‘Y n x = X n x’ by METIS_TAC [] >> POP_ORW \\
6814      FIRST_X_ASSUM MATCH_MP_TAC >> art [],
6815      (* goal 2 (of 2) *)
6816      Q.EXISTS_TAC ‘N’ >> rw [] \\
6817      Q.PAT_X_ASSUM ‘!x. x IN m_space p /\ x NOTIN N ==> P’ (MP_TAC o (Q.SPEC ‘x’)) \\
6818      rw [] >> POP_ASSUM (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6819      Q.EXISTS_TAC ‘MAX N' m’ >> rw [MAX_LE] ]
6820QED
6821
6822Theorem converge_AE_cong :
6823    !p X Y Z m. (!n x. m <= n /\ x IN p_space p ==> X n x = Y n x) ==>
6824                ((X --> Z) (almost_everywhere p) <=> (Y --> Z) (almost_everywhere p))
6825Proof
6826    rpt STRIP_TAC
6827 >> MATCH_MP_TAC converge_AE_cong_full
6828 >> Q.EXISTS_TAC ‘m’ >> rw []
6829QED
6830
6831Theorem converge_PR_cong_full :
6832    !p X Y A B m. (!n x. m <= n /\ x IN p_space p ==> X n x = Y n x) /\
6833                  (!x. x IN p_space p ==> A x = B x) ==>
6834                  ((X --> A) (in_probability p) <=> (Y --> B) (in_probability p))
6835Proof
6836    rw [converge_PR, EXTREAL_LIM_SEQUENTIALLY]
6837 >> EQ_TAC >> rw []
6838 >| [ (* goal 1 (of 2) *)
6839      Q.PAT_X_ASSUM ‘!e. 0 < e /\ e <> PosInf ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6840      rename1 ‘0 < (E :real)’ \\
6841      POP_ASSUM (MP_TAC o (Q.SPEC ‘E’)) >> rw [] \\
6842      Q.EXISTS_TAC ‘MAX N m’ >> rw [MAX_LE] \\
6843      Know ‘{x | x IN p_space p /\ e < abs (Y n x - B x)} =
6844            {x | x IN p_space p /\ e < abs (X n x - A x)}’
6845      >- (rw [Once EXTENSION] \\
6846          EQ_TAC >> rw [] >> METIS_TAC []) >> Rewr' \\
6847      FIRST_X_ASSUM MATCH_MP_TAC >> art [],
6848      (* goal 2 (of 2) *)
6849      Q.PAT_X_ASSUM ‘!e. 0 < e /\ e <> PosInf ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6850      rename1 ‘0 < (E :real)’ \\
6851      POP_ASSUM (MP_TAC o (Q.SPEC ‘E’)) >> rw [] \\
6852      Q.EXISTS_TAC ‘MAX N m’ >> rw [MAX_LE] \\
6853      Know ‘{x | x IN p_space p /\ e < abs (X n x - A x)} =
6854            {x | x IN p_space p /\ e < abs (Y n x - B x)}’
6855      >- (rw [Once EXTENSION] \\
6856          EQ_TAC >> rw [] >> METIS_TAC []) >> Rewr' \\
6857      FIRST_X_ASSUM MATCH_MP_TAC >> art [] ]
6858QED
6859
6860Theorem converge_PR_cong :
6861    !p X Y Z m. (!n x. m <= n /\ x IN p_space p ==> X n x = Y n x) ==>
6862                ((X --> Z) (in_probability p) <=> (Y --> Z) (in_probability p))
6863Proof
6864    rpt STRIP_TAC
6865 >> MATCH_MP_TAC converge_PR_cong_full
6866 >> Q.EXISTS_TAC ‘m’ >> rw []
6867QED
6868
6869Theorem converge_LP_cong :
6870    !p X Y Z r. prob_space p /\ (!n x. x IN p_space p ==> X n x = Y n x) /\
6871                0 < r /\ r <> PosInf ==>
6872               ((X --> Z) (in_lebesgue r p) <=> (Y --> Z) (in_lebesgue r p))
6873Proof
6874    rw [converge_LP, EXTREAL_LIM_SEQUENTIALLY]
6875 >> EQ_TAC >> RW_TAC std_ss []
6876 >| [ (* goal 1 (of 4) *)
6877      Know ‘Y n IN lp_space r p <=> X n IN lp_space r p’
6878      >- (MATCH_MP_TAC lp_space_cong >> fs [prob_space_def, p_space_def]) \\
6879      DISCH_THEN (ASM_REWRITE_TAC o wrap),
6880      (* goal 2 (of 4) *)
6881      Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6882      Q.EXISTS_TAC ‘N’ >> rw [] \\
6883      Know ‘expectation p (\x. abs (Y n x - Z x) powr r) =
6884            expectation p (\x. abs (X n x - Z x) powr r)’
6885      >- (MATCH_MP_TAC expectation_cong >> rw []) >> Rewr' \\
6886      FIRST_X_ASSUM MATCH_MP_TAC >> art [],
6887      (* goal 3 (of 4) *)
6888      Know ‘X n IN lp_space r p <=> Y n IN lp_space r p’
6889      >- (MATCH_MP_TAC lp_space_cong >> fs [prob_space_def, p_space_def]) \\
6890      DISCH_THEN (ASM_REWRITE_TAC o wrap),
6891      (* goal 4 (of 4) *)
6892      Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e’)) >> rw [] \\
6893      Q.EXISTS_TAC ‘N’ >> rw [] \\
6894      Know ‘expectation p (\x. abs (X n x - Z x) powr r) =
6895            expectation p (\x. abs (Y n x - Z x) powr r)’
6896      >- (MATCH_MP_TAC expectation_cong >> rw []) >> Rewr' \\
6897      FIRST_X_ASSUM MATCH_MP_TAC >> art [] ]
6898QED
6899
6900(*
6901Theorem WLLN_uncorrelated_L2 :
6902
6903    has been moved to examples/probability/large_numberTheory with improved statements.
6904 *)
6905
6906Theorem converge_AE_to_zero' :
6907    !p X Y Z. prob_space p /\ (!n. real_random_variable (X n) p) /\
6908              real_random_variable Y p /\
6909             (!n x. x IN p_space p ==> Z n x = X n x - Y x) ==>
6910             ((X --> Y) (almost_everywhere p) <=> (Z --> (\x. 0)) (almost_everywhere p))
6911Proof
6912    rw [converge_AE_to_zero]
6913 >> MATCH_MP_TAC converge_AE_cong
6914 >> Q.EXISTS_TAC ‘0’ >> rw []
6915QED
6916
6917Theorem converge_PR_to_zero' :
6918    !p X Y Z. prob_space p /\ (!n. real_random_variable (X n) p) /\
6919              real_random_variable Y p /\
6920             (!n x. x IN p_space p ==> Z n x = X n x - Y x) ==>
6921             ((X --> Y) (in_probability p) <=> (Z --> (\x. 0)) (in_probability p))
6922Proof
6923    rw [converge_PR_to_zero]
6924 >> MATCH_MP_TAC converge_PR_cong
6925 >> Q.EXISTS_TAC ‘0’ >> rw []
6926QED
6927
6928Theorem converge_AE_alt_shift :
6929    !D p X Y. (X               --> Y) (almost_everywhere p) <=>
6930              ((\n. X (n + D)) --> Y) (almost_everywhere p)
6931Proof
6932    RW_TAC std_ss [converge_AE, AE_DEF, GSYM IN_NULL_SET, EXTREAL_LIM_SEQUENTIALLY]
6933 >> EQ_TAC >> rw [] (* 2 subgoals *)
6934 >| [ (* goal 1 (of 2) *)
6935      Q.EXISTS_TAC ‘N’ >> RW_TAC std_ss [] \\
6936      Q.PAT_X_ASSUM `!x. x IN m_space p /\ x NOTIN N ==> P` (MP_TAC o (Q.SPEC `x`)) \\
6937      RW_TAC std_ss [] \\
6938      rename1 `z IN null_set p` \\
6939      Q.PAT_X_ASSUM `!e. 0 < e ==> P` (MP_TAC o (Q.SPEC `e`)) >> RW_TAC std_ss [] \\
6940      Q.EXISTS_TAC ‘N’ >> RW_TAC std_ss [] \\
6941      Q.PAT_X_ASSUM ‘!n. N <= n ==> P’ (MP_TAC o (Q.SPEC ‘D + n’)) >> rw [],
6942      (* goal 2 (of 2) *)
6943      Q.EXISTS_TAC `N` >> RW_TAC std_ss [] \\
6944      Q.PAT_X_ASSUM `!x. x IN m_space p /\ x NOTIN N ==> P` (MP_TAC o (Q.SPEC `x`)) \\
6945      RW_TAC std_ss [] \\
6946      rename1 `z IN null_set p` \\
6947      Q.PAT_X_ASSUM `!e. 0 < e ==> P` (MP_TAC o (Q.SPEC `e`)) >> RW_TAC std_ss [] \\
6948      Q.EXISTS_TAC `D + N` >> rpt STRIP_TAC \\
6949     ‘N <= n - D’ by rw [] \\
6950      Q.PAT_X_ASSUM ‘!n. N <= n ==> P’ (MP_TAC o (Q.SPEC ‘n - D’)) >> rw [] ]
6951QED
6952
6953Theorem converge_PR_alt_shift :
6954    !D p X Y. (X               --> Y) (in_probability p) <=>
6955              ((\n. X (n + D)) --> Y) (in_probability p)
6956Proof
6957    RW_TAC std_ss [converge_PR, EXTREAL_LIM_SEQUENTIALLY]
6958 >> EQ_TAC >> RW_TAC std_ss [] (* 2 subgoals *)
6959 >| [ (* goal 1 (of 2) *)
6960      rename1 `E <> PosInf` \\
6961      Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> P` (MP_TAC o (Q.SPEC `E`)) \\
6962      RW_TAC std_ss [] \\
6963      rename1 `0 < e` (* this changes the last matching assumption *) \\
6964      Q.PAT_X_ASSUM `!e. 0 < e ==> P` (MP_TAC o (Q.SPEC `e`)) \\
6965      RW_TAC std_ss [] \\
6966      Q.EXISTS_TAC ‘N’ >> RW_TAC std_ss [] \\
6967      Q.PAT_X_ASSUM ‘!n. N <= n ==> P’ (MP_TAC o (Q.SPEC ‘n + D’)) \\
6968      RW_TAC arith_ss [],
6969      (* goal 2 (of 2) *)
6970      rename1 `E <> PosInf` \\
6971      Q.PAT_X_ASSUM `!e. 0 < e /\ e <> PosInf ==> P` (MP_TAC o (Q.SPEC `E`)) \\
6972      RW_TAC std_ss [] \\
6973      rename1 `0 < e` (* this changes the last matching assumption *) \\
6974      Q.PAT_X_ASSUM `!e. 0 < e ==> P` (MP_TAC o (Q.SPEC `e`)) \\
6975      RW_TAC std_ss [] \\
6976      Q.EXISTS_TAC ‘N + D’ >> RW_TAC std_ss [] \\
6977      ‘N <= n - D’ by rw [] \\
6978      Q.PAT_X_ASSUM ‘!n. N <= n ==> P’ (MP_TAC o (Q.SPEC ‘n - D’)) \\
6979      RW_TAC arith_ss [] ]
6980QED
6981
6982(* |- !p X Y. ((\n. X (SUC n)) --> Y) (almost_everywhere p) ==>
6983              (X               --> Y) (almost_everywhere p)
6984 *)
6985Theorem converge_AE_shift =
6986        converge_AE_alt_shift |> (Q.SPECL [‘1’, ‘p’, ‘X’, ‘Y’])
6987                              |> (snd o EQ_IMP_RULE)
6988                              |> (REWRITE_RULE [GSYM ADD1])
6989                              |> Q.GENL [‘p’, ‘X’, ‘Y’]
6990
6991(* |- !p X Y. ((\n. X (SUC n)) --> Y) (in_probability p) ==>
6992              (X               --> Y) (in_probability p)
6993 *)
6994Theorem converge_PR_shift =
6995        converge_PR_alt_shift |> (Q.SPECL [‘1’, ‘p’, ‘X’, ‘Y’])
6996                              |> (snd o EQ_IMP_RULE)
6997                              |> (REWRITE_RULE [GSYM ADD1])
6998                              |> Q.GENL [‘p’, ‘X’, ‘Y’]
6999
7000Theorem converge_AE_const :
7001    !p c. prob_space p ==> ((\x n. c) --> (\x. c)) (almost_everywhere p)
7002Proof
7003    rw [converge_AE, EXTREAL_LIM_SEQUENTIALLY, AE_DEF, IN_NULL_SET, METRIC_SAME]
7004 >> Q.EXISTS_TAC ‘{}’
7005 >> fs [prob_space_def, NULL_SET_EMPTY]
7006QED
7007
7008Theorem converge_AE_const' :
7009    !p X m c. prob_space p /\ (!n x. m <= n /\ x IN p_space p ==> X n x = c) ==>
7010             (X --> (\x. c)) (almost_everywhere p)
7011Proof
7012    rpt STRIP_TAC
7013 >> Know ‘(X         --> (\x. c)) (almost_everywhere p) <=>
7014          ((\n x. c) --> (\x. c)) (almost_everywhere p)’
7015 >- (MATCH_MP_TAC converge_AE_cong \\
7016     Q.EXISTS_TAC ‘m’ >> rw [])
7017 >> Rewr'
7018 >> MATCH_MP_TAC converge_AE_const >> art []
7019QED
7020
7021Theorem converge_PR_add_to_zero :
7022    !p X Y. prob_space p /\
7023           (!n. real_random_variable (X n) p) /\
7024           (!n. real_random_variable (Y n) p) /\
7025           (X --> (\x. 0)) (in_probability p) /\
7026           (Y --> (\x. 0)) (in_probability p) ==>
7027       ((\n x. X n x + Y n x) --> (\x. 0)) (in_probability p)
7028Proof
7029    rpt STRIP_TAC
7030 >> NTAC 2 (POP_ASSUM MP_TAC)
7031 >> ‘real_random_variable (\x. 0) p’ by PROVE_TAC [real_random_variable_zero]
7032 >> Know ‘!n. real_random_variable (\x. X n x + Y n x) p’
7033 >- (Q.X_GEN_TAC ‘n’ \\
7034     MP_TAC (Q.SPECL [‘p’, ‘X (n :num)’, ‘Y (n :num)’] real_random_variable_add) \\
7035     rw [])
7036 >> DISCH_TAC
7037 >> rw [converge_PR_def, LIM_SEQUENTIALLY, dist]
7038 >> rename1 ‘0 < (E :real)’ (* the last assumption with ‘e'’ is affected *)
7039 >> ‘e <> NegInf’ by PROVE_TAC [pos_not_neginf, lt_imp_le]
7040 >> Know `0 < e / 2`
7041 >- (GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites
7042                     [extreal_of_num_def] \\
7043     MATCH_MP_TAC lt_div >> RW_TAC real_ss [])
7044 >> DISCH_TAC
7045 >> Know ‘e / 2 <> PosInf’
7046 >- (‘?r. e = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7047     rw [extreal_of_num_def, extreal_not_infty, extreal_div_eq, GSYM ne_02])
7048 >> DISCH_TAC
7049 >> Know ‘0 < E / 2’
7050 >- (MATCH_MP_TAC REAL_LT_DIV >> rw [])
7051 >> DISCH_TAC
7052 >> NTAC 2 (Q.PAT_X_ASSUM ‘!e. 0 < e /\ e <> PosInf ==> P’ (MP_TAC o (Q.SPEC ‘e / 2’)))
7053 >> RW_TAC std_ss []
7054 >> NTAC 2 (Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘E / 2’)))
7055 >> RW_TAC std_ss []
7056 >> Q.EXISTS_TAC ‘MAX N N'’
7057 >> rw [MAX_LE]
7058 >> NTAC 2 (Q.PAT_X_ASSUM ‘!n. _ <= n ==> P’ (MP_TAC o (Q.SPEC ‘n’)))
7059 >> RW_TAC std_ss []
7060 >> ‘sigma_algebra (measurable_space p)’
7061      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
7062 (* stage work *)
7063 >> Know `!Z b. real_random_variable Z p ==>
7064                {x | x IN p_space p /\ b < abs (Z x)} IN events p`
7065 >- (rpt GEN_TAC >> DISCH_TAC \\
7066    `{x | x IN p_space p /\ b < abs (Z x)} =
7067      p_space p DIFF {x | x IN p_space p /\ abs (Z x) <= b}`
7068        by (RW_TAC set_ss [Once EXTENSION, GSYM extreal_lt_def] \\
7069            METIS_TAC []) >> POP_ORW \\
7070     MATCH_MP_TAC EVENTS_COMPL >> art [abs_bounds] \\
7071    `{x | x IN p_space p /\ -b <= Z x /\ Z x <= b} =
7072     ({x | -b <= Z x} INTER p_space p) INTER ({x | Z x <= b} INTER p_space p)`
7073        by SET_TAC [] >> POP_ORW \\
7074     MATCH_MP_TAC EVENTS_INTER \\
7075     fs [real_random_variable, events_def, p_space_def] \\
7076     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
7077 >> DISCH_TAC
7078 >> Q.ABBREV_TAC ‘A = {x | x IN p_space p /\ e / 2 < abs (X n x)}’
7079 >> Q.ABBREV_TAC ‘B = {x | x IN p_space p /\ e / 2 < abs (Y n x)}’
7080 (* simplify X-related assumptions *)
7081 >> Know ‘A IN events p’
7082 >- (Q.UNABBREV_TAC ‘A’ >> FIRST_X_ASSUM MATCH_MP_TAC >> art [])
7083 >> DISCH_TAC
7084 >> Know `abs (real (prob p A)) = real (prob p A)`
7085 >- (‘prob p A <> PosInf /\ prob p A <> NegInf’ by METIS_TAC [PROB_FINITE] \\
7086     ASM_SIMP_TAC std_ss [ABS_REFL, GSYM extreal_le_eq, normal_real,
7087                          GSYM extreal_of_num_def] \\
7088     MATCH_MP_TAC PROB_POSITIVE >> rw [])
7089 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7090 >> `real (prob p A) < E / 2 <=> prob p A < Normal (E / 2)`
7091       by (METIS_TAC [PROB_FINITE, normal_real, extreal_lt_eq])
7092 >> POP_ASSUM (FULL_SIMP_TAC std_ss o wrap)
7093 (* simplify Y-related assumptions *)
7094 >> Know ‘B IN events p’
7095 >- (Q.UNABBREV_TAC ‘B’ >> FIRST_X_ASSUM MATCH_MP_TAC >> art [])
7096 >> DISCH_TAC
7097 >> Know `abs (real (prob p B)) = real (prob p B)`
7098 >- (‘prob p B <> PosInf /\ prob p B <> NegInf’ by METIS_TAC [PROB_FINITE] \\
7099     ASM_SIMP_TAC std_ss [ABS_REFL, GSYM extreal_le_eq, normal_real,
7100                          GSYM extreal_of_num_def] \\
7101     MATCH_MP_TAC PROB_POSITIVE >> rw [])
7102 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7103 >> `real (prob p B) < E / 2 <=> prob p B < Normal (E / 2)`
7104       by (METIS_TAC [PROB_FINITE, normal_real, extreal_lt_eq])
7105 >> POP_ASSUM (FULL_SIMP_TAC std_ss o wrap)
7106 >> ‘A UNION B IN events p’ by PROVE_TAC [EVENTS_UNION]
7107 (* simplify goal *)
7108 >> Know ‘!n. real_random_variable (\x. X n x + Y n x) p’
7109 >- (Q.X_GEN_TAC ‘i’ \\
7110     MATCH_MP_TAC real_random_variable_add >> art[])
7111 >> DISCH_TAC
7112 >> Know ‘{x | x IN p_space p /\ e < abs (X n x + Y n x)} IN events p’
7113 >- (FIRST_X_ASSUM HO_MATCH_MP_TAC >> art [])
7114 >> DISCH_TAC
7115 >> Know ‘abs (real (prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)})) =
7116              (real (prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)}))’
7117 >- (‘prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)} <> PosInf /\
7118      prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)} <> NegInf’
7119        by METIS_TAC [PROB_FINITE] \\
7120     ASM_SIMP_TAC std_ss [ABS_REFL, GSYM extreal_le_eq, normal_real,
7121                          GSYM extreal_of_num_def] \\
7122     MATCH_MP_TAC PROB_POSITIVE >> rw [])
7123 >> Rewr'
7124 >> ‘real (prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)}) < E <=>
7125           prob p {x | x IN p_space p /\ e < abs (X n x + Y n x)} < Normal E’
7126      by (METIS_TAC [PROB_FINITE, normal_real, extreal_lt_eq])
7127 >> POP_ORW
7128 (* final stage *)
7129 >> MATCH_MP_TAC let_trans
7130 >> Q.EXISTS_TAC ‘prob p (A UNION B)’
7131 >> CONJ_TAC
7132 >- (MATCH_MP_TAC PROB_INCREASING \\
7133     rw [Abbr ‘A’, Abbr ‘B’, SUBSET_DEF] \\
7134     SPOSE_NOT_THEN (STRIP_ASSUME_TAC o (REWRITE_RULE [extreal_lt_def])) \\
7135     FULL_SIMP_TAC std_ss [real_random_variable_def] \\
7136     Know ‘abs (X n x + Y n x) <= e / 2 + e / 2’
7137     >- (MATCH_MP_TAC le_trans \\
7138         Q.EXISTS_TAC ‘abs (X n x) + abs (Y n x)’ \\
7139         CONJ_TAC >- (MATCH_MP_TAC abs_triangle >> rw []) \\
7140         MATCH_MP_TAC le_add2 >> art []) \\
7141     Suff ‘e / 2 + e / 2 = e’ >- rw [GSYM extreal_lt_def] \\
7142     REWRITE_TAC [half_double])
7143 >> MATCH_MP_TAC let_trans
7144 >> Q.EXISTS_TAC ‘prob p A + prob p B’
7145 >> CONJ_TAC
7146 >- (MATCH_MP_TAC PROB_SUBADDITIVE >> art [])
7147 >> Suff ‘Normal E = Normal (E / 2) + Normal (E / 2)’
7148 >- (Rewr' >> MATCH_MP_TAC lt_add2 >> art [])
7149 >> rw [extreal_add_def]
7150 >> REWRITE_TAC [REAL_HALF_DOUBLE]
7151QED
7152
7153Theorem converge_PR_add :
7154    !p X Y A B. prob_space p /\
7155               (!n. real_random_variable (X n) p) /\
7156                real_random_variable A p /\ (X --> A) (in_probability p) /\
7157               (!n. real_random_variable (Y n) p) /\
7158                real_random_variable B p /\ (Y --> B) (in_probability p) ==>
7159       ((\n x. X n x + Y n x) --> (\x. A x + B x)) (in_probability p)
7160Proof
7161    rpt STRIP_TAC
7162 >> Know ‘(X --> A) (in_probability p) <=>
7163          ((\n x. X n x - A x) --> (\x. 0)) (in_probability p)’
7164 >- (MATCH_MP_TAC converge_PR_to_zero >> art [])
7165 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7166 >> Know ‘(Y --> B) (in_probability p) <=>
7167          ((\n x. Y n x - B x) --> (\x. 0)) (in_probability p)’
7168 >- (MATCH_MP_TAC converge_PR_to_zero >> art [])
7169 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7170 >> Know ‘((\n x. X n x + Y n x) --> (\x. A x + B x)) (in_probability p) <=>
7171          ((\n x. X n x + Y n x - (A x + B x)) --> (\x. 0)) (in_probability p)’
7172 >- (MATCH_MP_TAC converge_PR_to_zero' >> rw [] >| (* 2 subgoals *)
7173     [ (* goal 1 (of 2) *)
7174       MATCH_MP_TAC real_random_variable_add >> art [],
7175       (* goal 2 (of 2) *)
7176       MATCH_MP_TAC real_random_variable_add >> art [] ])
7177 >> Rewr'
7178 >> Know ‘((\n x. (X n x - A x) + (Y n x - B x)) --> (\x. 0)) (in_probability p)’
7179 >- (HO_MATCH_MP_TAC converge_PR_add_to_zero >> rw [] >| (* 2 subgoals *)
7180     [ (* goal 1 (of 2) *)
7181       MATCH_MP_TAC real_random_variable_sub >> art [],
7182       (* goal 2 (of 2) *)
7183       MATCH_MP_TAC real_random_variable_sub >> art [] ])
7184 >> DISCH_TAC
7185 >> Suff ‘((\n x. X n x + Y n x - (A x + B x)) --> (\x. 0)) (in_probability p) <=>
7186          ((\n x. X n x - A x + (Y n x - B x)) --> (\x. 0)) (in_probability p)’
7187 >- DISCH_THEN (art o wrap)
7188 >> MATCH_MP_TAC converge_PR_cong
7189 >> Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss []
7190 >> FULL_SIMP_TAC std_ss [real_random_variable_def]
7191 >> ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW
7192 >> ‘?b. Y n x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW
7193 >> ‘?c. A x = Normal c’ by METIS_TAC [extreal_cases] >> POP_ORW
7194 >> ‘?d. B x = Normal d’ by METIS_TAC [extreal_cases] >> POP_ORW
7195 >> rw [extreal_add_def, extreal_sub_def, extreal_11]
7196 >> REAL_ARITH_TAC
7197QED
7198
7199Theorem converge_PR_ainv_to_zero :
7200    !p X. (X --> (\x. 0)) (in_probability p) ==>
7201          ((\n x. -X n x) --> (\x. 0)) (in_probability p)
7202Proof
7203    rw [converge_PR, EXTREAL_LIM_SEQUENTIALLY]
7204QED
7205
7206Theorem converge_PR_ainv :
7207    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
7208            real_random_variable Y p /\
7209            (X --> Y) (in_probability p) ==>
7210         ((\n x. -X n x) --> (\x. -Y x)) (in_probability p)
7211Proof
7212    rpt STRIP_TAC
7213 >> Know ‘(X --> Y) (in_probability p) <=>
7214          ((\n x. X n x - Y x) --> (\x. 0)) (in_probability p)’
7215 >- (MATCH_MP_TAC converge_PR_to_zero >> art [])
7216 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7217 >> Know ‘((\n x. -X n x) --> (\x. -Y x)) (in_probability p) <=>
7218          ((\n x. (\n x. -X n x) n x - (\x. -Y x) x) --> (\x. 0)) (in_probability p)’
7219 >- (MATCH_MP_TAC converge_PR_to_zero >> rw [] >| (* 2 subgoals *)
7220     [ MATCH_MP_TAC real_random_variable_ainv >> art [],
7221       MATCH_MP_TAC real_random_variable_ainv >> art [] ])
7222 >> Rewr'
7223 >> BETA_TAC
7224 >> Know ‘((\n x. -X n x - -Y x) --> (\x. 0)) (in_probability p) <=>
7225          ((\n x. -(X n x - Y x)) --> (\x. 0)) (in_probability p)’
7226 >- (MATCH_MP_TAC converge_PR_cong \\
7227     Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss [] \\
7228     FULL_SIMP_TAC std_ss [real_random_variable_def] \\
7229    ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7230    ‘?b. Y x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7231     rw [extreal_ainv_def, extreal_sub_def] \\
7232     REAL_ARITH_TAC)
7233 >> Rewr'
7234 >> HO_MATCH_MP_TAC converge_PR_ainv_to_zero >> rw []
7235 >> MATCH_MP_TAC real_random_variable_sub >> art []
7236QED
7237
7238Theorem converge_PR_sub :
7239    !p X Y A B. prob_space p /\
7240               (!n. real_random_variable (X n) p) /\
7241                real_random_variable A p /\ (X --> A) (in_probability p) /\
7242               (!n. real_random_variable (Y n) p) /\
7243                real_random_variable B p /\ (Y --> B) (in_probability p) ==>
7244       ((\n x. X n x - Y n x) --> (\x. A x - B x)) (in_probability p)
7245Proof
7246    rpt STRIP_TAC
7247 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘\n x. -Y n x’, ‘A’, ‘\x. -B x’] converge_PR_add)
7248 >> BETA_TAC >> art []
7249 >> Know ‘((\n x. X n x + -Y n x) --> (\x. A x + -B x)) (in_probability p) <=>
7250          ((\n x. X n x - Y n x) --> (\x. A x - B x)) (in_probability p)’
7251 >- (MATCH_MP_TAC converge_PR_cong_full \\
7252     FULL_SIMP_TAC std_ss [real_random_variable_def] \\
7253     Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss [] >| (* 2 subgoals *)
7254     [ (* goal 1 (of 2) *)
7255      ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7256      ‘?b. Y n x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7257       rw [extreal_ainv_def, extreal_add_def, extreal_sub_def] \\
7258       REAL_ARITH_TAC,
7259       (* goal 2 (of 2) *)
7260      ‘?c. A x = Normal c’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7261      ‘?d. B x = Normal d’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7262       rw [extreal_ainv_def, extreal_add_def, extreal_sub_def] \\
7263       REAL_ARITH_TAC ])
7264 >> Rewr'
7265 >> Know ‘!n. real_random_variable (\x. -Y n x) p’
7266 >- (GEN_TAC >> MATCH_MP_TAC real_random_variable_ainv >> art [])
7267 >> Know ‘real_random_variable (\x. -B x) p’
7268 >- (MATCH_MP_TAC real_random_variable_ainv >> art [])
7269 >> Know ‘((\n x. -Y n x) --> (\x. -B x)) (in_probability p)’
7270 >- (MATCH_MP_TAC converge_PR_ainv >> art [])
7271 >> RW_TAC std_ss []
7272QED
7273
7274Theorem converge_PR_to_limit :
7275    !p X M m. prob_space p /\ (!n. real_random_variable (X n) p) /\
7276              (M --> m) sequentially /\
7277              ((\n x. X n x - Normal (M n)) --> (\x. 0)) (in_probability p) ==>
7278              (X --> (\x. Normal m)) (in_probability p)
7279Proof
7280    rpt STRIP_TAC
7281 (* applying converge_PR_cong_full *)
7282 >> Know ‘(X --> (\x. Normal m)) (in_probability p) <=>
7283          ((\n x. X n x - Normal (M n) + Normal (M n)) --> (\x. 0 + Normal m))
7284           (in_probability p)’
7285 >- (MATCH_MP_TAC converge_PR_cong_full \\
7286     Q.EXISTS_TAC ‘0’ >> rw [sub_add_normal]) >> Rewr'
7287 >> HO_MATCH_MP_TAC converge_PR_add
7288 >> rw [real_random_variable_zero, real_random_variable_const]
7289 >- (HO_MATCH_MP_TAC real_random_variable_sub \\
7290     rw [real_random_variable_const] \\
7291    ‘(\x. X n x) = X n’ by METIS_TAC [] >> POP_ASSUM (art o wrap))
7292 >> Q.PAT_X_ASSUM ‘!n. real_random_variable (X n) p’ K_TAC
7293 >> POP_ASSUM K_TAC (* (X n x - M n) --> 0 *)
7294 (* stage work, now ‘X n’ disappeared, left only M and m *)
7295 >> POP_ASSUM MP_TAC
7296 >> rw [converge_PR, EXTREAL_LIM_SEQUENTIALLY, LIM_SEQUENTIALLY, dist]
7297 >> ‘e <> NegInf’ by PROVE_TAC [lt_imp_le, pos_not_neginf]
7298 >> rename1 ‘0 < (z :real)’
7299 >> ‘?E. e = Normal E /\ 0 < E’
7300       by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_lt_eq]
7301 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> ?N. P’ (MP_TAC o Q.SPEC ‘E’)
7302 >> RW_TAC std_ss [extreal_sub_def, extreal_abs_def, extreal_lt_eq]
7303 >> Q.EXISTS_TAC ‘N’
7304 >> rpt STRIP_TAC
7305 >> Suff ‘{x | x IN p_space p /\ E < abs (M n - m)} = {}’
7306 >- rw [PROB_EMPTY, METRIC_SAME]
7307 >> rw [Once EXTENSION, GSYM real_lte, NOT_IN_EMPTY]
7308 >> DISJ2_TAC
7309 >> MATCH_MP_TAC REAL_LT_IMP_LE
7310 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
7311QED
7312
7313(* M and m are extreal-valued. This form is used by WLLN_IID directly. *)
7314Theorem converge_PR_to_limit' :
7315    !p X M m. prob_space p /\ (!n. real_random_variable (X n) p) /\
7316              (!n. M n <> PosInf /\ M n <> NegInf) /\ m <> PosInf /\ m <> NegInf /\
7317              ((real o M) --> real m) sequentially /\
7318              ((\n x. X n x - M n) --> (\x. 0)) (in_probability p) ==>
7319              (X --> (\x. m)) (in_probability p)
7320Proof
7321    rpt STRIP_TAC
7322 >> ‘?r. m = Normal r’ by METIS_TAC [extreal_cases] >> fs []
7323 >> MATCH_MP_TAC converge_PR_to_limit
7324 >> Q.EXISTS_TAC ‘real o M’ >> art []
7325 >> Suff ‘((\n x. X n x - Normal ((real o M) n)) --> (\x. 0)) (in_probability p) <=>
7326          ((\n x. X n x - M n) --> (\x. 0)) (in_probability p)’ >- rw []
7327 >> MATCH_MP_TAC converge_PR_cong
7328 >> Q.EXISTS_TAC ‘0’ >> rw [normal_real]
7329QED
7330
7331Theorem converge_AE_add_to_zero :
7332    !p X Y. prob_space p /\
7333           (!n. real_random_variable (X n) p) /\
7334           (!n. real_random_variable (Y n) p) /\
7335           (X --> (\x. 0)) (almost_everywhere p) /\
7336           (Y --> (\x. 0)) (almost_everywhere p) ==>
7337       ((\n x. X n x + Y n x) --> (\x. 0)) (almost_everywhere p)
7338Proof
7339    rpt STRIP_TAC
7340 >> NTAC 2 (POP_ASSUM MP_TAC)
7341 >> ‘real_random_variable (\x. 0) p’ by PROVE_TAC [real_random_variable_zero]
7342 >> Know ‘!n. real_random_variable (\x. X n x + Y n x) p’
7343 >- (Q.X_GEN_TAC ‘n’ \\
7344     MP_TAC (Q.SPECL [‘p’, ‘X (n :num)’, ‘Y (n :num)’] real_random_variable_add) \\
7345     rw [])
7346 >> DISCH_TAC
7347 >> rw [converge_AE_def, AE_DEF, LIM_SEQUENTIALLY, dist, p_space_def]
7348 >> Q.EXISTS_TAC ‘N UNION N'’
7349 >> STRONG_CONJ_TAC
7350 >- (MATCH_MP_TAC (REWRITE_RULE [IN_APP] NULL_SET_UNION) \\
7351     FULL_SIMP_TAC std_ss [prob_space_def])
7352 >> rw []
7353 >> Q.PAT_X_ASSUM ‘!x. x IN m_space p /\ x NOTIN N ==> P’ (MP_TAC o (Q.SPEC ‘x’))
7354 >> RW_TAC std_ss []
7355 >> Q.PAT_X_ASSUM ‘!x. x IN m_space p /\ x NOTIN N' ==> P’ (MP_TAC o (Q.SPEC ‘x’))
7356 >> RW_TAC std_ss []
7357 >> ‘0 < e / 2’ by rw [REAL_LT_DIV]
7358 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e / 2’))
7359 >> RW_TAC std_ss []
7360 >> rename1 ‘!n. N1 <= n ==> abs (real (Y n x)) < e / 2’
7361 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e / 2’))
7362 >> RW_TAC std_ss []
7363 >> rename1 ‘!n. N2 <= n ==> abs (real (X n x)) < e / 2’
7364 >> Q.EXISTS_TAC ‘MAX N1 N2’
7365 >> rw [MAX_LE]
7366 >> Q.PAT_X_ASSUM ‘!n. N1 <= n ==> P’ (MP_TAC o (Q.SPEC ‘n’))
7367 >> RW_TAC std_ss []
7368 >> Q.PAT_X_ASSUM ‘!n. N2 <= n ==> P’ (MP_TAC o (Q.SPEC ‘n’))
7369 >> RW_TAC std_ss []
7370 >> FULL_SIMP_TAC std_ss [real_random_variable_def, p_space_def]
7371 >> ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases]
7372 >> POP_ASSUM (FULL_SIMP_TAC std_ss o wrap)
7373 >> ‘?b. Y n x = Normal b’ by METIS_TAC [extreal_cases]
7374 >> POP_ASSUM (FULL_SIMP_TAC std_ss o wrap)
7375 >> FULL_SIMP_TAC std_ss [extreal_add_def, real_normal]
7376 >> MATCH_MP_TAC REAL_LET_TRANS
7377 >> Q.EXISTS_TAC ‘abs a + abs b’
7378 >> REWRITE_TAC [ABS_TRIANGLE]
7379 >> GEN_REWRITE_TAC (RAND_CONV o ONCE_DEPTH_CONV) empty_rewrites [GSYM REAL_HALF_DOUBLE]
7380 >> MATCH_MP_TAC REAL_LT_ADD2 >> art []
7381QED
7382
7383Theorem converge_AE_add :
7384    !p X Y A B. prob_space p /\
7385               (!n. real_random_variable (X n) p) /\
7386                real_random_variable A p /\ (X --> A) (almost_everywhere p) /\
7387               (!n. real_random_variable (Y n) p) /\
7388                real_random_variable B p /\ (Y --> B) (almost_everywhere p) ==>
7389       ((\n x. X n x + Y n x) --> (\x. A x + B x)) (almost_everywhere p)
7390Proof
7391    rpt STRIP_TAC
7392 >> Know ‘(X --> A) (almost_everywhere p) <=>
7393          ((\n x. X n x - A x) --> (\x. 0)) (almost_everywhere p)’
7394 >- (MATCH_MP_TAC converge_AE_to_zero >> art [])
7395 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7396 >> Know ‘(Y --> B) (almost_everywhere p) <=>
7397          ((\n x. Y n x - B x) --> (\x. 0)) (almost_everywhere p)’
7398 >- (MATCH_MP_TAC converge_AE_to_zero >> art [])
7399 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7400 >> Know ‘((\n x. X n x + Y n x) --> (\x. A x + B x)) (almost_everywhere p) <=>
7401          ((\n x. X n x + Y n x - (A x + B x)) --> (\x. 0)) (almost_everywhere p)’
7402 >- (MATCH_MP_TAC converge_AE_to_zero' >> rw [] >| (* 2 subgoals *)
7403     [ (* goal 1 (of 2) *)
7404       MATCH_MP_TAC real_random_variable_add >> art [],
7405       (* goal 2 (of 2) *)
7406       MATCH_MP_TAC real_random_variable_add >> art [] ])
7407 >> Rewr'
7408 >> Know ‘((\n x. (X n x - A x) + (Y n x - B x)) --> (\x. 0)) (almost_everywhere p)’
7409 >- (HO_MATCH_MP_TAC converge_AE_add_to_zero >> rw [] >| (* 2 subgoals *)
7410     [ (* goal 1 (of 2) *)
7411       MATCH_MP_TAC real_random_variable_sub >> art [],
7412       (* goal 2 (of 2) *)
7413       MATCH_MP_TAC real_random_variable_sub >> art [] ])
7414 >> DISCH_TAC
7415 >> Suff ‘((\n x. X n x + Y n x - (A x + B x)) --> (\x. 0)) (almost_everywhere p) <=>
7416          ((\n x. X n x - A x + (Y n x - B x)) --> (\x. 0)) (almost_everywhere p)’
7417 >- DISCH_THEN (art o wrap)
7418 >> MATCH_MP_TAC converge_AE_cong
7419 >> Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss []
7420 >> FULL_SIMP_TAC std_ss [real_random_variable_def]
7421 >> ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW
7422 >> ‘?b. Y n x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW
7423 >> ‘?c. A x = Normal c’ by METIS_TAC [extreal_cases] >> POP_ORW
7424 >> ‘?d. B x = Normal d’ by METIS_TAC [extreal_cases] >> POP_ORW
7425 >> rw [extreal_add_def, extreal_sub_def, extreal_11]
7426 >> REAL_ARITH_TAC
7427QED
7428
7429Theorem converge_AE_ainv_to_zero :
7430    !p X. (!n. real_random_variable (X n) p) /\
7431          (X --> (\x. 0)) (almost_everywhere p) ==>
7432          ((\n x. -X n x) --> (\x. 0)) (almost_everywhere p)
7433Proof
7434    rw [converge_AE, AE_DEF, EXTREAL_LIM_SEQUENTIALLY,
7435        real_random_variable_def, p_space_def]
7436 >> Q.EXISTS_TAC ‘N’ >> rw []
7437 >> Q.PAT_X_ASSUM ‘!x. x IN m_space p /\ x NOTIN N ==> P’ (MP_TAC o (Q.SPEC ‘x’))
7438 >> RW_TAC std_ss []
7439 >> Q.PAT_X_ASSUM ‘!e. 0 < e ==> P’ (MP_TAC o (Q.SPEC ‘e’))
7440 >> RW_TAC std_ss []
7441 >> rename1 ‘!n. M <= n ==> dist extreal_mr1 (X n x,0) < e’
7442 >> Q.EXISTS_TAC ‘M’ >> rw []
7443 >> Q.PAT_X_ASSUM ‘!n. M <= n ==> P’ (MP_TAC o (Q.SPEC ‘n’))
7444 >> RW_TAC std_ss []
7445 >> POP_ASSUM MP_TAC (* dist extreal_mr1 (X n x,0) < e *)
7446 >> ‘?r. X n x = Normal r’ by METIS_TAC [extreal_cases]
7447 >> POP_ORW
7448 >> ‘0 = Normal 0’ by rw [extreal_of_num_def]
7449 >> POP_ORW
7450 >> rw [extreal_ainv_def, extreal_mr1_normal]
7451QED
7452
7453Theorem converge_AE_ainv :
7454    !p X Y. prob_space p /\ (!n. real_random_variable (X n) p) /\
7455            real_random_variable Y p /\
7456            (X --> Y) (almost_everywhere p) ==>
7457         ((\n x. -X n x) --> (\x. -Y x)) (almost_everywhere p)
7458Proof
7459    rpt STRIP_TAC
7460 >> Know ‘(X --> Y) (almost_everywhere p) <=>
7461          ((\n x. X n x - Y x) --> (\x. 0)) (almost_everywhere p)’
7462 >- (MATCH_MP_TAC converge_AE_to_zero >> art [])
7463 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7464 >> Know ‘((\n x. -X n x) --> (\x. -Y x)) (almost_everywhere p) <=>
7465          ((\n x. (\n x. -X n x) n x - (\x. -Y x) x) --> (\x. 0)) (almost_everywhere p)’
7466 >- (MATCH_MP_TAC converge_AE_to_zero >> rw [] >| (* 2 subgoals *)
7467     [ MATCH_MP_TAC real_random_variable_ainv >> art [],
7468       MATCH_MP_TAC real_random_variable_ainv >> art [] ])
7469 >> Rewr'
7470 >> BETA_TAC
7471 >> Know ‘((\n x. -X n x - -Y x) --> (\x. 0)) (almost_everywhere p) <=>
7472          ((\n x. -(X n x - Y x)) --> (\x. 0)) (almost_everywhere p)’
7473 >- (MATCH_MP_TAC converge_AE_cong \\
7474     Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss [] \\
7475     FULL_SIMP_TAC std_ss [real_random_variable_def] \\
7476    ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7477    ‘?b. Y x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7478     rw [extreal_ainv_def, extreal_sub_def] \\
7479     REAL_ARITH_TAC)
7480 >> Rewr'
7481 >> HO_MATCH_MP_TAC converge_AE_ainv_to_zero >> rw []
7482 >> MATCH_MP_TAC real_random_variable_sub >> art []
7483QED
7484
7485Theorem converge_AE_sub :
7486    !p X Y A B. prob_space p /\
7487               (!n. real_random_variable (X n) p) /\
7488                real_random_variable A p /\ (X --> A) (almost_everywhere p) /\
7489               (!n. real_random_variable (Y n) p) /\
7490                real_random_variable B p /\ (Y --> B) (almost_everywhere p) ==>
7491       ((\n x. X n x - Y n x) --> (\x. A x - B x)) (almost_everywhere p)
7492Proof
7493    rpt STRIP_TAC
7494 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘\n x. -Y n x’, ‘A’, ‘\x. -B x’] converge_AE_add)
7495 >> BETA_TAC >> art []
7496 >> Know ‘((\n x. X n x + -Y n x) --> (\x. A x + -B x)) (almost_everywhere p) <=>
7497          ((\n x. X n x - Y n x) --> (\x. A x - B x)) (almost_everywhere p)’
7498 >- (MATCH_MP_TAC converge_AE_cong_full \\
7499     FULL_SIMP_TAC std_ss [real_random_variable_def] \\
7500     Q.EXISTS_TAC ‘0’ >> RW_TAC arith_ss [] >| (* 2 subgoals *)
7501     [ (* goal 1 (of 2) *)
7502      ‘?a. X n x = Normal a’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7503      ‘?b. Y n x = Normal b’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7504       rw [extreal_ainv_def, extreal_add_def, extreal_sub_def] \\
7505       REAL_ARITH_TAC,
7506       (* goal 2 (of 2) *)
7507      ‘?c. A x = Normal c’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7508      ‘?d. B x = Normal d’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7509       rw [extreal_ainv_def, extreal_add_def, extreal_sub_def] \\
7510       REAL_ARITH_TAC ])
7511 >> Rewr'
7512 >> Know ‘!n. real_random_variable (\x. -Y n x) p’
7513 >- (GEN_TAC >> MATCH_MP_TAC real_random_variable_ainv >> art [])
7514 >> Know ‘real_random_variable (\x. -B x) p’
7515 >- (MATCH_MP_TAC real_random_variable_ainv >> art [])
7516 >> Know ‘((\n x. -Y n x) --> (\x. -B x)) (almost_everywhere p)’
7517 >- (MATCH_MP_TAC converge_AE_ainv >> art [])
7518 >> RW_TAC std_ss []
7519QED
7520
7521Theorem converge_AE_to_limit :
7522    !p X M m. prob_space p /\ (!n. real_random_variable (X n) p) /\
7523              (M --> m) sequentially /\
7524              ((\n x. X n x - Normal (M n)) --> (\x. 0)) (almost_everywhere p) ==>
7525              (X --> (\x. Normal m)) (almost_everywhere p)
7526Proof
7527    rpt STRIP_TAC
7528 (* applying converge_PR_cong_full *)
7529 >> Know ‘(X --> (\x. Normal m)) (almost_everywhere p) <=>
7530          ((\n x. X n x - Normal (M n) + Normal (M n)) --> (\x. 0 + Normal m))
7531           (almost_everywhere p)’
7532 >- (MATCH_MP_TAC converge_AE_cong_full \\
7533     Q.EXISTS_TAC ‘0’ >> rw [sub_add_normal]) >> Rewr'
7534 >> HO_MATCH_MP_TAC converge_AE_add
7535 >> rw [real_random_variable_zero, real_random_variable_const]
7536 >- (HO_MATCH_MP_TAC real_random_variable_sub \\
7537     rw [real_random_variable_const] \\
7538    ‘(\x. X n x) = X n’ by METIS_TAC [] >> POP_ASSUM (art o wrap))
7539 >> Q.PAT_X_ASSUM ‘!n. real_random_variable (X n) p’ K_TAC
7540 >> POP_ASSUM K_TAC (* (X n x - M n) --> 0 *)
7541 (* stage work, now ‘X n’ disappeared, left only M and m *)
7542 >> POP_ASSUM MP_TAC
7543 >> qabbrev_tac ‘X = \n x. Normal (M n)’
7544 >> qabbrev_tac ‘Y = \x. Normal m’
7545 >> Know ‘(!n. real_random_variable (X n) p) /\ real_random_variable Y p’
7546 >- (rw [real_random_variable, Abbr ‘X’, Abbr ‘Y’] \\
7547     MATCH_MP_TAC IN_MEASURABLE_BOREL_CONST' \\
7548     fs [prob_space_def, measure_space_def, p_space_def, events_def])
7549 >> STRIP_TAC
7550 >> rw [converge_AE_def, AE_DEF, null_set_def, LIM_SEQUENTIALLY, dist]
7551 >> Q.EXISTS_TAC ‘{}’
7552 >> FULL_SIMP_TAC std_ss [prob_space_def]
7553 >> ASM_SIMP_TAC std_ss [MEASURE_SPACE_EMPTY_MEASURABLE, MEASURE_EMPTY]
7554 >> rw [Abbr ‘X’, Abbr ‘Y’]
7555QED
7556
7557(* M and m are extreal-valued. This form is used by WLLN_IID directly. *)
7558Theorem converge_AE_to_limit' :
7559    !p X M m. prob_space p /\ (!n. real_random_variable (X n) p) /\
7560              (!n. M n <> PosInf /\ M n <> NegInf) /\ m <> PosInf /\ m <> NegInf /\
7561              ((real o M) --> real m) sequentially /\
7562              ((\n x. X n x - M n) --> (\x. 0)) (almost_everywhere p) ==>
7563              (X --> (\x. m)) (almost_everywhere p)
7564Proof
7565    rpt STRIP_TAC
7566 >> ‘?r. m = Normal r’ by METIS_TAC [extreal_cases] >> fs []
7567 >> MATCH_MP_TAC converge_AE_to_limit
7568 >> Q.EXISTS_TAC ‘real o M’ >> art []
7569 >> Suff ‘((\n x. X n x - Normal ((real o M) n)) --> (\x. 0)) (almost_everywhere p) <=>
7570          ((\n x. X n x - M n) --> (\x. 0)) (almost_everywhere p)’ >- rw []
7571 >> MATCH_MP_TAC converge_AE_cong
7572 >> Q.EXISTS_TAC ‘0’ >> rw [normal_real]
7573QED
7574
7575(* ========================================================================= *)
7576(*                  Advanced estimations of expectations                     *)
7577(* ========================================================================= *)
7578
7579Theorem PROB_ZERO_AE :
7580    !p E. prob_space p /\ E IN events p /\ (prob p E = 0) ==> AE x::p. x NOTIN E
7581Proof
7582    RW_TAC std_ss [AE_DEF, null_set_def]
7583 >> Q.EXISTS_TAC `E`
7584 >> fs [prob_space_def, events_def, prob_def]
7585QED
7586
7587Theorem PROB_ZERO_AE_EQ :
7588    !p E. prob_space p /\ E IN events p ==> (prob p E = 0 <=> AE x::p. x NOTIN E)
7589Proof
7590    rpt STRIP_TAC
7591 >> EQ_TAC >- (DISCH_TAC >> MATCH_MP_TAC PROB_ZERO_AE >> art [])
7592 >> RW_TAC std_ss [AE_DEF, null_set_def]
7593 >> fs [prob_space_def, events_def, prob_def]
7594 >> Know ‘E SUBSET N’
7595 >- (rw [SUBSET_DEF] \\
7596    ‘x IN m_space p’ by PROVE_TAC [MEASURE_SPACE_IN_MSPACE] \\
7597     METIS_TAC [])
7598 >> DISCH_TAC
7599 >> reverse (rw [GSYM le_antisym])
7600 >- (‘positive p’ by PROVE_TAC [MEASURE_SPACE_POSITIVE] \\
7601     fs [positive_def])
7602 >> Q.PAT_X_ASSUM ‘measure p N = 0’ (ONCE_REWRITE_TAC o wrap o (MATCH_MP EQ_SYM))
7603 >> MATCH_MP_TAC INCREASING >> art []
7604 >> MATCH_MP_TAC MEASURE_SPACE_INCREASING >> art []
7605QED
7606
7607Theorem PROB_ONE_AE :
7608    !p E. prob_space p /\ E IN events p /\ (prob p E = 1) ==> AE x::p. x IN E
7609Proof
7610    RW_TAC std_ss [AE_DEF, null_set_def]
7611 >> Q.EXISTS_TAC `m_space p DIFF E`
7612 >> `E SUBSET p_space p` by PROVE_TAC [PROB_SPACE_SUBSET_PSPACE]
7613 >> `p_space p DIFF (p_space p DIFF E) = E` by ASM_SET_TAC []
7614 >> Know `prob p (p_space p DIFF E) = 1 - prob p E`
7615 >- (MATCH_MP_TAC PROB_COMPL >> art [])
7616 >> DISCH_TAC
7617 >> FULL_SIMP_TAC std_ss [prob_space_def, events_def, prob_def, p_space_def,
7618                          sub_refl, extreal_not_infty, extreal_of_num_def]
7619 >> MATCH_MP_TAC MEASURE_SPACE_COMPL >> art []
7620QED
7621
7622Theorem PROB_ONE_AE_EQ :
7623    !p E. prob_space p /\ E IN events p ==> (prob p E = 1 <=> AE x::p. x IN E)
7624Proof
7625    rpt STRIP_TAC
7626 >> EQ_TAC >- (DISCH_TAC >> MATCH_MP_TAC PROB_ONE_AE >> art [])
7627 >> RW_TAC std_ss [AE_DEF, null_set_def]
7628 >> fs [prob_space_def, events_def, prob_def]
7629 >> Q.ABBREV_TAC ‘E' = m_space p DIFF E’
7630 >> ‘E' IN measurable_sets p’ by METIS_TAC [MEASURE_SPACE_COMPL]
7631 >> Know ‘E = m_space p DIFF E'’
7632 >- (rw [Once EXTENSION, Abbr ‘E'’] \\
7633     EQ_TAC >> rw [] \\
7634     PROVE_TAC [MEASURE_SPACE_IN_MSPACE])
7635 >> Rewr'
7636 >> Know ‘measure p (m_space p DIFF E') = measure p (m_space p) - measure p E'’
7637 >- (MATCH_MP_TAC MEASURE_COMPL >> rw [Abbr ‘E'’] \\
7638     MATCH_MP_TAC let_trans \\
7639     Q.EXISTS_TAC ‘measure p (m_space p)’ \\
7640     reverse CONJ_TAC >- rw [lt_infty, extreal_of_num_def] \\
7641     MATCH_MP_TAC INCREASING >> rw []
7642     >- (MATCH_MP_TAC MEASURE_SPACE_INCREASING >> art []) \\
7643     MATCH_MP_TAC MEASURE_SPACE_SPACE >> art [])
7644 >> Rewr'
7645 >> Suff ‘measure p E' = 0’ >- rw []
7646 >> reverse (rw [GSYM le_antisym])
7647 >- (‘positive p’ by PROVE_TAC [MEASURE_SPACE_POSITIVE] \\
7648     fs [positive_def])
7649 >> Q.PAT_X_ASSUM ‘measure p N = 0’ (ONCE_REWRITE_TAC o wrap o (MATCH_MP EQ_SYM))
7650 >> Know ‘E' SUBSET N’
7651 >- (rw [SUBSET_DEF, Abbr ‘E'’] >> METIS_TAC [])
7652 >> DISCH_TAC
7653 >> MATCH_MP_TAC INCREASING >> art []
7654 >> MATCH_MP_TAC MEASURE_SPACE_INCREASING >> art []
7655QED
7656
7657(* Theorem 3.2.1, Part I [2, p.45] *)
7658Theorem expectation_bounds :
7659    !p X. prob_space p /\ real_random_variable X p ==>
7660          suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) <=
7661          expectation p (abs o X) /\ expectation p (abs o X) <= 1 +
7662          suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)})
7663Proof
7664    rpt GEN_TAC >> STRIP_TAC
7665 >> ‘sigma_algebra (measurable_space p)’
7666      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
7667 >> Q.ABBREV_TAC ‘A = \n. {x | x IN p_space p /\ &n <= abs (X x) /\ abs (X x) < &SUC n}’
7668 >> Know ‘!n. A n IN events p’
7669 >- (RW_TAC std_ss [Abbr ‘A’] \\
7670    ‘{x | x IN p_space p /\ &n <= abs (X x) /\ abs (X x) < &SUC n} =
7671       ({x | &n <= abs (X x)} INTER p_space p) INTER
7672       ({x | abs (X x) < &SUC n} INTER p_space p)’ by SET_TAC [] >> POP_ORW \\
7673     MATCH_MP_TAC EVENTS_INTER >> rw [le_abs_bounds, abs_bounds_lt] >| (* 2 subgoals *)
7674     [ (* goal 1 (of 2) *)
7675      ‘{x | X x <= -&n \/ &n <= X x} INTER p_space p =
7676         ({x | X x <= -&n} INTER p_space p) UNION
7677         ({x | &n <= X x} INTER p_space p)’ by SET_TAC [] >> POP_ORW \\
7678       MATCH_MP_TAC EVENTS_UNION \\
7679       FULL_SIMP_TAC std_ss [prob_space_def, p_space_def, events_def,
7680                             real_random_variable] \\
7681       METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE],
7682       (* goal 2 (of 2) *)
7683      ‘{x | -&SUC n < X x /\ X x < &SUC n} INTER p_space p =
7684         ({x | -&SUC n < X x} INTER p_space p) INTER
7685         ({x | X x < &SUC n} INTER p_space p)’ by SET_TAC [] >> POP_ORW \\
7686       MATCH_MP_TAC EVENTS_INTER \\
7687       FULL_SIMP_TAC std_ss [prob_space_def, p_space_def, events_def,
7688                             real_random_variable] \\
7689       METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE] ]) >> DISCH_TAC
7690 >> Know ‘BIGUNION (IMAGE A UNIV) = p_space p’
7691 >- (rw [Once EXTENSION, IN_BIGUNION_IMAGE, Abbr ‘A’] \\
7692     EQ_TAC >> STRIP_TAC >> fs [real_random_variable_def] \\
7693    ‘?r. X x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7694     REWRITE_TAC [extreal_abs_def, extreal_of_num_def, extreal_lt_eq, extreal_le_eq] \\
7695     MP_TAC (Q.SPEC ‘1’ REAL_ARCH_LEAST) >> rw []) >> DISCH_TAC
7696 >> Know ‘!m n. m <> n ==> DISJOINT (A m) (A n)’
7697 >- (rw [Abbr ‘A’, DISJOINT_ALT] \\
7698     STRONG_DISJ_TAC >> REWRITE_TAC [extreal_lt_def] \\
7699     rename1 ‘&SUC n <= abs (X y)’ \\
7700    ‘m < n \/ n < m’ by RW_TAC arith_ss [] >| (* 2 subgoals *)
7701     [ (* goal 1 (of 2) *)
7702      ‘SUC m <= n’ by RW_TAC arith_ss [] \\
7703      ‘&SUC m <= (&n) :extreal’ by rw [extreal_of_num_def, extreal_le_eq] \\
7704      ‘abs (X y) < &n’ by PROVE_TAC [lte_trans] \\
7705       METIS_TAC [let_antisym],
7706       (* goal 2 (of 2) *)
7707      ‘SUC n <= m’ by RW_TAC arith_ss [] \\
7708      ‘&SUC n <= (&m) :extreal’ by rw [extreal_of_num_def, extreal_le_eq] \\
7709       METIS_TAC [le_trans] ]) >> DISCH_TAC
7710 >> Know ‘expectation p (abs o X) =
7711          suminf (\n. pos_fn_integral p (\x. abs (X x) * indicator_fn (A n) x))’
7712 >- (REWRITE_TAC [expectation_def] \\
7713     Know ‘integral p (abs o X) = pos_fn_integral p (abs o X)’
7714     >- (MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, abs_pos]) >> Rewr' \\
7715     Know ‘pos_fn_integral p (abs o X) =
7716           pos_fn_integral p (\x. (abs o X) x * indicator_fn (p_space p) x)’
7717     >- (REWRITE_TAC [p_space_def] >> MATCH_MP_TAC pos_fn_integral_mspace \\
7718         fs [prob_space_def, abs_pos]) >> Rewr' \\
7719     SIMP_TAC std_ss [o_DEF] \\
7720     Q.PAT_X_ASSUM ‘_ = p_space p’ (ONCE_REWRITE_TAC o wrap o SYM) \\
7721     Q.ABBREV_TAC ‘f = \n x. abs (X x) * indicator_fn (A n) x’ \\
7722     fs [real_random_variable_def, p_space_def] \\
7723     Know ‘pos_fn_integral p (\x. abs (X x) * indicator_fn (BIGUNION (IMAGE A UNIV)) x) =
7724           pos_fn_integral p (\x. suminf (\n. f n x))’
7725     >- (MATCH_MP_TAC pos_fn_integral_cong >> fs [prob_space_def] \\
7726         CONJ_TAC >- (rpt STRIP_TAC \\
7727                      MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
7728         CONJ_TAC >- (rpt STRIP_TAC \\
7729                      MATCH_MP_TAC ext_suminf_pos >> rw [Abbr ‘f’] \\
7730                      MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
7731         rw [Abbr ‘f’] \\
7732        ‘?r. X x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
7733         REWRITE_TAC [extreal_abs_def] \\
7734         Know ‘suminf (\n. Normal (abs r) * indicator_fn (A n) x) =
7735               Normal (abs r) * suminf (\n. indicator_fn (A n) x)’
7736         >- (HO_MATCH_MP_TAC ext_suminf_cmul \\
7737             rw [extreal_of_num_def, extreal_le_eq, INDICATOR_FN_POS]) >> Rewr' \\
7738         Suff ‘indicator_fn (BIGUNION (IMAGE A UNIV)) x =
7739               suminf (\n. indicator_fn (A n) x)’ >- rw [] \\
7740         MATCH_MP_TAC EQ_SYM >> MATCH_MP_TAC indicator_fn_suminf >> rw []) >> Rewr' \\
7741    ‘!n x. abs (X x) * indicator_fn (A n) x = f n x’ by METIS_TAC [] >> POP_ORW \\
7742    ‘!n. (\x. f n x) = f n’ by METIS_TAC [ETA_THM] >> POP_ORW \\
7743     MATCH_MP_TAC pos_fn_integral_suminf \\
7744     fs [prob_space_def, Abbr ‘f’] \\
7745     CONJ_TAC >- (rpt STRIP_TAC \\
7746                  MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
7747     Q.X_GEN_TAC ‘n’ \\
7748     HO_MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
7749     CONJ_TAC >- FULL_SIMP_TAC std_ss [measure_space_def] \\
7750     CONJ_TAC >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS \\
7751                  Q.EXISTS_TAC ‘X’ \\
7752                  fs [random_variable_def, p_space_def, events_def, measure_space_def]) \\
7753     FULL_SIMP_TAC std_ss [subsets_def, events_def]) >> DISCH_TAC
7754 >> Know ‘suminf (\n. &n * prob p (A n)) <= expectation p (abs o X)’
7755 >- (POP_ORW \\
7756     MATCH_MP_TAC ext_suminf_mono >> rw []
7757     >- (MATCH_MP_TAC le_mul \\
7758         CONJ_TAC >- rw [extreal_of_num_def, extreal_le_eq] \\
7759         MATCH_MP_TAC PROB_POSITIVE >> art []) \\
7760     Know ‘prob p (A n) = pos_fn_integral p (indicator_fn (A n))’
7761     >- (fs [prob_space_def, prob_def, events_def, Once EQ_SYM_EQ] \\
7762         MATCH_MP_TAC pos_fn_integral_indicator >> art []) >> Rewr' \\
7763     Know ‘&n * pos_fn_integral p (indicator_fn (A n)) =
7764           pos_fn_integral p (\x. &n * indicator_fn (A n) x)’
7765     >- (fs [prob_space_def, extreal_of_num_def, events_def, Once EQ_SYM_EQ] \\
7766         MATCH_MP_TAC pos_fn_integral_cmul >> rw [INDICATOR_FN_POS]) >> Rewr' \\
7767     MATCH_MP_TAC pos_fn_integral_mono >> rw []
7768     >- (MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS, extreal_of_num_def, extreal_le_eq]) \\
7769     reverse (Cases_on ‘x IN (A n)’)
7770     >- rw [indicator_fn_def, mul_rzero, le_refl] \\
7771     POP_ASSUM MP_TAC >> rw [Abbr ‘A’, indicator_fn_def, mul_rone]) >> DISCH_TAC
7772 >> Know ‘expectation p (abs o X) <= suminf (\n. &SUC n * prob p (A n))’
7773 >- (Q.PAT_X_ASSUM ‘expectation p (abs o X) = _’ (ONCE_REWRITE_TAC o wrap) \\
7774     MATCH_MP_TAC ext_suminf_mono >> rw []
7775     >- (MATCH_MP_TAC pos_fn_integral_pos >> fs [prob_space_def] \\
7776         rpt STRIP_TAC >> MATCH_MP_TAC le_mul \\
7777         rw [abs_pos, INDICATOR_FN_POS]) \\
7778     Know ‘prob p (A n) = pos_fn_integral p (indicator_fn (A n))’
7779     >- (fs [prob_space_def, prob_def, events_def, Once EQ_SYM_EQ] \\
7780         MATCH_MP_TAC pos_fn_integral_indicator >> art []) >> Rewr' \\
7781     Know ‘&SUC n * pos_fn_integral p (indicator_fn (A n)) =
7782           pos_fn_integral p (\x. &SUC n * indicator_fn (A n) x)’
7783     >- (fs [prob_space_def, extreal_of_num_def, events_def, Once EQ_SYM_EQ] \\
7784         MATCH_MP_TAC pos_fn_integral_cmul >> rw [INDICATOR_FN_POS]) >> Rewr' \\
7785     MATCH_MP_TAC pos_fn_integral_mono >> rw []
7786     >- (MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS, abs_pos]) \\
7787     reverse (Cases_on ‘x IN (A n)’)
7788     >- rw [indicator_fn_def, mul_rzero, le_refl] \\
7789     POP_ASSUM MP_TAC >> rw [Abbr ‘A’, indicator_fn_def, mul_rone] \\
7790     MATCH_MP_TAC lt_imp_le >> art []) >> DISCH_TAC
7791 >> Know ‘suminf (\n. &SUC n * prob p (A n)) = 1 + suminf (\n. &n * prob p (A n))’
7792 >- (Know ‘!n. &SUC n = (1 :extreal) + &n’
7793     >- (GEN_TAC >> ‘SUC n = 1 + n’ by RW_TAC arith_ss [] \\
7794         rw [extreal_of_num_def, extreal_add_def, extreal_11]) >> Rewr' \\
7795     Know ‘!n. (1 + &n) * prob p (A n) = 1 * prob p (A n) + &n * prob p (A n)’
7796     >- (GEN_TAC >> ONCE_REWRITE_TAC [mul_comm] \\
7797         MATCH_MP_TAC add_ldistrib_pos >> REWRITE_TAC [le_01] \\
7798         rw [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
7799     REWRITE_TAC [mul_lone] \\
7800     Know ‘suminf (\n. prob p (A n) + &n * prob p (A n)) =
7801           suminf (\n. prob p (A n)) + suminf (\n. &n * prob p (A n))’
7802     >- (HO_MATCH_MP_TAC ext_suminf_add \\
7803         GEN_TAC >> STRONG_CONJ_TAC >- (MATCH_MP_TAC PROB_POSITIVE >> art []) \\
7804         DISCH_TAC >> MATCH_MP_TAC le_mul >> art [] \\
7805         rw [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
7806     Know ‘suminf (prob p o A) = prob p (BIGUNION (IMAGE A UNIV))’
7807     >- (MATCH_MP_TAC EQ_SYM \\
7808         MATCH_MP_TAC PROB_COUNTABLY_ADDITIVE >> rw [IN_FUNSET, IN_UNIV]) \\
7809     REWRITE_TAC [o_DEF] >> Rewr' \\
7810     Q.PAT_X_ASSUM ‘BIGUNION (IMAGE A UNIV) = p_space p’ (ONCE_REWRITE_TAC o wrap) \\
7811     simp [PROB_UNIV])
7812 >> Q.PAT_X_ASSUM ‘expectation p (abs o X) = _’ K_TAC
7813 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
7814 >> Suff ‘suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) =
7815          suminf (\n. &n * prob p (A n))’
7816 >- (Rewr' >> art [])
7817 >> ONCE_REWRITE_TAC [EQ_SYM_EQ]
7818 (* stage work *)
7819 >> Q.ABBREV_TAC ‘B = \n. {x | x IN p_space p /\ &n <= abs (X x)}’
7820 >> Know ‘!n. B n IN events p’
7821 >- (RW_TAC std_ss [Abbr ‘B’] \\
7822     fs [prob_space_def, p_space_def, events_def, real_random_variable, le_abs_bounds] \\
7823    ‘{x | x IN m_space p /\ (X x <= -&n \/ &n <= X x)} =
7824       ({x | X x <= -&n} INTER m_space p) UNION
7825       ({x | &n <= X x} INTER m_space p)’ by SET_TAC [] >> POP_ORW \\
7826     MATCH_MP_TAC MEASURE_SPACE_UNION >> art [] \\
7827     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE]) >> DISCH_TAC
7828 >> Know ‘!m n. m <= n ==> B n SUBSET B m’
7829 >- (rw [Abbr ‘B’, SUBSET_DEF] \\
7830     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘&n’ >> art [] \\
7831     rw [extreal_of_num_def, extreal_le_eq]) >> DISCH_TAC
7832 >> Q.ABBREV_TAC ‘f = \n. prob p (B n)’
7833 >> ‘!n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)} = f (SUC n)’ by METIS_TAC []
7834 >> POP_ORW
7835 (* new goal: suminf (\n. &n * prob p (A n)) = suminf (\n. f (SUC n)) *)
7836 >> Know ‘!n. 0 <= f n’
7837 >- (rw [Abbr ‘f’] \\
7838     MATCH_MP_TAC PROB_POSITIVE >> art []) >> DISCH_TAC
7839 >> Know ‘!n. 0 <= &n * prob p (A n)’
7840 >- (GEN_TAC >> MATCH_MP_TAC le_mul \\
7841     CONJ_TAC >- rw [extreal_of_num_def, extreal_le_eq] \\
7842     MATCH_MP_TAC PROB_POSITIVE >> art []) >> DISCH_TAC
7843 >> Know ‘!n. f n <> PosInf /\ f n <> NegInf’
7844 >- (GEN_TAC >> Q.UNABBREV_TAC ‘f’ \\
7845     METIS_TAC [PROB_FINITE]) >> DISCH_TAC
7846 (* stage work *)
7847 >> Know ‘!N. 0 < N ==> (SIGMA (\n. &n * prob p (A n)) (count N) =
7848                         SIGMA (\n. f (SUC n)) (count (PRE N)) - &PRE N * f N)’
7849 >- (rpt STRIP_TAC \\
7850     Know ‘!n. prob p (A n) = f n - f (SUC n)’
7851     >- (RW_TAC std_ss [Abbr ‘f’, Abbr ‘B’] \\
7852         Know ‘A n = {x | x IN p_space p /\ &n <= abs (X x)} DIFF
7853                     {x | x IN p_space p /\ &SUC n <= abs (X x)}’
7854         >- (rw [Once EXTENSION, extreal_lt_def, Abbr ‘A’] >> SET_TAC []) >> Rewr' \\
7855         MATCH_MP_TAC PROB_DIFF_SUBSET >> art [] \\
7856         fs [SUBSET_DEF, GSPECIFICATION] \\
7857         rpt STRIP_TAC \\
7858         MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘&SUC n’ >> art [] \\
7859         rw [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
7860     Know ‘!n. &n * (f n - f (SUC n)) = &n * f n - &n * f (SUC n)’
7861     >- (GEN_TAC >> MATCH_MP_TAC sub_ldistrib \\
7862         rw [extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
7863     Know ‘SIGMA (\n. (\n. &n * f n) n - (\n. &n * f (SUC n)) n) (count N) =
7864           SIGMA (\n. &n * f n) (count N) - SIGMA (\n. &n * f (SUC n)) (count N)’
7865     >- (irule EXTREAL_SUM_IMAGE_SUB >> rw [FINITE_COUNT] \\
7866         DISJ1_TAC >> NTAC 2 STRIP_TAC \\
7867         simp [extreal_of_num_def] \\
7868         Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw []) \\
7869     BETA_TAC >> Rewr' \\
7870     Know ‘SIGMA (\n. &n * f n) (count N) = 0 + SIGMA (\n. &n * f n) (count N DELETE 0)’
7871     >- (Know ‘count N = 0 INSERT (count N DELETE 0)’
7872         >- (rw [Once EXTENSION, IN_COUNT]) \\
7873         DISCH_THEN (GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites o wrap) \\
7874         Know ‘SIGMA (\n. &n * f n) (0 INSERT (count N DELETE 0)) =
7875               (\n. &n * f n) 0 + SIGMA (\n. &n * f n) ((count N DELETE 0) DELETE 0)’
7876         >- (irule EXTREAL_SUM_IMAGE_PROPERTY >> rw [FINITE_COUNT] \\
7877             DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
7878             simp [extreal_of_num_def] \\
7879             Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw []) \\
7880        ‘count N DELETE 0 DELETE 0 = count N DELETE 0’ by SET_TAC [] >> POP_ORW \\
7881         Rewr' >> rw [mul_lzero]) >> Rewr' \\
7882     Know ‘count N DELETE 0 = IMAGE SUC (count (PRE N))’
7883     >- (rw [Once EXTENSION, IN_IMAGE, IN_COUNT] \\
7884         EQ_TAC >> rpt STRIP_TAC >| (* 3 subgoals *)
7885         [ (* goal 1 (of 3) *)
7886           Q.EXISTS_TAC ‘PRE x’ >> rw [] \\
7887          ‘0 < x’ by RW_TAC arith_ss [] \\
7888           METIS_TAC [INV_PRE_LESS],
7889           (* goal 2 (of 3) *)
7890          ‘0 < x’ by RW_TAC arith_ss [] \\
7891           simp [GSYM INV_PRE_LESS],
7892           (* goal 3 (of 3) *)
7893           fs [] ]) >> Rewr' \\
7894     Know ‘SIGMA (\n. &n * f n) (IMAGE SUC (count (PRE N))) =
7895           SIGMA ((\n. &n * f n) o SUC) (count (PRE N))’
7896     >- (irule EXTREAL_SUM_IMAGE_IMAGE >> RW_TAC std_ss [FINITE_COUNT] >| (* 2 subgoals *)
7897         [ (* goal 1 (of 2) *)
7898           DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
7899           simp [extreal_of_num_def] \\
7900           Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw [],
7901           (* goal 2 (of 2) *)
7902           MATCH_MP_TAC INJ_IMAGE \\
7903           Q.EXISTS_TAC ‘count N DELETE 0’ \\
7904           rw [INJ_DEF] ]) >> Rewr' \\
7905     SIMP_TAC std_ss [o_DEF] \\
7906    ‘count N = (PRE N) INSERT (count (PRE N))’ by rw [Once EXTENSION, IN_COUNT] \\
7907     POP_ASSUM (GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites o wrap) \\
7908     Know ‘SIGMA (\n. &n * f (SUC n)) (PRE N INSERT count (PRE N)) =
7909           (\n. &n * f (SUC n)) (PRE N) +
7910           SIGMA (\n. &n * f (SUC n)) (count (PRE N) DELETE (PRE N))’
7911     >- (irule EXTREAL_SUM_IMAGE_PROPERTY >> RW_TAC std_ss [FINITE_COUNT] \\
7912         DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
7913         simp [extreal_of_num_def] \\
7914         Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw []) \\
7915     BETA_TAC >> Rewr' \\
7916    ‘(count (PRE N) DELETE PRE N) = count (PRE N)’
7917       by rw [Once EXTENSION, IN_COUNT] >> POP_ORW \\
7918    ‘SUC (PRE N) = N’ by METIS_TAC [SUC_PRE] >> POP_ORW \\
7919     Know ‘0 (* a *) + SIGMA (\x. &SUC x * f (SUC x)) (count (PRE N)) (* c *) -
7920           (&PRE N * f N (* b *) + SIGMA (\n. &n * f (SUC n)) (count (PRE N)) (* d *)) =
7921           0 (* a *) - &PRE N * f N (* b *) +
7922           (SIGMA (\x. &SUC x * f (SUC x)) (count (PRE N)) (* c *) -
7923            SIGMA (\n. &n * f (SUC n)) (count (PRE N)) (* d *))’
7924     >- (MATCH_MP_TAC EQ_SYM \\
7925         MATCH_MP_TAC add2_sub2 (* a - b + (c - d) = a + c - (b + d) *) \\
7926         rw [extreal_of_num_def, extreal_not_infty] >| (* 3 subgoals *)
7927         [ (* goal 1 (of 3) *)
7928           Suff ‘(0 :real) <= &PRE N’ >- METIS_TAC [mul_not_infty] >> rw [],
7929           (* goal 2 (of 3) *)
7930           MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> rw [FINITE_COUNT] \\
7931           Suff ‘(0 :real) <= &SUC x’ >- METIS_TAC [mul_not_infty] >> rw [],
7932           (* goal 3 (of 3) *)
7933           MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> rw [FINITE_COUNT] \\
7934           Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw [] ]) >> Rewr' \\
7935     REWRITE_TAC [sub_lzero] \\
7936     Know ‘SIGMA (\x. &SUC x * f (SUC x)) (count (PRE N)) -
7937           SIGMA (\n. &n * f (SUC n)) (count (PRE N)) =
7938           SIGMA (\n. (\x. &SUC x * f (SUC x)) n - (\n. &n * f (SUC n)) n) (count (PRE N))’
7939     >- (MATCH_MP_TAC EQ_SYM \\
7940         irule EXTREAL_SUM_IMAGE_SUB >> rw [FINITE_COUNT] \\
7941         DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
7942         REWRITE_TAC [extreal_of_num_def] \\
7943         CONJ_TAC >| (* 2 subgoals *)
7944         [ Suff ‘(0 :real) <= &SUC x’ >- METIS_TAC [mul_not_infty] >> rw [],
7945           Suff ‘(0 :real) <= &x’ >- METIS_TAC [mul_not_infty] >> rw [] ]) \\
7946     BETA_TAC >> Rewr' \\
7947     Know ‘!n. &SUC n * f (SUC n) - &n * f (SUC n) = f (SUC n)’
7948     >- (GEN_TAC \\
7949         Know ‘&SUC n * f (SUC n) - &n * f (SUC n) = (&SUC n - &n) * f (SUC n)’
7950         >- (MATCH_MP_TAC EQ_SYM \\
7951             MATCH_MP_TAC sub_rdistrib >> rw [extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
7952         Know ‘&SUC n - &n = 1’
7953         >- (REWRITE_TAC [extreal_of_num_def, extreal_sub_def, extreal_11] \\
7954             REWRITE_TAC [real_of_num, REAL_1] >> REAL_ARITH_TAC) >> Rewr' \\
7955         REWRITE_TAC [mul_lone]) >> Rewr' \\
7956     Know ‘-(&PRE N * f N) + SIGMA (\n. f (SUC n)) (count (PRE N)) =
7957           SIGMA (\n. f (SUC n)) (count (PRE N)) + -(&PRE N * f N)’
7958     >- (MATCH_MP_TAC add_comm >> DISJ2_TAC \\
7959         reverse CONJ_TAC
7960         >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> rw [FINITE_COUNT]) \\
7961         Suff ‘&PRE N * f N <> NegInf’ >- METIS_TAC [extreal_ainv_def, neg_neg] \\
7962         REWRITE_TAC [extreal_of_num_def] \\
7963         Suff ‘(0 :real) <= &PRE N’ >- METIS_TAC [mul_not_infty] >> rw []) >> Rewr' \\
7964     MATCH_MP_TAC EQ_SYM \\
7965     MATCH_MP_TAC extreal_sub_add >> DISJ2_TAC \\
7966     CONJ_TAC >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> rw [FINITE_COUNT]) \\
7967     REWRITE_TAC [extreal_of_num_def] \\
7968     Suff ‘(0 :real) <= &PRE N’ >- METIS_TAC [mul_not_infty] >> rw [])
7969 >> DISCH_TAC
7970 >> REWRITE_TAC [GSYM le_antisym]
7971 >> CONJ_TAC (* easy part *)
7972 >- (rw [ext_suminf_def, sup_le', le_sup'] \\
7973     Cases_on ‘n = 0’ >- (rw [EXTREAL_SUM_IMAGE_EMPTY] \\
7974                          POP_ASSUM MATCH_MP_TAC \\
7975                          Q.EXISTS_TAC ‘0’ >> rw [EXTREAL_SUM_IMAGE_EMPTY]) \\
7976     Know ‘SIGMA (\n. &n * prob p (A n)) (count n) =
7977           SIGMA (\n. f (SUC n)) (count (PRE n)) - &PRE n * f n’
7978     >- (FIRST_X_ASSUM MATCH_MP_TAC >> RW_TAC arith_ss []) >> Rewr' \\
7979     MATCH_MP_TAC le_trans \\
7980     Q.EXISTS_TAC ‘SIGMA (\n. f (SUC n)) (count (PRE n))’ \\
7981     reverse CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC \\
7982                          Q.EXISTS_TAC ‘PRE n’ >> REWRITE_TAC []) \\
7983     MATCH_MP_TAC sub_le_imp \\
7984     REWRITE_TAC [extreal_of_num_def] \\
7985     CONJ_TAC >- (Suff ‘(0 :real) <= &PRE n’ >- METIS_TAC [mul_not_infty] >> rw []) \\
7986     CONJ_TAC >- (Suff ‘(0 :real) <= &PRE n’ >- METIS_TAC [mul_not_infty] >> rw []) \\
7987     MATCH_MP_TAC le_addr_imp \\
7988     MATCH_MP_TAC le_mul >> art [] \\
7989     rw [extreal_of_num_def, extreal_le_eq])
7990 (* special case *)
7991 >> Cases_on ‘expectation p (abs o X) = PosInf’
7992 >- (Know ‘suminf (\n. &n * prob p (A n)) = PosInf’
7993     >- (CCONTR_TAC \\
7994         Know ‘suminf (\n. &n * prob p (A n)) <> NegInf’
7995         >- (MATCH_MP_TAC pos_not_neginf \\
7996             MATCH_MP_TAC ext_suminf_pos >> rw []) >> DISCH_TAC \\
7997        ‘?r. suminf (\n. &n * prob p (A n)) = Normal r’ by METIS_TAC [extreal_cases] \\
7998         FULL_SIMP_TAC std_ss [le_infty, extreal_of_num_def, extreal_not_infty, extreal_add_def]) \\
7999     Rewr' >> REWRITE_TAC [le_infty])
8000 (* hard part *)
8001 >> Q.ABBREV_TAC ‘g = \n. pos_fn_integral p (\x. abs (X x) * indicator_fn (B n) x)’
8002 >> Know ‘!m n. m <= n ==> g n <= g m’
8003 >- (rw [Abbr ‘g’] \\
8004     MATCH_MP_TAC pos_fn_integral_mono >> rw []
8005     >- (MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
8006     MATCH_MP_TAC le_lmul_imp >> REWRITE_TAC [abs_pos] \\
8007     MATCH_MP_TAC INDICATOR_FN_MONO \\
8008     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> DISCH_TAC
8009 >> Know ‘!N. 0 < N ==> &PRE N * f N <= g N’
8010 >- (RW_TAC std_ss [Abbr ‘g’, Abbr ‘B’] \\
8011     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘&N * f N’ \\
8012     CONJ_TAC >- (ONCE_REWRITE_TAC [mul_comm] \\
8013                  MATCH_MP_TAC le_lmul_imp >> rw [extreal_of_num_def, extreal_le_eq]) \\
8014    ‘f N = prob p {x | x IN p_space p /\ &N <= abs (X x)}’ by METIS_TAC [] >> POP_ORW \\
8015     Know ‘prob p {x | x IN p_space p /\ &N <= abs (X x)} =
8016           pos_fn_integral p (indicator_fn {x | x IN p_space p /\ &N <= abs (X x)})’
8017     >- (REWRITE_TAC [Once EQ_SYM_EQ, prob_def, p_space_def] \\
8018         MATCH_MP_TAC pos_fn_integral_indicator \\
8019         fs [prob_space_def, p_space_def, events_def]) >> Rewr' \\
8020     Know ‘&N * pos_fn_integral p (indicator_fn {x | x IN p_space p /\ &N <= abs (X x)}) =
8021           pos_fn_integral p (\x. &N * (indicator_fn {x | x IN p_space p /\ &N <= abs (X x)} x))’
8022     >- (REWRITE_TAC [Once EQ_SYM_EQ, extreal_of_num_def] \\
8023         MATCH_MP_TAC pos_fn_integral_cmul >> fs [INDICATOR_FN_POS, prob_space_def]) >> Rewr' \\
8024     MATCH_MP_TAC pos_fn_integral_mono >> rw []
8025     >- (MATCH_MP_TAC le_mul >> rw [INDICATOR_FN_POS] \\
8026         rw [extreal_of_num_def, extreal_le_eq]) \\
8027     reverse (Cases_on ‘x IN {x | x IN p_space p /\ &N <= abs (X x)}’)
8028     >- (ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rzero, le_refl]) \\
8029     ASM_SIMP_TAC std_ss [indicator_fn_def, mul_rone] \\
8030     fs []) >> DISCH_TAC
8031 (* hard part *)
8032 >> rw [ext_suminf_def, sup_le', le_sup']
8033 >> MATCH_MP_TAC le_epsilon (* key step *)
8034 >> rpt STRIP_TAC
8035 >> Know ‘e <> NegInf’
8036 >- (MATCH_MP_TAC pos_not_neginf \\
8037     MATCH_MP_TAC lt_imp_le >> art []) >> DISCH_TAC
8038 >> Know ‘SIGMA (\n. f (SUC n)) (count n) <= y' + e <=>
8039          SIGMA (\n. f (SUC n)) (count n) - e <= y'’
8040 >- (ONCE_REWRITE_TAC [EQ_SYM_EQ] \\
8041     MATCH_MP_TAC sub_le_eq >> art []) >> Rewr'
8042 (* applying le_inf_epsilon_set *)
8043 >> Suff ‘inf (IMAGE (\n. g n) UNIV) = 0’
8044 >- (DISCH_TAC \\
8045     MP_TAC (Q.SPECL [‘IMAGE (\n. (g :num -> extreal) n) UNIV’, ‘e’]
8046                     le_inf_epsilon_set) \\
8047     Know ‘?x. x IN IMAGE (\n. g n) UNIV /\ x <> PosInf’
8048     >- (Q.EXISTS_TAC ‘g 0’ (* any value is fine here *) \\
8049         CONJ_TAC >- (rw [IN_IMAGE, IN_UNIV] \\
8050                      Q.EXISTS_TAC ‘0’ >> REWRITE_TAC []) \\
8051         rw [Abbr ‘g’, lt_infty] \\
8052         MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘expectation p (abs o X)’ \\
8053         reverse CONJ_TAC >- art [GSYM lt_infty] \\
8054         Know ‘expectation p (abs o X) = pos_fn_integral p (abs o X)’
8055         >- (REWRITE_TAC [expectation_def] \\
8056             MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, abs_pos]) >> Rewr' \\
8057         MATCH_MP_TAC pos_fn_integral_mono >> rw []
8058         >- (MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
8059         Cases_on ‘x IN B 0’ \\ (* 2 subgoals, same tactics *)
8060         rw [indicator_fn_def, mul_rone, le_refl, mul_rzero, abs_pos]) \\
8061     Know ‘inf (IMAGE (\n. g n) univ(:num)) <> NegInf’
8062     >- (MATCH_MP_TAC pos_not_neginf \\
8063         rw [le_inf', IN_IMAGE, IN_UNIV, Abbr ‘g’] \\
8064         MATCH_MP_TAC pos_fn_integral_pos \\
8065         CONJ_TAC >- FULL_SIMP_TAC std_ss [prob_space_def] \\
8066         RW_TAC std_ss [] \\
8067         MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
8068     RW_TAC std_ss [IN_IMAGE, IN_UNIV, add_lzero] \\
8069     Q.PAT_X_ASSUM ‘g _ <> PosInf’ K_TAC (* useless *) \\
8070     rename1 ‘g N <= e’ \\
8071     MATCH_MP_TAC le_trans \\
8072     Q.EXISTS_TAC ‘SIGMA (\n. &n * prob p (A n)) (count (MAX (SUC n) N))’ \\
8073     reverse CONJ_TAC
8074     >- (FIRST_X_ASSUM MATCH_MP_TAC (* !z. (?n. z = _) ==> z <= y' *) \\
8075         Q.EXISTS_TAC ‘MAX (SUC n) N’ >> REWRITE_TAC []) \\
8076    ‘0 < MAX (SUC n) N’ by RW_TAC arith_ss [] \\
8077     Know ‘SIGMA (\n. &n * prob p (A n)) (count (MAX (SUC n) N)) =
8078           SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) -
8079           &PRE (MAX (SUC n) N) * f (MAX (SUC n) N)’
8080     >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr' \\
8081     Know ‘SIGMA (\n. f (SUC n)) (count n) - e <=
8082           SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) -
8083           &PRE (MAX (SUC n) N) * f (MAX (SUC n) N) <=>
8084           SIGMA (\n. f (SUC n)) (count n) <=
8085           SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) -
8086           &PRE (MAX (SUC n) N) * f (MAX (SUC n) N) + e’
8087     >- (MATCH_MP_TAC sub_le_eq >> art []) >> Rewr' \\
8088     MATCH_MP_TAC le_trans \\
8089     Q.EXISTS_TAC ‘SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N)))’ \\
8090     CONJ_TAC >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_MONO_SET >> rw [FINITE_COUNT] \\
8091                  MATCH_MP_TAC COUNT_MONO \\
8092                  MATCH_MP_TAC LESS_EQ_TRANS >> Q.EXISTS_TAC ‘PRE (SUC n)’ \\
8093                  reverse CONJ_TAC
8094                  >- (POP_ASSUM (ONCE_REWRITE_TAC o wrap o (MATCH_MP INV_PRE_LESS_EQ)) \\
8095                      RW_TAC arith_ss []) \\
8096                  RW_TAC arith_ss []) \\
8097     Know ‘SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) -
8098           &PRE (MAX (SUC n) N) * f (MAX (SUC n) N) =
8099           SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) + -
8100          (&PRE (MAX (SUC n) N) * f (MAX (SUC n) N))’
8101     >- (MATCH_MP_TAC extreal_sub_add >> DISJ2_TAC \\
8102         CONJ_TAC >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_POSINF >> rw []) \\
8103         MATCH_MP_TAC pos_not_neginf \\
8104         MATCH_MP_TAC le_mul >> art [] \\
8105         rw [extreal_of_num_def, extreal_le_eq]) >> Rewr' \\
8106     Know ‘SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) +
8107           -(&PRE (MAX (SUC n) N) * f (MAX (SUC n) N)) + e =
8108           SIGMA (\n. f (SUC n)) (count (PRE (MAX (SUC n) N))) +
8109          (-(&PRE (MAX (SUC n) N) * f (MAX (SUC n) N)) + e)’
8110     >- (MATCH_MP_TAC EQ_SYM \\
8111         MATCH_MP_TAC add_assoc >> DISJ1_TAC >> art [] \\
8112         CONJ_TAC >- (MATCH_MP_TAC EXTREAL_SUM_IMAGE_NOT_NEGINF >> rw []) \\
8113        ‘?r. f (MAX (SUC n) N) = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
8114         rw [extreal_ainv_def, extreal_mul_def, extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
8115     MATCH_MP_TAC le_addr_imp \\
8116     Know ‘-(&PRE (MAX (SUC n) N) * f (MAX (SUC n) N)) + e =
8117           e + -(&PRE (MAX (SUC n) N) * f (MAX (SUC n) N))’
8118     >- (MATCH_MP_TAC add_comm >> DISJ1_TAC >> art [] \\
8119        ‘?r. f (MAX (SUC n) N) = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
8120         rw [extreal_ainv_def, extreal_mul_def, extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
8121     Know ‘e + -(&PRE (MAX (SUC n) N) * f (MAX (SUC n) N)) =
8122           e - &PRE (MAX (SUC n) N) * f (MAX (SUC n) N)’
8123     >- (MATCH_MP_TAC EQ_SYM \\
8124         MATCH_MP_TAC extreal_sub_add >> DISJ1_TAC >> art [] \\
8125        ‘?r. f (MAX (SUC n) N) = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
8126         rw [extreal_ainv_def, extreal_mul_def, extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
8127     Know ‘0 <= e - &PRE (MAX (SUC n) N) * f (MAX (SUC n) N) <=>
8128           &PRE (MAX (SUC n) N) * f (MAX (SUC n) N) <= e’
8129     >- (MATCH_MP_TAC EQ_SYM \\
8130         MATCH_MP_TAC sub_zero_le \\
8131        ‘?r. f (MAX (SUC n) N) = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
8132         rw [extreal_ainv_def, extreal_mul_def, extreal_of_num_def, extreal_not_infty]) >> Rewr' \\
8133     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘g (MAX (SUC n) N)’ \\
8134     CONJ_TAC >- (FIRST_X_ASSUM MATCH_MP_TAC >> art []) \\
8135     MATCH_MP_TAC le_trans >> Q.EXISTS_TAC ‘g N’ >> art [] \\
8136     FIRST_X_ASSUM MATCH_MP_TAC >> RW_TAC arith_ss [])
8137 (* final stage: inf (IMAGE (\n. g n) univ(:num)) = 0 *)
8138 >> Q.PAT_X_ASSUM ‘!N. 0 < N ==> &PRE N * f N <= g N’ K_TAC
8139 >> Q.PAT_X_ASSUM ‘!z. (?n. z = _) ==> z <= y'’       K_TAC
8140 >> Q.PAT_X_ASSUM ‘!m n. m <= n ==> g n <= g m’       K_TAC
8141 >> NTAC 3 (POP_ASSUM K_TAC) (* all about ‘e’ *)
8142 >> Q.UNABBREV_TAC ‘g’ >> FULL_SIMP_TAC std_ss []
8143 >> Q.ABBREV_TAC ‘fi = \n x. abs (X x) * indicator_fn (B n) x’
8144 >> ‘!n. (\x. abs (X x) * indicator_fn (B n) x) = fi n’ by METIS_TAC [] >> POP_ORW
8145 (* applying lebesgue_monotone_convergence_decreasing *)
8146 >> Q.ABBREV_TAC ‘h = \x. inf (IMAGE (\i. fi i x) UNIV)’
8147 >> ‘!i x. 0 <= fi i x’
8148       by (rw [Abbr ‘fi’] >> MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS])
8149 >> Know ‘inf (IMAGE (\n. pos_fn_integral p (fi n)) UNIV) = pos_fn_integral p h’
8150 >- (MATCH_MP_TAC EQ_SYM \\
8151     MATCH_MP_TAC lebesgue_monotone_convergence_decreasing \\
8152     fs [prob_space_def, p_space_def, events_def] \\
8153     CONJ_TAC
8154     >- (rw [Abbr ‘fi’] \\
8155         HO_MATCH_MP_TAC IN_MEASURABLE_BOREL_MUL_INDICATOR \\
8156         fs [prob_space_def, measure_space_def, real_random_variable, p_space_def, events_def] \\
8157         MATCH_MP_TAC IN_MEASURABLE_BOREL_ABS \\
8158         Q.EXISTS_TAC ‘X’ >> rw []) \\
8159     CONJ_TAC
8160     >- (rw [Abbr ‘fi’, GSYM lt_infty] \\
8161         FULL_SIMP_TAC std_ss [real_random_variable_def, p_space_def] \\
8162        ‘?r. X x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
8163         STRIP_ASSUME_TAC (Q.SPECL [‘B (i :num)’, ‘x’] indicator_fn_normal) \\
8164         rw [extreal_abs_def, extreal_mul_def, extreal_not_infty]) \\
8165     CONJ_TAC
8166     >- (rw [Abbr ‘fi’, lt_infty] \\
8167         MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘expectation p (abs o X)’ \\
8168         reverse CONJ_TAC >- art [GSYM lt_infty] \\
8169         Know ‘expectation p (abs o X) = pos_fn_integral p (abs o X)’
8170         >- (REWRITE_TAC [expectation_def] \\
8171             MATCH_MP_TAC integral_pos_fn >> fs [prob_space_def, abs_pos]) >> Rewr' \\
8172         MATCH_MP_TAC pos_fn_integral_mono >> rw []
8173         >- (MATCH_MP_TAC le_mul >> rw [abs_pos, INDICATOR_FN_POS]) \\
8174         Cases_on ‘x IN B 0’ \\ (* 2 subgoals, same tactics *)
8175         rw [indicator_fn_def, mul_rone, le_refl, mul_rzero, abs_pos]) \\
8176     rw [ext_mono_decreasing_def, Abbr ‘fi’] \\
8177     MATCH_MP_TAC le_lmul_imp >> REWRITE_TAC [abs_pos] \\
8178     MATCH_MP_TAC INDICATOR_FN_MONO \\
8179     FIRST_X_ASSUM MATCH_MP_TAC >> art []) >> Rewr'
8180 >> Suff ‘!x. x IN p_space p ==> h x = 0’
8181 >- (DISCH_TAC \\
8182     Know ‘pos_fn_integral p (\x. 0) = 0’
8183     >- (MATCH_MP_TAC pos_fn_integral_zero >> fs [prob_space_def]) \\
8184     DISCH_THEN (ONCE_REWRITE_TAC o wrap o SYM) \\
8185     MATCH_MP_TAC pos_fn_integral_cong \\
8186     fs [prob_space_def, p_space_def, le_refl])
8187 >> rw [Abbr ‘h’, inf_eq'] >- art []
8188 >> Q.PAT_X_ASSUM ‘!i x. 0 <= fi i x’ K_TAC
8189 >> Q.UNABBREV_TAC ‘fi’ >> fs []
8190 >> POP_ASSUM MATCH_MP_TAC
8191 >> FULL_SIMP_TAC std_ss [real_random_variable_def]
8192 >> ‘?r. X x = Normal r’ by METIS_TAC [extreal_cases]
8193 >> STRIP_ASSUME_TAC (Q.SPEC ‘abs r’ SIMP_REAL_ARCH)
8194 >> Q.EXISTS_TAC ‘SUC n’
8195 >> Suff ‘indicator_fn (B (SUC n)) x = 0’ >- rw [mul_rzero]
8196 >> rw [Abbr ‘B’, indicator_fn_def, extreal_abs_def, extreal_of_num_def, extreal_le_eq]
8197 >> ‘&n < (&SUC n) :real’ by rw []
8198 >> ‘&n < abs r’ by PROVE_TAC [REAL_LTE_TRANS]
8199 >> METIS_TAC [REAL_LET_ANTISYM]
8200QED
8201
8202(* Theorem 3.2.1, Part II [2, p.45] *)
8203Theorem expectation_converge :
8204    !p X. prob_space p /\ real_random_variable X p ==>
8205         (expectation p (abs o X) < PosInf <=>
8206          suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) < PosInf)
8207Proof
8208    rpt STRIP_TAC
8209 >> Know ‘suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) <=
8210          expectation p (abs o X) /\ expectation p (abs o X) <= 1 +
8211          suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)})’
8212 >- (MATCH_MP_TAC expectation_bounds >> art [])
8213 >> STRIP_TAC
8214 >> EQ_TAC >> STRIP_TAC
8215 >- (MATCH_MP_TAC let_trans \\
8216     Q.EXISTS_TAC ‘expectation p (abs o X)’ >> art [])
8217 >> MATCH_MP_TAC let_trans
8218 >> Q.EXISTS_TAC ‘1 + suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)})’
8219 >> FULL_SIMP_TAC std_ss [GSYM lt_infty]
8220 >> ‘sigma_algebra (measurable_space p)’
8221      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
8222 >> Know ‘suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) <> NegInf’
8223 >- (MATCH_MP_TAC pos_not_neginf \\
8224     MATCH_MP_TAC ext_suminf_pos >> rw [] \\
8225     MATCH_MP_TAC PROB_POSITIVE >> art [] \\
8226     fs [prob_space_def, p_space_def, events_def, real_random_variable, le_abs_bounds] \\
8227    ‘{x | x IN m_space p /\ (X x <= -&SUC n \/ &SUC n <= X x)} =
8228         ({x | X x <= -&SUC n} INTER m_space p) UNION
8229         ({x | &SUC n <= X x} INTER m_space p)’ by SET_TAC [] >> POP_ORW \\
8230     MATCH_MP_TAC MEASURE_SPACE_UNION >> art [] \\
8231     METIS_TAC [IN_MEASURABLE_BOREL_ALL_MEASURE])
8232 >> DISCH_TAC
8233 >> ‘?r. suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) = Normal r’
8234       by METIS_TAC [extreal_cases]
8235 >> POP_ORW
8236 >> rw [extreal_of_num_def, extreal_add_def, extreal_not_infty]
8237QED
8238
8239(* Theorem 3.2.1, Part II' *)
8240Theorem expectation_converge' :
8241    !p X. prob_space p /\ real_random_variable X p ==>
8242         (expectation p (abs o X) = PosInf <=>
8243          suminf (\n. prob p {x | x IN p_space p /\ &SUC n <= abs (X x)}) = PosInf)
8244Proof
8245    METIS_TAC [expectation_converge, lt_infty]
8246QED
8247
8248(* Theorem 3.2.2 [2, p.47], probability-specific version of integral_distr *)
8249Theorem expectation_distribution :
8250    !p X f. prob_space p /\ random_variable X p Borel /\ f IN measurable Borel Borel ==>
8251           (expectation p (f o X) =
8252            integral (space Borel,subsets Borel,distribution p X) f) /\
8253           (integrable p (f o X) <=>
8254            integrable (space Borel,subsets Borel,distribution p X) f)
8255Proof
8256    rpt GEN_TAC
8257 >> simp [prob_space_def, random_variable_def, expectation_def, p_space_def, events_def,
8258          distribution_distr]
8259 >> STRIP_TAC
8260 >> MP_TAC (Q.SPECL [‘p’, ‘Borel’, ‘X’, ‘f’] (INST_TYPE [beta |-> “:extreal”] integral_distr))
8261 >> rw [SIGMA_ALGEBRA_BOREL]
8262QED
8263
8264Theorem identical_distribution_alt_prob :
8265    !p X E J i j s. identical_distribution p X E J /\
8266                    s IN subsets E /\ i IN J /\ j IN J ==>
8267        (prob p {x | x IN p_space p /\ X i x IN s} =
8268         prob p {x | x IN p_space p /\ X j x IN s})
8269Proof
8270    RW_TAC std_ss [identical_distribution_def, distribution_def, PREIMAGE_def]
8271 >> ‘!i. {x | x IN p_space p /\ X i x IN s} =
8272         {x | X i x IN s} INTER p_space p’ by SET_TAC []
8273 >> POP_ORW
8274 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
8275QED
8276
8277(* alternative definition of identical distribution, see [3, p.62, Definition 5.4.1] *)
8278Theorem identical_distribution_alt :
8279    !p X (J :'index set). prob_space p /\
8280         (!n. n IN J ==> random_variable (X n) p Borel) ==>
8281         (identical_distribution p X Borel J <=>
8282          (!f. f IN measurable Borel Borel ==>
8283               ?c. !n. n IN J ==> expectation p (f o (X n)) = c))
8284Proof
8285    RW_TAC std_ss [identical_distribution_def]
8286 >> EQ_TAC >> rpt STRIP_TAC
8287 >- (Cases_on ‘J = {}’ >- (Q.EXISTS_TAC ‘ARB’ >> rw []) \\
8288     Q.ABBREV_TAC ‘j = CHOICE J’ \\
8289    ‘j IN J’ by METIS_TAC [CHOICE_DEF] \\
8290     Q.EXISTS_TAC ‘expectation p (f o X j)’ \\
8291     Q.X_GEN_TAC ‘i’ >> STRIP_TAC \\
8292     Know ‘!n. n IN J ==>
8293               expectation p (f o X n) =
8294               integral (space Borel,subsets Borel,distribution p (X n)) f’
8295     >- (METIS_TAC [expectation_distribution]) >> rw [] \\
8296     MATCH_MP_TAC integral_cong_measure' >> simp [measure_space_eq_def] \\
8297     Suff ‘!n. n IN J ==> measure_space (space Borel,subsets Borel,distribution p (X n))’
8298     >- rw [] \\
8299     Q.X_GEN_TAC ‘n’ >> STRIP_TAC \\
8300     FULL_SIMP_TAC std_ss [distribution_distr, prob_space_def, random_variable_def,
8301                           p_space_def, events_def] \\
8302     MATCH_MP_TAC measure_space_distr \\
8303     rw [SIGMA_ALGEBRA_BOREL])
8304 >> Know ‘!n f. n IN J /\ f IN Borel_measurable Borel ==>
8305                expectation p (f o X n) =
8306                integral (space Borel,subsets Borel,distribution p (X n)) f’
8307 >- (rpt STRIP_TAC \\
8308     METIS_TAC [expectation_distribution])
8309 >> DISCH_TAC
8310 >> Know ‘indicator_fn s IN measurable Borel Borel’
8311 >- (MATCH_MP_TAC IN_MEASURABLE_BOREL_INDICATOR \\
8312     Q.EXISTS_TAC ‘s’ >> rw [SIGMA_ALGEBRA_BOREL])
8313 >> DISCH_TAC
8314 >> Know ‘!n. n IN J ==>
8315              expectation p ((indicator_fn s) o (X n)) =
8316              expectation p ((indicator_fn s) o (X j))’
8317 >- (rpt STRIP_TAC >> METIS_TAC [])
8318 >> simp []
8319 >> Know ‘!n. n IN J ==>
8320              integral (space Borel,subsets Borel,distribution p (X n)) (indicator_fn s) =
8321              distribution p (X n) s’
8322 >- (rpt STRIP_TAC \\
8323     MATCH_MP_TAC (REWRITE_RULE [measure_def, measurable_sets_def]
8324                    (Q.SPECL [‘(space Borel,subsets Borel,
8325                                distribution (p :'a m_space) (X (n :'index)))’, ‘s’]
8326                      (INST_TYPE [“:'a” |-> “:extreal”] integral_indicator))) \\
8327     simp [distribution_distr] \\
8328     MATCH_MP_TAC measure_space_distr \\
8329     fs [prob_space_def, random_variable_def, p_space_def, events_def, SIGMA_ALGEBRA_BOREL])
8330 >> rw []
8331QED
8332
8333Theorem identical_distribution_alt' :
8334    !p (X :num -> 'a -> extreal).
8335          prob_space p /\ (!n. random_variable (X n) p Borel) ==>
8336         (identical_distribution p X Borel univ(:num) <=>
8337          (!f n. f IN measurable Borel Borel ==>
8338                 expectation p (f o (X n)) = expectation p (f o (X 0))))
8339Proof
8340    RW_TAC std_ss [identical_distribution_alt, IN_UNIV]
8341 >> EQ_TAC >> rw []
8342 >> METIS_TAC []
8343QED
8344
8345(* Theorem 3.1.4 [2, p.37], slightly generalized *)
8346Theorem random_variable_comp :
8347    !p X A f. random_variable X p A /\ f IN measurable A A ==>
8348              random_variable (f o X) p A
8349Proof
8350    rw [random_variable_def]
8351 >> MATCH_MP_TAC MEASURABLE_COMP
8352 >> Q.EXISTS_TAC `A` >> art []
8353QED
8354
8355Theorem identical_distribution_cong :
8356    !p X f. prob_space p /\ (!n. random_variable (X n) p Borel) /\
8357            identical_distribution p X Borel univ(:num) /\
8358            f IN measurable Borel Borel ==>
8359            identical_distribution p (\n. f o X n) Borel univ(:num)
8360Proof
8361    rpt STRIP_TAC
8362 >> Know ‘identical_distribution p X Borel univ(:num) <=>
8363          (!f n. f IN measurable Borel Borel ==>
8364                 expectation p (f o (X n)) = expectation p (f o (X 0)))’
8365 >- (MATCH_MP_TAC identical_distribution_alt' >> art [])
8366 >> DISCH_THEN (FULL_SIMP_TAC std_ss o wrap)
8367 >> Know ‘identical_distribution p (\n. f o X n) Borel univ(:num) <=>
8368          (!g n. g IN measurable Borel Borel ==>
8369                 expectation p (g o ((\n. f o X n) n)) =
8370                 expectation p (g o ((\n. f o X n) 0)))’
8371 >- (MATCH_MP_TAC identical_distribution_alt' >> rw [] \\
8372     MATCH_MP_TAC random_variable_comp >> art [])
8373 >> Rewr'
8374 >> RW_TAC std_ss []
8375 >> REWRITE_TAC [o_ASSOC]
8376 >> FIRST_X_ASSUM MATCH_MP_TAC
8377 >> MATCH_MP_TAC MEASURABLE_COMP
8378 >> Q.EXISTS_TAC ‘Borel’ >> art []
8379QED
8380
8381(* r.v.'s having identical distributions have the same integrability
8382
8383   NOTE: fixes after k14: changed ‘identical_distribution p X Borel UNIV’
8384                               to ‘identical_distribution p X Borel J’
8385 *)
8386Theorem identical_distribution_integrable_general :
8387    !p X (J :'index set). prob_space p /\
8388         (!n. n IN J ==> random_variable (X n) p Borel) /\
8389          identical_distribution p X Borel J /\
8390         (?i. i IN J /\ integrable p (X i)) ==> !n. n IN J ==> integrable p (X n)
8391Proof
8392    RW_TAC std_ss [identical_distribution_def]
8393 >> ‘X n IN Borel_measurable (m_space p,measurable_sets p)’
8394       by fs [random_variable_def, p_space_def, events_def]
8395 >> Know ‘(\x. x) IN measurable Borel Borel’
8396 >- (rw [IN_MEASURABLE, SIGMA_ALGEBRA_BOREL, IN_FUNSET, PREIMAGE_def] \\
8397     MATCH_MP_TAC SIGMA_ALGEBRA_INTER >> rw [SIGMA_ALGEBRA_BOREL] \\
8398     MATCH_MP_TAC SIGMA_ALGEBRA_SPACE >> rw [SIGMA_ALGEBRA_BOREL])
8399 >> DISCH_TAC
8400 >> MP_TAC (Q.SPECL [‘p’, ‘X (i :'index)’, ‘\x. x’] expectation_distribution)
8401 >> RW_TAC std_ss [o_DEF]
8402 >> MP_TAC (Q.SPECL [‘p’, ‘X (n :'index)’, ‘\x. x’] expectation_distribution)
8403 >> RW_TAC std_ss [o_DEF]
8404 >> Suff ‘integrable (space Borel,subsets Borel,distribution p (X i)) (\x. x) <=>
8405          integrable (space Borel,subsets Borel,distribution p (X n)) (\x. x)’
8406 >- METIS_TAC []
8407 (* applying integral_cong_measure *)
8408 >> ‘prob_space (space Borel,subsets Borel,distribution p (X i)) /\
8409     prob_space (space Borel,subsets Borel,distribution p (X n))’
8410       by METIS_TAC [distribution_prob_space, SIGMA_ALGEBRA_BOREL]
8411 >> MATCH_MP_TAC integrable_cong_measure
8412 >> fs [prob_space_def]
8413QED
8414
8415Theorem identical_distribution_integrable :
8416    !p X. prob_space p /\ (!n. random_variable (X n) p Borel) /\
8417          identical_distribution p X Borel UNIV /\ integrable p (X 0) ==>
8418          !(n :num). integrable p (X n)
8419Proof
8420    rpt STRIP_TAC
8421 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘UNIV’]
8422                    (INST_TYPE [“:'index” |-> “:num”]
8423                               identical_distribution_integrable_general))
8424 >> RW_TAC std_ss [IN_UNIV]
8425 >> POP_ASSUM MATCH_MP_TAC
8426 >> Q.EXISTS_TAC ‘0’ >> art []
8427QED
8428
8429(* r.v.'s having identical distributions have the same expectation
8430
8431   NOTE: fixes after k14: changed ‘identical_distribution p X Borel UNIV’
8432                               to ‘identical_distribution p X Borel J’
8433
8434         also removed unnecessary ‘J <> {}’ from antecedents.
8435 *)
8436Theorem identical_distribution_expectation_general :
8437    !p X (J :'index set). prob_space p /\
8438         (!n. n IN J ==> random_variable (X n) p Borel) /\
8439          identical_distribution p X Borel J ==>
8440          ?e. !n. n IN J ==> expectation p (X n) = e
8441Proof
8442    RW_TAC std_ss [identical_distribution_def]
8443 >> Know ‘(\x. x) IN measurable Borel Borel’
8444 >- (rw [IN_MEASURABLE, SIGMA_ALGEBRA_BOREL, IN_FUNSET, PREIMAGE_def] \\
8445     MATCH_MP_TAC SIGMA_ALGEBRA_INTER >> rw [SIGMA_ALGEBRA_BOREL] \\
8446     MATCH_MP_TAC SIGMA_ALGEBRA_SPACE >> rw [SIGMA_ALGEBRA_BOREL])
8447 >> DISCH_TAC
8448 >> Cases_on ‘J = {}’ >- (Q.EXISTS_TAC ‘ARB’ >> rw [])
8449 >> Q.ABBREV_TAC ‘i = CHOICE J’
8450 >> ‘i IN J’ by METIS_TAC [CHOICE_DEF]
8451 >> MP_TAC (Q.SPECL [‘p’, ‘X (i :'index)’, ‘\x. x’] expectation_distribution)
8452 >> RW_TAC std_ss [o_DEF]
8453 >> Q.EXISTS_TAC ‘expectation p (X i)’
8454 >> rpt STRIP_TAC
8455 >> MP_TAC (Q.SPECL [‘p’, ‘X (n :'index)’, ‘\x. x’] expectation_distribution)
8456 >> RW_TAC std_ss [o_DEF]
8457 >> ‘!n. X n = (\x. X n x)’ by METIS_TAC [ETA_THM] >> POP_ORW
8458 >> Suff ‘integral (space Borel,subsets Borel,distribution p (X i)) (\x. x) =
8459          integral (space Borel,subsets Borel,distribution p (X n)) (\x. x)’
8460 >- rw []
8461 (* applying integral_cong_measure *)
8462 >> ‘prob_space (space Borel,subsets Borel,distribution p (X i)) /\
8463     prob_space (space Borel,subsets Borel,distribution p (X n))’
8464       by METIS_TAC [distribution_prob_space, SIGMA_ALGEBRA_BOREL]
8465 >> MATCH_MP_TAC integral_cong_measure
8466 >> fs [prob_space_def]
8467QED
8468
8469Theorem identical_distribution_expectation :
8470    !p X. prob_space p /\ (!n. random_variable (X n) p Borel) /\
8471          identical_distribution p X Borel UNIV ==>
8472          !(n :num). expectation p (X n) = expectation p (X 0)
8473Proof
8474    rpt STRIP_TAC
8475 >> MP_TAC (Q.SPECL [‘p’, ‘X’, ‘UNIV’]
8476                    (INST_TYPE [“:'index” |-> “:num”]
8477                               identical_distribution_expectation_general))
8478 >> RW_TAC std_ss [IN_UNIV] >> art []
8479QED
8480
8481(* Theorem 3.1.5 [2, p.38] *)
8482Theorem fundamental_theorem_of_random_vectors :
8483    !p X Y f. prob_space p /\
8484              random_variable X p Borel /\ random_variable Y p Borel /\
8485              f IN measurable (Borel CROSS Borel) Borel ==>
8486              random_variable (\x. f (X x,Y x)) p Borel
8487Proof
8488    RW_TAC std_ss [random_variable_def, prob_space_def, p_space_def, events_def]
8489 >> MATCH_MP_TAC IN_MEASURABLE_BOREL_2D_FUNCTION
8490 >> fs [measure_space_def]
8491QED
8492
8493Theorem indep_vars_comm : (* was: INDEP_RV_SYM *)
8494    !p X Y s t. indep_rv p X Y s t ==> indep_rv p Y X t s
8495Proof
8496    RW_TAC std_ss [indep_rv_def]
8497 >> MATCH_MP_TAC INDEP_SYM
8498 >> FIRST_X_ASSUM MATCH_MP_TAC >> art []
8499QED
8500
8501(* Theorem 3.3.1 [2, p.54], slightly generalized to arbitrary index set *)
8502Theorem indep_vars_cong :
8503    !p X B (J :'index set) f.
8504         indep_vars p (X :'index -> 'a -> 'b) B (J :'index set) /\
8505        (!n. n IN J ==> random_variable (X n) p (B n)) /\
8506        (!n. n IN J ==> f n IN measurable (B n) (B n)) ==>
8507         indep_vars p (\n. (f n) o (X n)) B (J :'index set)
8508Proof
8509    rw [indep_vars_def, indep_events_def, o_DEF]
8510 >> Q.ABBREV_TAC ‘E' = \i. PREIMAGE (f i) (E i) INTER space (B i)’
8511 >> Know ‘BIGINTER (IMAGE (\n. PREIMAGE (\x. f n (X n x)) (E n) INTER p_space p) N) =
8512          BIGINTER (IMAGE (\n. PREIMAGE (X n) (E' n) INTER p_space p) N)’
8513 >- (rw [Abbr ‘E'’, Once EXTENSION, IN_BIGINTER_IMAGE] \\
8514     EQ_TAC >> rw []
8515     >- (‘n IN J’ by METIS_TAC [SUBSET_DEF] \\
8516         Q.PAT_X_ASSUM ‘!n. n IN J ==> random_variable (X n) p (B n)’
8517           (STRIP_ASSUME_TAC o
8518            (SIMP_RULE (srw_ss()) [random_variable_def, IN_MEASURABLE, IN_FUNSET])) \\
8519         METIS_TAC [])
8520     >- (METIS_TAC [])
8521     >- (METIS_TAC []))
8522 >> Rewr'
8523 (* applying EXTREAL_PROD_IMAGE_EQ *)
8524 >> Know ‘PI (\n. prob p (PREIMAGE (\x. f n (X n x)) (E n) INTER p_space p)) N =
8525          PI (\n. prob p (PREIMAGE (X n) (E' n) INTER p_space p)) N’
8526 >- (irule EXTREAL_PROD_IMAGE_EQ >> art [] \\
8527     Q.X_GEN_TAC ‘n’ >> rw [] \\
8528     Suff ‘PREIMAGE (\x. f n (X n x)) (E n) INTER p_space p =
8529           PREIMAGE (X n) (E' n) INTER p_space p’ >- rw [] \\
8530     rw [Abbr ‘E'’, PREIMAGE_def, Once EXTENSION] >> EQ_TAC >> rw [] \\
8531    ‘n IN J’ by METIS_TAC [SUBSET_DEF] \\
8532     Q.PAT_X_ASSUM ‘!n. n IN J ==> random_variable (X n) p (B n)’
8533       (STRIP_ASSUME_TAC o
8534        (SIMP_RULE (srw_ss()) [random_variable_def, IN_MEASURABLE, IN_FUNSET])) \\
8535     PROVE_TAC [])
8536 >> Rewr'
8537 >> FIRST_X_ASSUM MATCH_MP_TAC
8538 >> fs [Abbr ‘E'’, PREIMAGE_def, IN_DFUNSET, IN_MEASURABLE]
8539 >> rw []
8540 >> Q.PAT_X_ASSUM ‘!n. n IN J ==> f n IN (space (B n) -> space (B n)) /\ _’
8541      (MP_TAC o (Q.SPEC ‘x’))
8542 >> ‘x IN J’ by PROVE_TAC [SUBSET_DEF]
8543 >> rw []
8544QED
8545
8546(* A specialized version of previous theorem for only two r.v.'s *)
8547Theorem indep_rv_cong :
8548    !p X Y A B f g. indep_rv p X Y A B /\
8549                    random_variable X p A /\ random_variable Y p B /\
8550                    f IN measurable A A /\ g IN measurable B B ==>
8551                    indep_vars p (f o X) (g o Y) A B
8552Proof
8553    rpt STRIP_TAC
8554 >> ‘random_variable (f o X) p A /\
8555     random_variable (g o Y) p B’ by PROVE_TAC [random_variable_comp]
8556 >> fs [indep_rv_alt_indep_vars]
8557 >> MP_TAC (Q.SPECL [‘p’, ‘binary X Y’, ‘binary A B’, ‘{0; 1}’, ‘binary f g’]
8558                    (INST_TYPE [“:'index” |-> “:num”] indep_vars_cong))
8559 >> Know ‘!n. n IN {0; 1} ==> random_variable (binary X Y n) p (binary A B n)’
8560 >- rw [binary_def]
8561 >> Know ‘!n. n IN {0; 1} ==>
8562              binary f g n IN measurable (binary A B n) (binary A B n)’
8563 >- rw [binary_def]
8564 >> RW_TAC std_ss []
8565 >> Suff ‘(binary (f o X) (g o Y)) = (\n. (binary f g n) o (binary X Y n))’
8566 >- rw []
8567 >> rw [FUN_EQ_THM, binary_def]
8568 >> Cases_on ‘n = 0’ >> rw []
8569QED
8570
8571(* Another version of "indep_vars_cong" for pairwise independent r.v.'s *)
8572Theorem pairwise_indep_vars_cong :
8573    !p X B (J :'index set) f.
8574         pairwise_indep_vars p (X :'index -> 'a -> 'b) B (J :'index set) /\
8575        (!n. n IN J ==> random_variable (X n) p (B n)) /\
8576        (!n. n IN J ==> f n IN measurable (B n) (B n)) ==>
8577         pairwise_indep_vars p (\n. (f n) o (X n)) B (J :'index set)
8578Proof
8579    rw [pairwise_indep_vars_def]
8580 >> rename1 ‘i <> j’
8581 >> MP_TAC (Q.SPECL [‘p’, ‘X (i :'index)’, ‘X (j :'index)’,
8582                     ‘B (i :'index)’, ‘B (j :'index)’,
8583                     ‘f (i :'index)’, ‘f (j :'index)’] indep_rv_cong)
8584 >> rw [o_DEF]
8585QED
8586
8587(* Theorem 3.3.2 [2, p.54] (a simple version of four r.v.'s)
8588
8589   This proof is based on repeated applications of SIGMA_PROPERTY_DYNKIN,
8590   a rare direct application of Dynkin systems in probability proofs. For
8591   a more general results which (may) imply the present theorem, see
8592   Scholium 23.4 (on independent functions) [9, p.280]. Note also that the
8593   proof doesn't work if “indep_vars” is weaken to “pairwise_indep_vars”.
8594
8595   NOTE: The textbook says "The proof of the next (the present) theorem is
8596   similar (with Theorem 3.3.1) and is left as an exercise." [2, p.54]
8597
8598   See stochastic_processTheory.indep_functions_of_vars for a more general
8599   version of two finite lists of r.v.'s.
8600 *)
8601Theorem indep_functions_of_four_vars_lemma[local] :
8602    !p. prob_space p /\
8603        random_variable A p Borel /\
8604        random_variable B p Borel /\
8605        random_variable C p Borel /\
8606        random_variable D p Borel /\
8607        indep_vars p (\i. EL i [A; B; C; D]) (\n. Borel) (count 4) ==>
8608        !a. a IN subsets (Borel CROSS Borel) ==>
8609            !b. b IN subsets (Borel CROSS Borel) ==>
8610                indep p (PREIMAGE (\x. (A x,B x)) a INTER p_space p)
8611                        (PREIMAGE (\x. (C x,D x)) b INTER p_space p)
8612Proof
8613    NTAC 2 STRIP_TAC
8614 (* NOTE: P is not a sigma-algebra *)
8615 >> qabbrev_tac ‘P = \a. a IN subsets (Borel CROSS Borel) /\
8616                         !b. b IN subsets (Borel CROSS Borel) ==>
8617                             indep p (PREIMAGE (\x. (A x,B x)) a INTER p_space p)
8618                                     (PREIMAGE (\x. (C x,D x)) b INTER p_space p)’
8619 (* applying SIGMA_SUBSET (1st round) *)
8620 >> Suff ‘subsets (Borel CROSS Borel) SUBSET P’
8621 >- rw [SUBSET_DEF, IN_APP, Abbr ‘P’]
8622 >> simp [prod_sigma_def]
8623 >> qabbrev_tac ‘X = space Borel CROSS space Borel’
8624 >> qabbrev_tac ‘b = (X,P)’
8625 >> ‘P = subsets b’ by rw [Abbr ‘b’] >> POP_ORW
8626 >> ‘X = space b’   by rw [Abbr ‘b’] >> POP_ORW
8627 >> qabbrev_tac ‘sts = prod_sets (subsets Borel) (subsets Borel)’
8628 >> MATCH_MP_TAC SIGMA_PROPERTY_DYNKIN
8629 >> CONJ_TAC (* subset_class (space b) sts *)
8630 >- (rw [subset_class_def, Abbr ‘b’, Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL] \\
8631     rw [SUBSET_DEF, IN_CROSS])
8632 (* sts is closed under intersection *)
8633 >> STRONG_CONJ_TAC
8634 >- (rw [Abbr ‘sts’, IN_PROD_SETS] \\
8635     rename1 ‘?x y. a1 CROSS a2 INTER a3 CROSS a4 = x CROSS y /\
8636                    x IN subsets Borel /\ y IN subsets Borel’ \\
8637     simp [INTER_CROSS] \\
8638     qexistsl_tac [‘a1 INTER a3’, ‘a2 INTER a4’] >> rw [] \\
8639     MATCH_MP_TAC SIGMA_ALGEBRA_INTER >> rw [SIGMA_ALGEBRA_BOREL])
8640 >> DISCH_TAC
8641 >> fs [Abbr ‘b’]
8642 (* NOTE: ‘sigma_algebra (X,P)’ doesn't hold, but ‘dynkin_system (X,P)’ is true *)
8643 >> reverse CONJ_TAC
8644 >- (rw [dynkin_system_def] >| (* 4 subgoals *)
8645     [ (* goal 1 (of 4) *)
8646       rw [subset_class_def, SUBSET_DEF, Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL],
8647       (* goal 2 (of 4) *)
8648       simp [Abbr ‘P’, Abbr ‘X’, GSYM SPACE_PROD_SIGMA] \\
8649       CONJ_TAC
8650       >- (MATCH_MP_TAC SIGMA_ALGEBRA_SPACE \\
8651           REWRITE_TAC [SIGMA_ALGEBRA_BOREL_2D]) \\
8652       rw [SPACE_BOREL_2D] \\
8653       MATCH_MP_TAC INDEP_SPACE >> art [] \\
8654       MP_TAC (Q.SPEC ‘(p_space p,events p)’
8655                      (REWRITE_RULE [IN_MEASURABLE]
8656                                    IN_MEASURABLE_BOREL_2D_VECTOR)) \\
8657       rw [SPACE_BOREL, IN_FUNSET, EVENTS_SIGMA_ALGEBRA] \\
8658       POP_ASSUM (MP_TAC o Q.SPECL [‘C’, ‘D’]) \\
8659       fs [random_variable_def, IN_MEASURABLE],
8660       (* goal 3 (of 4) *)
8661       simp [Abbr ‘P’] \\
8662       POP_ASSUM (MP_TAC o BETA_RULE o ONCE_REWRITE_RULE [IN_APP]) \\
8663       STRIP_TAC \\
8664       CONJ_TAC
8665       >- (‘X = space (Borel CROSS Borel)’ by rw [Abbr ‘X’, SPACE_PROD_SIGMA] \\
8666           POP_ORW \\
8667           MATCH_MP_TAC SIGMA_ALGEBRA_COMPL >> art [] \\
8668           REWRITE_TAC [SIGMA_ALGEBRA_BOREL_2D]) \\
8669       rw [PREIMAGE_DIFF] \\
8670       qabbrev_tac ‘e  = PREIMAGE (\x. (A x,B x)) s’ \\
8671       qabbrev_tac ‘sp = PREIMAGE (\x. (A x,B x)) X’ \\
8672      ‘(sp DIFF e) INTER p_space p =
8673       (sp INTER p_space p) DIFF (e INTER p_space p)’ by SET_TAC [] >> POP_ORW \\
8674       Know ‘sp INTER p_space p = p_space p’
8675       >- (Suff ‘p_space p SUBSET sp’ >- SET_TAC [] \\
8676           rw [Abbr ‘sp’, SUBSET_DEF, IN_PREIMAGE] \\
8677           simp [Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL]) >> Rewr' \\
8678       MATCH_MP_TAC INDEP_COMPL' >> art [] \\
8679       FIRST_X_ASSUM MATCH_MP_TAC >> art [],
8680       (* goal 4 (of 4) *)
8681       simp [Abbr ‘P’] \\
8682       fs [IN_FUNSET] \\
8683       STRONG_CONJ_TAC
8684       >- (MATCH_MP_TAC SIGMA_ALGEBRA_COUNTABLE_UNION \\
8685           rw [SIGMA_ALGEBRA_BOREL_2D, SUBSET_DEF] \\
8686           simp []) >> DISCH_TAC \\
8687       rw [PREIMAGE_BIGUNION, IMAGE_IMAGE, o_DEF, BIGUNION_OVER_INTER_L] \\
8688       MATCH_MP_TAC INDEP_COUNTABLE_DUNION' >> simp [] \\
8689       CONJ_TAC
8690       >- (MP_TAC (Q.SPEC ‘(p_space p,events p)’
8691                          (REWRITE_RULE [IN_MEASURABLE]
8692                                        IN_MEASURABLE_BOREL_2D_VECTOR)) \\
8693           rw [SPACE_BOREL, IN_FUNSET, EVENTS_SIGMA_ALGEBRA] \\
8694           POP_ASSUM (MP_TAC o Q.SPECL [‘C’, ‘D’]) \\
8695           fs [random_variable_def, IN_MEASURABLE]) \\
8696       rw [disjoint_family_def] \\
8697       MATCH_MP_TAC DISJOINT_RESTRICT_L \\
8698       MATCH_MP_TAC PREIMAGE_DISJOINT \\
8699       FIRST_X_ASSUM MATCH_MP_TAC >> art [] ])
8700 (* stage work *)
8701 >> simp [SUBSET_DEF, Abbr ‘sts’, Abbr ‘P’, Abbr ‘X’]
8702 >> NTAC 2 STRIP_TAC
8703 >> Q.PAT_X_ASSUM ‘x = t CROSS u’ (REWRITE_TAC o wrap)
8704 >> CONJ_TAC
8705 >- (simp [prod_sigma_def] \\
8706     MATCH_MP_TAC IN_SIGMA >> rw [IN_PROD_SETS] \\
8707     qexistsl_tac [‘t’, ‘u’] >> art [])
8708 (* stage work *)
8709 >> qabbrev_tac ‘P = \b. b IN subsets (Borel CROSS Borel) /\
8710                         indep p
8711                           (PREIMAGE (\x. (A x,B x)) (t CROSS u) INTER p_space p)
8712                           (PREIMAGE (\x. (C x,D x)) b INTER p_space p)’
8713 >> Suff ‘subsets (Borel CROSS Borel) SUBSET P’
8714 >- rw [SUBSET_DEF, IN_APP, Abbr ‘P’]
8715 >> REWRITE_TAC [prod_sigma_def]
8716 >> qabbrev_tac ‘X = space Borel CROSS space Borel’
8717 >> qabbrev_tac ‘b = (X,P)’
8718 >> ‘P = subsets b’ by rw [Abbr ‘b’] >> POP_ORW
8719 >> ‘X = space b’   by rw [Abbr ‘b’] >> POP_ORW
8720 >> qabbrev_tac ‘sts = prod_sets (subsets Borel) (subsets Borel)’
8721 >> MATCH_MP_TAC SIGMA_PROPERTY_DYNKIN >> art []
8722 >> CONJ_TAC (* subset_class (space b) sts *)
8723 >- (rw [subset_class_def, Abbr ‘b’, Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL] \\
8724     rw [SUBSET_DEF, IN_CROSS])
8725 >> fs [Abbr ‘b’]
8726 (* another proof of “dynkin_system (X,P)” *)
8727 >> reverse CONJ_TAC
8728 >- (rw [dynkin_system_def] >| (* 4 subgoals *)
8729     [ (* goal 1 (of 4) *)
8730       rw [subset_class_def, SUBSET_DEF, Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL],
8731       (* goal 2 (of 4) *)
8732       simp [Abbr ‘P’, Abbr ‘X’, GSYM SPACE_PROD_SIGMA] \\
8733       CONJ_TAC
8734       >- (MATCH_MP_TAC SIGMA_ALGEBRA_SPACE \\
8735           REWRITE_TAC [SIGMA_ALGEBRA_BOREL_2D]) \\
8736       rw [SPACE_BOREL_2D] \\
8737       MATCH_MP_TAC INDEP_SPACE' >> art [] \\
8738       MP_TAC (Q.SPEC ‘(p_space p,events p)’
8739                      (REWRITE_RULE [IN_MEASURABLE]
8740                                    IN_MEASURABLE_BOREL_2D_VECTOR)) \\
8741       rw [SPACE_BOREL, IN_FUNSET, EVENTS_SIGMA_ALGEBRA] \\
8742       POP_ASSUM (MP_TAC o Q.SPECL [‘A’, ‘B’]) \\
8743       fs [random_variable_def, IN_MEASURABLE, SPACE_BOREL_2D] \\
8744       DISCH_THEN MATCH_MP_TAC \\
8745       simp [prod_sigma_def] \\
8746       MATCH_MP_TAC IN_SIGMA >> rw [IN_PROD_SETS, Abbr ‘sts’] \\
8747       qexistsl_tac [‘t’, ‘u’] >> art [],
8748       (* goal 3 (of 4) *)
8749       simp [Abbr ‘P’] \\
8750       POP_ASSUM (MP_TAC o BETA_RULE o ONCE_REWRITE_RULE [IN_APP]) \\
8751       STRIP_TAC \\
8752       CONJ_TAC
8753       >- (‘X = space (Borel CROSS Borel)’ by rw [Abbr ‘X’, SPACE_PROD_SIGMA] \\
8754           POP_ORW \\
8755           MATCH_MP_TAC SIGMA_ALGEBRA_COMPL >> art [] \\
8756           REWRITE_TAC [SIGMA_ALGEBRA_BOREL_2D]) \\
8757       rw [PREIMAGE_DIFF] \\
8758       qabbrev_tac ‘e  = PREIMAGE (\x. (C x,D x)) s’ \\
8759       qabbrev_tac ‘sp = PREIMAGE (\x. (C x,D x)) X’ \\
8760      ‘(sp DIFF e) INTER p_space p =
8761       (sp INTER p_space p) DIFF (e INTER p_space p)’ by SET_TAC [] >> POP_ORW \\
8762       Know ‘sp INTER p_space p = p_space p’
8763       >- (Suff ‘p_space p SUBSET sp’ >- SET_TAC [] \\
8764           rw [Abbr ‘sp’, SUBSET_DEF, IN_PREIMAGE] \\
8765           simp [Abbr ‘X’, SPACE_PROD_SIGMA, SPACE_BOREL]) >> Rewr' \\
8766       MATCH_MP_TAC INDEP_COMPL >> art [],
8767       (* goal 4 (of 4) *)
8768       simp [Abbr ‘P’] \\
8769       fs [IN_FUNSET] \\
8770       STRONG_CONJ_TAC
8771       >- (MATCH_MP_TAC SIGMA_ALGEBRA_COUNTABLE_UNION \\
8772           rw [SIGMA_ALGEBRA_BOREL_2D, SUBSET_DEF] \\
8773           simp []) >> DISCH_TAC \\
8774       rw [PREIMAGE_BIGUNION, IMAGE_IMAGE, o_DEF, BIGUNION_OVER_INTER_L] \\
8775       MATCH_MP_TAC INDEP_COUNTABLE_DUNION >> simp [] \\
8776       CONJ_TAC
8777       >- (MP_TAC (Q.SPEC ‘(p_space p,events p)’
8778                          (REWRITE_RULE [IN_MEASURABLE]
8779                                        IN_MEASURABLE_BOREL_2D_VECTOR)) \\
8780           rw [SPACE_BOREL, IN_FUNSET, EVENTS_SIGMA_ALGEBRA] \\
8781           POP_ASSUM (MP_TAC o Q.SPECL [‘A’, ‘B’]) \\
8782           fs [random_variable_def, IN_MEASURABLE, SPACE_BOREL_2D] \\
8783           DISCH_THEN MATCH_MP_TAC \\
8784           simp [prod_sigma_def] \\
8785           MATCH_MP_TAC IN_SIGMA >> rw [IN_PROD_SETS, Abbr ‘sts’] \\
8786           qexistsl_tac [‘t’, ‘u’] >> art []) \\
8787       rw [disjoint_family_def] \\
8788       MATCH_MP_TAC DISJOINT_RESTRICT_L \\
8789       MATCH_MP_TAC PREIMAGE_DISJOINT \\
8790       FIRST_X_ASSUM MATCH_MP_TAC >> art [] ])
8791 (* stage work *)
8792 >> rw [SUBSET_DEF, Abbr ‘sts’, Abbr ‘P’, Abbr ‘X’]
8793 >- (rename1 ‘c CROSS d IN subsets (Borel CROSS Borel)’ \\
8794     simp [prod_sigma_def] \\
8795     MATCH_MP_TAC IN_SIGMA >> rw [IN_PROD_SETS] \\
8796     qexistsl_tac [‘c’, ‘d’] >> art [])
8797 >> rename1 ‘indep p (PREIMAGE (\x. (A x,B x)) (a CROSS b) INTER p_space p)
8798                     (PREIMAGE (\x. (C x,D x)) (c CROSS d) INTER p_space p)’
8799 >> simp [PREIMAGE_CROSS, o_DEF]
8800 >> ‘PREIMAGE (\x. A x) a INTER PREIMAGE (\x. B x) b INTER p_space p =
8801      (PREIMAGE A a INTER p_space p) INTER
8802      (PREIMAGE B b INTER p_space p)’ by SET_TAC [ETA_AX]
8803 >> POP_ORW
8804 >> ‘PREIMAGE (\x. C x) c INTER PREIMAGE (\x. D x) d INTER p_space p =
8805      (PREIMAGE C c INTER p_space p) INTER
8806      (PREIMAGE D d INTER p_space p)’ by SET_TAC [ETA_AX]
8807 >> POP_ORW
8808 >> qabbrev_tac ‘e1 = PREIMAGE A a INTER p_space p’
8809 >> qabbrev_tac ‘e2 = PREIMAGE B b INTER p_space p’
8810 >> qabbrev_tac ‘e3 = PREIMAGE C c INTER p_space p’
8811 >> qabbrev_tac ‘e4 = PREIMAGE D d INTER p_space p’
8812 >> Know ‘e1 IN events p’
8813 >- (Q.PAT_X_ASSUM ‘random_variable A p Borel’ MP_TAC \\
8814     rw [Abbr ‘e1’, random_variable_def, IN_MEASURABLE])
8815 >> DISCH_TAC
8816 >> Know ‘e2 IN events p’
8817 >- (Q.PAT_X_ASSUM ‘random_variable B p Borel’ MP_TAC \\
8818     rw [Abbr ‘e2’, random_variable_def, IN_MEASURABLE])
8819 >> DISCH_TAC
8820 >> Know ‘e3 IN events p’
8821 >- (Q.PAT_X_ASSUM ‘random_variable C p Borel’ MP_TAC \\
8822     rw [Abbr ‘e3’, random_variable_def, IN_MEASURABLE])
8823 >> DISCH_TAC
8824 >> Know ‘e4 IN events p’
8825 >- (Q.PAT_X_ASSUM ‘random_variable D p Borel’ MP_TAC \\
8826     rw [Abbr ‘e4’, random_variable_def, IN_MEASURABLE])
8827 >> DISCH_TAC
8828 >> rw [indep_def]
8829 >- (MATCH_MP_TAC EVENTS_INTER >> art [])
8830 >- (MATCH_MP_TAC EVENTS_INTER >> art [])
8831 >> qabbrev_tac ‘X = \i. EL i [A; B; C; D]’
8832 >> Know ‘pairwise_indep_vars p X (\n. Borel) (count 4)’
8833 >- (MATCH_MP_TAC total_imp_pairwise_indep_vars \\
8834     rw [SIGMA_ALGEBRA_BOREL] \\
8835     POP_ASSUM MP_TAC \\
8836     qid_spec_tac ‘i’ \\
8837     simp [Abbr ‘X’] \\
8838     rpt (CONV_TAC (BOUNDED_FORALL_CONV (SIMP_CONV (srw_ss()) [])) >> art []))
8839 >> rw [pairwise_indep_vars_def]
8840 >> Know ‘prob p (e1 INTER e2) = prob p e1 * prob p e2’
8841 >- (Suff ‘indep p e1 e2’ >- rw [indep_def] \\
8842     POP_ASSUM (MP_TAC o Q.SPECL [‘0’, ‘1’]) >> rw [Abbr ‘X’, indep_rv_def] \\
8843     rw [Abbr ‘e1’, Abbr ‘e2’])
8844 >> Rewr'
8845 >> Know ‘prob p (e3 INTER e4) = prob p e3 * prob p e4’
8846 >- (Suff ‘indep p e3 e4’ >- rw [indep_def] \\
8847     POP_ASSUM (MP_TAC o Q.SPECL [‘2’, ‘3’]) >> rw [Abbr ‘X’, indep_rv_def] \\
8848     rw [Abbr ‘e3’, Abbr ‘e4’])
8849 >> Rewr'
8850 >> POP_ASSUM K_TAC (* useless now *)
8851 >> REWRITE_TAC [mul_assoc, INTER_ASSOC]
8852 >> Q.PAT_X_ASSUM ‘indep_vars p X (\n. Borel) (count 4)’ MP_TAC
8853 >> rw [indep_vars_def]
8854 >> POP_ASSUM (MP_TAC o Q.SPECL [‘\i. EL i [a; b; c; d]’, ‘count 4’])
8855 >> simp []
8856 >> impl_tac
8857 >- (simp [IN_COUNT, o_DEF, IN_DFUNSET] \\
8858     rpt (CONV_TAC (BOUNDED_FORALL_CONV (SIMP_CONV (srw_ss()) [])) >> art []))
8859 >> Know ‘BIGINTER (IMAGE (\n. PREIMAGE (X n) (EL n [a; b; c; d]) INTER p_space p)
8860                          (count 4)) = e1 INTER e2 INTER e3 INTER e4’
8861 >- (rw [Once EXTENSION, IN_BIGINTER_IMAGE] \\
8862     reverse EQ_TAC
8863     >- (STRIP_TAC \\
8864         simp [Abbr ‘X’] \\
8865         rpt (CONV_TAC (BOUNDED_FORALL_CONV (SIMP_CONV (srw_ss()) [])) \\
8866              CONJ_TAC
8867              >- fs [Abbr ‘e1’, Abbr ‘e2’, Abbr ‘e3’, Abbr ‘e4’, IN_PREIMAGE]) \\
8868         simp []) \\
8869     DISCH_TAC \\
8870     rpt CONJ_TAC >| (* 4 subgoals *)
8871     [ (* goal 1 (of 4) *)
8872       rw [Abbr ‘e1’, IN_PREIMAGE] \\
8873       POP_ASSUM (MP_TAC o Q.SPEC ‘0’) >> simp [Abbr ‘X’],
8874       (* goal 2 (of 4) *)
8875       rw [Abbr ‘e2’, IN_PREIMAGE] \\
8876       POP_ASSUM (MP_TAC o Q.SPEC ‘1’) >> simp [Abbr ‘X’],
8877       (* goal 3 (of 4) *)
8878       rw [Abbr ‘e3’, IN_PREIMAGE] \\
8879       POP_ASSUM (MP_TAC o Q.SPEC ‘2’) >> simp [Abbr ‘X’],
8880       (* goal 4 (of 4) *)
8881       rw [Abbr ‘e4’, IN_PREIMAGE] \\
8882       POP_ASSUM (MP_TAC o Q.SPEC ‘3’) >> simp [Abbr ‘X’] ])
8883 >> Rewr'
8884 >> Rewr'
8885 >> simp [EXTREAL_PROD_IMAGE_COUNT, Abbr ‘X’]
8886QED
8887
8888(* NOTE: This is a test before the general version.
8889
8890   Note also that ‘indep_vars’ in concl. is overload of ‘indep_rv’.
8891 *)
8892Theorem indep_functions_of_four_vars :
8893    !p f g A B C D.
8894        prob_space p /\
8895        random_variable A p Borel /\
8896        random_variable B p Borel /\
8897        random_variable C p Borel /\
8898        random_variable D p Borel /\
8899        f IN measurable (Borel CROSS Borel) Borel /\
8900        g IN measurable (Borel CROSS Borel) Borel /\
8901        indep_vars p (\i. EL i [A; B; C; D]) (\n. Borel) (count 4) ==>
8902        indep_vars p (\x. f (A x,B x)) (\x. g (C x,D x)) Borel Borel
8903Proof
8904    rw [indep_rv_def, IN_MEASURABLE, IN_FUNSET, SPACE_BOREL_2D, SPACE_BOREL]
8905 >> Know ‘(\x. f (A x,B x)) = f o (\x. (A x,B x))’
8906 >- rw [o_DEF]
8907 >> Rewr
8908 >> Know ‘(\x. g (C x,D x)) = g o (\x. (C x,D x))’
8909 >- rw [o_DEF]
8910 >> Rewr
8911 >> simp [PREIMAGE_o, GSYM PREIMAGE_ALT]
8912 >> qabbrev_tac ‘c = PREIMAGE f a’
8913 >> qabbrev_tac ‘d = PREIMAGE g b’
8914 >> ‘c IN subsets (Borel CROSS Borel) /\
8915     d IN subsets (Borel CROSS Borel)’ by METIS_TAC []
8916 >> NTAC 2 (Q.PAT_X_ASSUM ‘!s. s IN subsets Borel ==> _’ K_TAC)
8917 >> NTAC 2 (Q.PAT_X_ASSUM ‘_ IN subsets Borel’ K_TAC)
8918 (* now f and g are irrelevant *)
8919 >> irule indep_functions_of_four_vars_lemma >> art []
8920QED
8921
8922(* Theorem 3.3.3 [2, p.54], depending on Fubini and UNIQUENESS_OF_PROD_MEASURE
8923
8924   This is the last theorem in Isabelle's Independent_Family.thy but in extreals.
8925 *)
8926Theorem indep_vars_expectation :
8927    !p X Y. prob_space p /\ real_random_variable X p /\ real_random_variable Y p /\
8928            indep_rv p X Y Borel Borel /\ integrable p X /\ integrable p Y ==>
8929            expectation p (\x. X x * Y x) = expectation p X * expectation p Y
8930Proof
8931    rw [indep_rv_def, real_random_variable_def, prob_space_def, p_space_def,
8932        events_def, real_random_variable_def, random_variable_def, expectation_def]
8933 >> Q.ABBREV_TAC ‘f = \x. (X x,Y x)’
8934 >> Q.ABBREV_TAC ‘u = \(x,y). x * (y :extreal)’
8935 >> ‘(\x. X x * Y x) = u o f’ by rw [Abbr ‘u’, Abbr ‘f’, o_DEF] >> POP_ORW
8936 >> ‘sigma_algebra (measurable_space p)’
8937      by PROVE_TAC [MEASURE_SPACE_SIGMA_ALGEBRA, prob_space_def]
8938 (* applying MEASURABLE_PROD_SIGMA' *)
8939 >> Know ‘f IN measurable (m_space p,measurable_sets p) (Borel CROSS Borel)’
8940 >- (MATCH_MP_TAC MEASURABLE_PROD_SIGMA' \\
8941     simp [Abbr ‘f’, o_DEF, ETA_AX] \\
8942     MP_TAC SIGMA_ALGEBRA_BOREL >> rw [sigma_algebra_def, algebra_def])
8943 >> DISCH_TAC
8944 >> Know ‘u IN measurable (Borel CROSS Borel) Borel’
8945 >- (Q.UNABBREV_TAC ‘u’ \\
8946     REWRITE_TAC [IN_MEASURABLE_BOREL_2D_MUL])
8947 >> DISCH_TAC
8948 (* applying integral_distr and SIGMA_ALGEBRA_BOREL_2D *)
8949 >> Know ‘integral p (u o f) =
8950          integral (space (Borel CROSS Borel),
8951                    subsets (Borel CROSS Borel),distr p f) u’
8952 >- (MP_TAC (ISPECL [“p :'a m_space”,
8953                     “Borel CROSS Borel”,
8954                     “f :'a -> extreal # extreal”,
8955                     “u :extreal # extreal -> extreal”] integral_distr) \\
8956     RW_TAC std_ss [SIGMA_ALGEBRA_BOREL_2D]) >> Rewr'
8957 >> Q.ABBREV_TAC ‘m1 = (space Borel,subsets Borel,distr p X)’
8958 >> Q.ABBREV_TAC ‘m2 = (space Borel,subsets Borel,distr p Y)’
8959 >> ‘measure_space m1 /\ measure_space m2’
8960      by METIS_TAC [measure_space_distr, SIGMA_ALGEBRA_BOREL]
8961 (* sigma_finiteness of m1 and m2 *)
8962 >> Know ‘sigma_finite_measure_space m1 /\ sigma_finite_measure_space m2’
8963 >- (rw [sigma_finite_measure_space_def] >| (* 2 subgoals *)
8964     [ (* goal 1 (of 2) *)
8965       MATCH_MP_TAC FINITE_IMP_SIGMA_FINITE >> art [lt_infty] \\
8966      ‘m_space m1 = UNIV’ by METIS_TAC [m_space_def, SPACE_BOREL] >> POP_ORW \\
8967      ‘measure m1 = distr p X’ by METIS_TAC [measure_def] >> POP_ORW \\
8968       rw [distr_def],
8969       (* goal 2 (of 2) *)
8970       MATCH_MP_TAC FINITE_IMP_SIGMA_FINITE >> art [lt_infty] \\
8971      ‘m_space m2 = UNIV’ by METIS_TAC [m_space_def, SPACE_BOREL] >> POP_ORW \\
8972      ‘measure m2 = distr p Y’ by METIS_TAC [measure_def] >> POP_ORW \\
8973       rw [distr_def] ])
8974 >> STRIP_TAC
8975 >> ‘measure_space (m1 CROSS m2)’ by PROVE_TAC [measure_space_prod_measure]
8976 (* applying UNIQUENESS_OF_PROD_MEASURE *)
8977 >> Know ‘integral (space (Borel CROSS Borel),subsets (Borel CROSS Borel),distr p f) u =
8978          integral (m1 CROSS m2) u’
8979 >- (MATCH_MP_TAC integral_cong_measure' >> simp [measure_space_eq_def] \\
8980     CONJ_TAC >- (MATCH_MP_TAC measure_space_distr >> rw [SIGMA_ALGEBRA_BOREL_2D]) \\
8981     CONJ_TAC >- rw [SPACE_PROD_SIGMA, prod_measure_space_alt, Abbr ‘m1’, Abbr ‘m2’] \\
8982     CONJ_TAC >- rw [prod_measure_space_alt, Abbr ‘m1’, Abbr ‘m2’] \\
8983     MATCH_MP_TAC UNIQUENESS_OF_PROD_MEASURE \\
8984     qexistsl_tac [‘space Borel’, ‘space Borel’] \\
8985     qexistsl_tac [‘subsets Borel’, ‘subsets Borel’] \\
8986     qexistsl_tac [‘distr p X’, ‘distr p Y’] \\
8987     Know ‘subset_class (space Borel) (subsets Borel)’
8988     >- (rw [subset_class_def, SPACE_BOREL]) >> Rewr \\
8989     Know ‘sigma (space Borel) (subsets Borel) = Borel’
8990     >- (MATCH_MP_TAC SIGMA_STABLE \\
8991         REWRITE_TAC [SIGMA_ALGEBRA_BOREL]) >> Rewr \\
8992     CONJ_TAC >- fs [Abbr ‘m1’, sigma_finite_measure_space_def] \\
8993     CONJ_TAC >- fs [Abbr ‘m2’, sigma_finite_measure_space_def] \\
8994     Know ‘!s t. s IN subsets Borel /\ t IN subsets Borel ==>
8995                 s INTER t IN subsets Borel’
8996     >- (rpt STRIP_TAC \\
8997         MATCH_MP_TAC SIGMA_ALGEBRA_INTER >> art [SIGMA_ALGEBRA_BOREL]) >> Rewr \\
8998     CONJ_TAC >- fs [Abbr ‘m1’, sigma_finite_measure_space_def] \\
8999     CONJ_TAC >- fs [Abbr ‘m2’, sigma_finite_measure_space_def] \\
9000     Know ‘space Borel CROSS space Borel = space (Borel CROSS Borel)’
9001     >- (rw [prod_sigma_def, SPACE_SIGMA]) >> Rewr' \\
9002     CONJ_TAC >- (MATCH_MP_TAC measure_space_distr >> art [SIGMA_ALGEBRA_BOREL_2D]) \\
9003     CONJ_TAC
9004     >- (Know ‘space (Borel CROSS Borel) = m_space (m1 CROSS m2)’
9005         >- (rw [Abbr ‘m1’, Abbr ‘m2’, SPACE_PROD_SIGMA, prod_measure_space_alt]) >> Rewr' \\
9006         Know ‘subsets (Borel CROSS Borel) = measurable_sets (m1 CROSS m2)’
9007         >- (rw [Abbr ‘m1’, Abbr ‘m2’, prod_sigma_def, prod_measure_space_alt]) >> Rewr' \\
9008         art [MEASURE_SPACE_REDUCE]) \\
9009     CONJ_TAC
9010     >- (rw [distr_def, PREIMAGE_CROSS, Abbr ‘f’, o_DEF, ETA_AX] \\
9011        ‘PREIMAGE X s INTER PREIMAGE Y t INTER m_space p =
9012          (PREIMAGE X s INTER m_space p) INTER (PREIMAGE Y t INTER m_space p)’
9013           by SET_TAC [] >> POP_ORW \\
9014         METIS_TAC [indep_def, prob_def]) \\ (* independence is used here!!! *)
9015     rw [prod_measure_space_alt, INDICATOR_FN_CROSS] \\
9016     ONCE_REWRITE_TAC [mul_comm] \\
9017     Know ‘!y. pos_fn_integral m1 (\x. indicator_fn t y * indicator_fn s x) =
9018               indicator_fn t y * pos_fn_integral m1 (indicator_fn s)’
9019     >- (GEN_TAC \\
9020        ‘?r. 0 <= r /\ (indicator_fn t y = Normal r)’ by METIS_TAC [indicator_fn_normal] \\
9021         POP_ORW \\
9022         MATCH_MP_TAC pos_fn_integral_cmul >> rw [INDICATOR_FN_POS]) >> Rewr' \\
9023     Know ‘pos_fn_integral m1 (indicator_fn s) = measure m1 s’
9024     >- (MATCH_MP_TAC pos_fn_integral_indicator >> rw [Abbr ‘m1’]) >> Rewr' \\
9025     ONCE_REWRITE_TAC [mul_comm] \\
9026     Know ‘?r. 0 <= r /\ (measure m1 s = Normal r)’
9027     >- (rw [Abbr ‘m1’, distr_def] \\
9028         Know ‘measure p (PREIMAGE X s INTER m_space p) <= measure p (m_space p)’
9029         >- (MATCH_MP_TAC INCREASING \\
9030             CONJ_TAC >- (MATCH_MP_TAC MEASURE_SPACE_INCREASING >> art []) \\
9031             CONJ_TAC >- REWRITE_TAC [INTER_SUBSET] \\
9032             reverse CONJ_TAC >- (MATCH_MP_TAC MEASURE_SPACE_MSPACE_MEASURABLE >> art []) \\
9033             fs [IN_MEASURABLE]) >> art [] \\
9034         DISCH_TAC \\
9035         Know ‘0 <= measure p (PREIMAGE X s INTER m_space p)’
9036         >- (‘positive p’ by PROVE_TAC [MEASURE_SPACE_POSITIVE] \\
9037             fs [positive_def] >> POP_ASSUM MATCH_MP_TAC \\
9038             fs [IN_MEASURABLE]) >> DISCH_TAC \\
9039        ‘measure p (PREIMAGE X s INTER m_space p) <> NegInf’ by PROVE_TAC [pos_not_neginf] \\
9040         Know ‘measure p (PREIMAGE X s INTER m_space p) <> PosInf’
9041         >- (REWRITE_TAC [lt_infty] \\
9042             MATCH_MP_TAC let_trans >> Q.EXISTS_TAC ‘1’ \\
9043             rw [GSYM lt_infty, extreal_of_num_def, extreal_not_infty]) \\
9044         DISCH_TAC \\
9045        ‘?r. measure p (PREIMAGE X s INTER m_space p) = Normal r’ by METIS_TAC [extreal_cases] \\
9046         fs [extreal_of_num_def, extreal_le_eq]) \\
9047     STRIP_TAC \\
9048     Know ‘pos_fn_integral m2 (\y. measure m1 s * indicator_fn t y) =
9049           measure m1 s * pos_fn_integral m2 (indicator_fn t)’
9050     >- (POP_ORW >> MATCH_MP_TAC pos_fn_integral_cmul >> art [INDICATOR_FN_POS]) >> Rewr' \\
9051     Know ‘pos_fn_integral m2 (indicator_fn t) = measure m2 t’
9052     >- (MATCH_MP_TAC pos_fn_integral_indicator >> rw [Abbr ‘m2’]) >> Rewr' \\
9053     POP_ASSUM K_TAC \\
9054     rw [Abbr ‘m1’, Abbr ‘m2’])
9055 >> Rewr'
9056 (* clean up ‘f’ *)
9057 >> Q.PAT_X_ASSUM ‘f IN measurable (m_space p,measurable_sets p) (Borel CROSS Borel)’ K_TAC
9058 >> Q.UNABBREV_TAC ‘f’
9059 (* applying Fubini; finiteness / integrability is needed here. *)
9060 >> Know ‘integral (m1 CROSS m2) u = integral m2 (\y. integral m1 (\x. u (x,y)))’
9061 >- (MP_TAC (ISPECL [“m1 :extreal m_space”, “m2 :extreal m_space”,
9062                     “u :extreal # extreal -> extreal”] Fubini) \\
9063     Know ‘((m_space m1,measurable_sets m1) CROSS
9064            (m_space m2,measurable_sets m2)) = Borel CROSS Borel’
9065     >- rw [Abbr ‘m1’, Abbr ‘m2’, SPACE] >> Rewr' \\
9066     ASM_SIMP_TAC std_ss [o_DEF] \\
9067     Suff ‘pos_fn_integral m2 (\y. pos_fn_integral m1 (\x. abs (u (x,y)))) <> PosInf’
9068     >- METIS_TAC [] \\
9069     rw [Abbr ‘u’, abs_mul] \\
9070     Know ‘pos_fn_integral m2 (\y. pos_fn_integral m1 (\x. abs x * abs y)) =
9071           pos_fn_integral m2 (\y. abs y * pos_fn_integral m1 (\x. abs x))’
9072     >- (MATCH_MP_TAC pos_fn_integral_cong_AE >> rw [] >| (* 3 subgoals *)
9073         [ (* goal 1 (of 3) *)
9074           MATCH_MP_TAC pos_fn_integral_pos >> art [] \\
9075           Q.X_GEN_TAC ‘y’ >> rw [] \\
9076           MATCH_MP_TAC le_mul >> REWRITE_TAC [abs_pos],
9077           (* goal 2 (of 3) *)
9078           MATCH_MP_TAC le_mul >> REWRITE_TAC [abs_pos] \\
9079           MATCH_MP_TAC pos_fn_integral_pos >> rw [abs_pos],
9080           (* goal 3 (of 3) *)
9081           rw [AE_DEF] \\
9082           Q.EXISTS_TAC ‘{PosInf; NegInf}’ \\
9083           reverse CONJ_TAC
9084           >- (rw [] >> ‘?r. x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
9085               REWRITE_TAC [extreal_abs_def, ETA_AX] \\
9086               GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [mul_comm] \\
9087               MATCH_MP_TAC pos_fn_integral_cmul >> rw [abs_pos]) \\
9088           rw [null_set_def, Abbr ‘m2’, distr_def]
9089           >- (MATCH_MP_TAC BOREL_MEASURABLE_SETS_FINITE \\
9090               REWRITE_TAC [FINITE_TWO]) \\
9091           Know ‘PREIMAGE Y {PosInf; NegInf} INTER m_space p = {}’
9092           >- (rw [PREIMAGE_def, Once EXTENSION] \\
9093               METIS_TAC []) >> Rewr' \\
9094          ‘positive p’ by PROVE_TAC [MEASURE_SPACE_POSITIVE] \\
9095           fs [positive_def] ]) >> Rewr' \\
9096     ONCE_REWRITE_TAC [mul_comm] \\
9097     Know ‘pos_fn_integral m1 (\x. abs x) <> PosInf’
9098     >- (rw [Abbr ‘m1’, ETA_AX] \\
9099         Know ‘pos_fn_integral (space Borel,subsets Borel,distr p X) abs =
9100               pos_fn_integral p (abs o X)’
9101         >- (MATCH_MP_TAC pos_fn_integral_distr \\
9102             rw [SIGMA_ALGEBRA_BOREL, IN_MEASURABLE_BOREL_BOREL_ABS, abs_pos]) >> Rewr' \\
9103         Know ‘integrable p (abs o X)’ >- PROVE_TAC [integrable_abs] \\
9104         rw [integrable_def, FN_PLUS_ABS_SELF]) >> DISCH_TAC \\
9105     Know ‘0 <= pos_fn_integral m1 (\x. abs x)’
9106     >- (MATCH_MP_TAC pos_fn_integral_pos >> rw [abs_pos]) >> DISCH_TAC \\
9107    ‘pos_fn_integral m1 (\x. abs x) <> NegInf’ by PROVE_TAC [pos_not_neginf] \\
9108    ‘?r. 0 <= r /\ pos_fn_integral m1 (\x. abs x) = Normal r’
9109       by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_le_eq] >> POP_ORW \\
9110     Know ‘pos_fn_integral m2 (\y. Normal r * abs y) =
9111           Normal r * pos_fn_integral m2 abs’
9112     >- (MATCH_MP_TAC pos_fn_integral_cmul >> rw [abs_pos]) >> Rewr' \\
9113     Know ‘pos_fn_integral m2 abs <> PosInf’
9114     >- (rw [Abbr ‘m2’] \\
9115         Know ‘pos_fn_integral (space Borel,subsets Borel,distr p Y) abs =
9116               pos_fn_integral p (abs o Y)’
9117         >- (MATCH_MP_TAC pos_fn_integral_distr \\
9118             rw [SIGMA_ALGEBRA_BOREL, IN_MEASURABLE_BOREL_BOREL_ABS, abs_pos]) >> Rewr' \\
9119         Know ‘integrable p (abs o Y)’ >- PROVE_TAC [integrable_abs] \\
9120         rw [integrable_def, FN_PLUS_ABS_SELF]) >> DISCH_TAC \\
9121     Know ‘pos_fn_integral m2 abs <> NegInf’
9122     >- (MATCH_MP_TAC pos_not_neginf \\
9123         MATCH_MP_TAC pos_fn_integral_pos >> rw [abs_pos]) >> DISCH_TAC \\
9124    ‘?z. pos_fn_integral m2 abs = Normal z’ by METIS_TAC [extreal_cases] >> POP_ORW \\
9125     REWRITE_TAC [extreal_mul_def, extreal_not_infty])
9126 >> Rewr'
9127 (* clean up ‘u’, now all pairs disappeared *)
9128 >> Q.UNABBREV_TAC ‘u’ >> simp []
9129 (* applying integral_cong_AE and integral_cmul, twice *)
9130 >> Know ‘integral m2 (\y. integral m1 (\x. x * y)) =
9131          integral m2 (\y. y * integral m1 (\x. x))’
9132 >- (GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [mul_comm] \\
9133     MATCH_MP_TAC integral_cong_AE >> rw [AE_DEF] \\
9134     Q.EXISTS_TAC ‘{PosInf; NegInf}’ \\
9135     CONJ_TAC
9136     >- (rw [null_set_def, Abbr ‘m2’, distr_def]
9137         >- (MATCH_MP_TAC BOREL_MEASURABLE_SETS_FINITE \\
9138             REWRITE_TAC [FINITE_TWO]) \\
9139         Know ‘PREIMAGE Y {PosInf; NegInf} INTER m_space p = {}’
9140         >- (rw [PREIMAGE_def, Once EXTENSION] \\
9141             METIS_TAC []) >> Rewr' \\
9142        ‘positive p’ by PROVE_TAC [MEASURE_SPACE_POSITIVE] \\
9143         fs [positive_def]) \\
9144     rw [] >> ‘?r. x = Normal r’ by METIS_TAC [extreal_cases] >> POP_ORW \\
9145     HO_MATCH_MP_TAC integral_cmul >> art [] \\
9146     rw [integrable_def, Abbr ‘m1’, IN_MEASURABLE_BOREL_BOREL_I] >| (* 2 subgoals *)
9147     [ (* goal 1 (of 2) *)
9148       Know ‘pos_fn_integral (space Borel,subsets Borel,distr p X) (fn_plus (\x. x)) =
9149             pos_fn_integral p (fn_plus (\x. x) o X)’
9150       >- (MATCH_MP_TAC pos_fn_integral_distr \\
9151           rw [FN_PLUS_POS, SIGMA_ALGEBRA_BOREL] \\
9152           MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_PLUS \\
9153           REWRITE_TAC [IN_MEASURABLE_BOREL_BOREL_I, SIGMA_ALGEBRA_BOREL]) >> Rewr' \\
9154      ‘(fn_plus (\x. x) o X) = fn_plus X’ by rw [fn_plus_def, o_DEF] >> POP_ORW \\
9155       fs [integrable_def],
9156       (* goal 2 (of 2) *)
9157       Know ‘pos_fn_integral (space Borel,subsets Borel,distr p X) (fn_minus (\x. x)) =
9158             pos_fn_integral p (fn_minus (\x. x) o X)’
9159       >- (MATCH_MP_TAC pos_fn_integral_distr \\
9160           rw [FN_MINUS_POS, SIGMA_ALGEBRA_BOREL] \\
9161           MATCH_MP_TAC IN_MEASURABLE_BOREL_FN_MINUS \\
9162           REWRITE_TAC [IN_MEASURABLE_BOREL_BOREL_I, SIGMA_ALGEBRA_BOREL]) >> Rewr' \\
9163      ‘(fn_minus (\x. x) o X) = fn_minus X’ by rw [fn_minus_def, o_DEF] >> POP_ORW \\
9164       fs [integrable_def] ])
9165 >> Rewr'
9166 >> Know ‘integrable m1 (\x. x)’
9167 >- (rw [Abbr ‘m1’] \\
9168     MP_TAC (Q.SPECL [‘p’, ‘Borel’, ‘X’, ‘\x. x’]
9169                     (INST_TYPE [“:'b” |-> “:extreal”] integral_distr)) \\
9170     rw [IN_MEASURABLE_BOREL_BOREL_I, SIGMA_ALGEBRA_BOREL, o_DEF, ETA_AX])
9171 >> DISCH_TAC
9172 >> Know ‘integrable m2 (\x. x)’
9173 >- (rw [Abbr ‘m2’] \\
9174     MP_TAC (Q.SPECL [‘p’, ‘Borel’, ‘Y’, ‘\x. x’]
9175                     (INST_TYPE [“:'b” |-> “:extreal”] integral_distr)) \\
9176     rw [IN_MEASURABLE_BOREL_BOREL_I, SIGMA_ALGEBRA_BOREL, o_DEF, ETA_AX])
9177 >> DISCH_TAC
9178 >> Know ‘integral m2 (\y. y * integral m1 (\x. x)) =
9179          integral m1 (\x. x) * integral m2 (\y. y)’
9180 >- (GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [mul_comm] \\
9181    ‘?r. integral m1 (\x. x) = Normal r’ by PROVE_TAC [integrable_normal_integral] \\
9182     POP_ORW \\
9183     HO_MATCH_MP_TAC integral_cmul >> art [])
9184 >> Rewr'
9185 >> Know ‘(\x. x) IN measurable Borel Borel’
9186 >- (rw [IN_MEASURABLE, SIGMA_ALGEBRA_BOREL, IN_FUNSET, PREIMAGE_def] \\
9187     MATCH_MP_TAC SIGMA_ALGEBRA_INTER >> rw [SIGMA_ALGEBRA_BOREL] \\
9188     MATCH_MP_TAC SIGMA_ALGEBRA_SPACE >> rw [SIGMA_ALGEBRA_BOREL])
9189 >> DISCH_TAC
9190(* applying integral_distr, twice *)
9191 >> Know ‘integral p X = integral m1 (\x. x)’
9192 >- (MP_TAC (ISPECL [“p :'a m_space”, “Borel”, “X :'a -> extreal”,
9193                     “(\x. x) :extreal -> extreal”] integral_distr) \\
9194     RW_TAC std_ss [Abbr ‘m1’, SIGMA_ALGEBRA_BOREL, o_DEF, ETA_AX])
9195 >> Rewr'
9196 >> Know ‘integral p Y = integral m2 (\y. y)’
9197 >- (MP_TAC (ISPECL [“p :'a m_space”, “Borel”, “Y :'a -> extreal”,
9198                     “(\x. x) :extreal -> extreal”] integral_distr) \\
9199     RW_TAC std_ss [Abbr ‘m2’, SIGMA_ALGEBRA_BOREL, o_DEF, ETA_AX])
9200 >> Rewr
9201QED
9202
9203(* An easy corollary of Theorem 3.3.3 *)
9204Theorem indep_vars_imp_uncorrelated :
9205    !p X Y. prob_space p /\ real_random_variable X p /\ real_random_variable Y p /\
9206            finite_second_moments p X /\ finite_second_moments p Y /\
9207            indep_rv p X Y Borel Borel ==> uncorrelated p X Y
9208Proof
9209    RW_TAC std_ss [uncorrelated_def]
9210 >> MATCH_MP_TAC indep_vars_expectation >> art []
9211 >> CONJ_TAC (* 2 subgoals, same tactics *)
9212 >> MATCH_MP_TAC finite_second_moments_imp_integrable >> art []
9213QED
9214
9215Theorem pairwise_indep_vars_imp_uncorrelated :
9216    !p X A (J :'index set). prob_space p /\
9217           (!i. i IN J ==> real_random_variable (X i) p) /\
9218           (!i. i IN J ==> finite_second_moments p (X i)) /\
9219            pairwise_indep_vars p X (\n. Borel) J ==>
9220            uncorrelated_vars p X J
9221Proof
9222    RW_TAC std_ss [pairwise_indep_vars_def, uncorrelated_vars_def]
9223 >> MATCH_MP_TAC indep_vars_imp_uncorrelated
9224 >> ASM_SIMP_TAC std_ss []
9225QED
9226
9227(* another version of variance_sum for pairwise independent r.v.'s *)
9228Theorem variance_sum' :
9229    !p X (J :'index set).
9230          prob_space p /\ FINITE J /\ pairwise_indep_vars p X (\n. Borel) J /\
9231         (!i. i IN J ==> real_random_variable (X i) p) /\
9232         (!i. i IN J ==> finite_second_moments p (X i)) ==>
9233         (variance p (\x. SIGMA (\n. X n x) J) = SIGMA (\n. variance p (X n)) J)
9234Proof
9235    rpt STRIP_TAC
9236 >> Know ‘uncorrelated_vars p X J’
9237 >- (rw [uncorrelated_vars_def] \\
9238     MATCH_MP_TAC indep_vars_imp_uncorrelated >> rw [] \\
9239     fs [pairwise_indep_vars_def])
9240 >> DISCH_TAC
9241 >> MATCH_MP_TAC variance_sum >> art []
9242QED
9243
9244(* ========================================================================= *)
9245(*                      Condition Probability Library                        *)
9246(* ========================================================================= *)
9247
9248Theorem COND_PROB_ZERO :
9249    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9250           (prob p A = 0) /\ prob p B <> 0 ==> (cond_prob p A B = 0)
9251Proof
9252    RW_TAC std_ss [cond_prob_def, PROB_ZERO_INTER, zero_div]
9253QED
9254
9255Theorem COND_PROB_ZERO_INTER :
9256    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9257           (prob p (A INTER B) = 0) /\ prob p B <> 0 ==> (cond_prob p A B = 0)
9258Proof
9259    RW_TAC std_ss [cond_prob_def, zero_div]
9260QED
9261
9262Theorem COND_PROB_INCREASING :
9263    !p A B C. prob_space p /\ A IN events p /\ B IN events p /\ C IN events p /\
9264              prob p C <> 0 ==> cond_prob p (A INTER B) C <= cond_prob p A C
9265Proof
9266    RW_TAC std_ss [cond_prob_def, real_div]
9267 >> `(A INTER B INTER C) SUBSET (A INTER C)` by SET_TAC []
9268 >> `A INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9269 >> `A INTER B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9270 >> `0 < prob p C` by METIS_TAC [le_lt, PROB_POSITIVE]
9271 >> MATCH_MP_TAC ldiv_le_imp
9272 >> ASM_SIMP_TAC std_ss [PROB_FINITE]
9273 >> MATCH_MP_TAC PROB_INCREASING >> art []
9274QED
9275
9276Theorem COND_PROB_POS_IMP_PROB_NZ : (* was: POS_COND_PROB_IMP_POS_PROB *)
9277    !A B p. prob_space p /\ A IN events p /\ B IN events p /\
9278            0 < cond_prob p A B /\ prob p B <> 0 ==> prob p (A INTER B) <> 0
9279Proof
9280    RW_TAC std_ss []
9281 >> `0 < prob p B` by METIS_TAC [lt_le, PROB_POSITIVE]
9282 >> FULL_SIMP_TAC std_ss [cond_prob_def]
9283 >> CCONTR_TAC >> fs []
9284 >> `0 / prob p B = 0` by METIS_TAC [zero_div]
9285 >> METIS_TAC [lt_refl]
9286QED
9287
9288Theorem COND_PROB_BOUNDS :
9289    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9290            prob p B <> 0 ==> 0 <= cond_prob p A B /\ cond_prob p A B <= 1
9291Proof
9292    rpt GEN_TAC >> STRIP_TAC
9293 >> `0 < prob p B` by METIS_TAC [lt_le, PROB_POSITIVE]
9294 >> `prob p B <> 0` by METIS_TAC [lt_le]
9295 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9296 >> `?r. prob p B = Normal r` by METIS_TAC [extreal_cases]
9297 >> `0 < r` by METIS_TAC [extreal_of_num_def, extreal_lt_eq]
9298 >> `A INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9299 >> `0 <= prob p (A INTER B)` by METIS_TAC [PROB_POSITIVE]
9300 >> REWRITE_TAC [cond_prob_def]
9301 >> CONJ_TAC
9302 >- (`(prob p (A INTER B) = 0) \/ 0 < prob p (A INTER B)` by METIS_TAC [le_lt]
9303     >- (POP_ORW >> Suff `0 / prob p B = 0` >- rw [le_refl] \\
9304         MATCH_MP_TAC zero_div >> art []) \\
9305     MATCH_MP_TAC lt_imp_le >> art [] \\
9306     MATCH_MP_TAC lt_div >> art [])
9307 >> ASM_SIMP_TAC std_ss [GSYM le_ldiv, mul_lone]
9308 >> Q.PAT_X_ASSUM `prob p B = Normal r` (ONCE_REWRITE_TAC o wrap o SYM)
9309 >> MATCH_MP_TAC PROB_INCREASING
9310 >> ASM_SIMP_TAC std_ss [INTER_SUBSET]
9311QED
9312
9313Theorem COND_PROB_FINITE : (* new *)
9314    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9315            prob p B <> 0 ==> cond_prob p A B <> PosInf /\ cond_prob p A B <> NegInf
9316Proof
9317    rpt GEN_TAC >> STRIP_TAC
9318 >> `0 <= cond_prob p A B /\ cond_prob p A B <= 1` by METIS_TAC [COND_PROB_BOUNDS]
9319 >> reverse CONJ_TAC
9320 >- (MATCH_MP_TAC pos_not_neginf >> art [])
9321 >> REWRITE_TAC [lt_infty]
9322 >> MATCH_MP_TAC let_trans
9323 >> Q.EXISTS_TAC `1` >> art [num_not_infty, GSYM lt_infty]
9324QED
9325
9326Theorem COND_PROB_ITSELF :
9327    !p B. prob_space p /\ B IN events p /\ prob p B <> 0 ==> (cond_prob p B B = 1)
9328Proof
9329    RW_TAC real_ss [cond_prob_def, INTER_IDEMPOT]
9330 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9331 >> MATCH_MP_TAC div_refl
9332 >> METIS_TAC [PROB_FINITE]
9333QED
9334
9335Theorem prob_div_mul_refl :
9336  !p A x. prob_space p /\ A IN events p /\ prob p A <> 0 ==>
9337          x / prob p A * prob p A = x
9338Proof
9339  rpt STRIP_TAC
9340  >> `prob p A <> PosInf /\ prob p A <> NegInf` by METIS_TAC [PROB_FINITE]
9341  >> `?a. prob p A = Normal a` by METIS_TAC [extreal_cases]
9342  >> ‘a <> 0’ by METIS_TAC [extreal_of_num_def, extreal_11]
9343  >> Q.PAT_X_ASSUM ‘prob p A = Normal a’ (ONCE_REWRITE_TAC o wrap)
9344  >> ONCE_REWRITE_TAC [EQ_SYM_EQ]
9345  >> MATCH_MP_TAC div_mul_refl >> art []
9346QED
9347
9348Theorem COND_PROB_COMPL :
9349    !p A B. prob_space p /\ A IN events p /\ COMPL A IN events p /\
9350            B IN events p /\ prob p B <> 0 ==>
9351           (cond_prob p (COMPL A) B = 1 - cond_prob p A B)
9352Proof
9353    RW_TAC std_ss [cond_prob_def]
9354 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9355 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9356 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9357 >> ASM_SIMP_TAC std_ss [ldiv_eq]
9358 >> `A INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9359 >> `prob p (A INTER B) <> PosInf /\
9360     prob p (A INTER B) <> NegInf` by METIS_TAC [PROB_FINITE]
9361 >> Know `prob p (A INTER B) / prob p B <> PosInf /\
9362          prob p (A INTER B) / prob p B <> NegInf`
9363 >- (`?a. prob p (A INTER B) = Normal a` by METIS_TAC [extreal_cases] \\
9364     `?b. prob p B = Normal b` by METIS_TAC [extreal_cases] \\
9365     `b <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] \\
9366     ASM_SIMP_TAC std_ss [extreal_div_eq, extreal_not_infty])
9367 >> STRIP_TAC
9368 >> ASM_SIMP_TAC std_ss [sub_rdistrib, num_not_infty, mul_lone]
9369 >> Know `prob p (A INTER B) / prob p B * prob p B = prob p (A INTER B)`
9370 >- simp[prob_div_mul_refl]
9371 >> ASM_SIMP_TAC std_ss [eq_sub_ladd]
9372 >> `prob p ((COMPL A) INTER B) + prob p (A INTER B) =
9373     prob p (((COMPL A) INTER B) UNION (A INTER B))`
9374       by (ONCE_REWRITE_TAC [EQ_SYM_EQ] >> MATCH_MP_TAC PROB_ADDITIVE
9375          >> RW_TAC std_ss [EVENTS_INTER, DISJOINT_DEF, EXTENSION]
9376          >> RW_TAC std_ss [NOT_IN_EMPTY, IN_COMPL, IN_INTER] >> METIS_TAC []) >> POP_ORW
9377 >> `(COMPL A INTER B UNION A INTER B) = B`
9378        by (SET_TAC [EXTENSION, IN_INTER, IN_UNION, IN_COMPL] >> METIS_TAC [])
9379 >> RW_TAC std_ss []
9380QED
9381
9382Theorem COND_PROB_DIFF :
9383    !p A1 A2 B. prob_space p /\ A1 IN events p /\ A2 IN events p /\
9384                B IN events p /\ prob p B <> 0 ==>
9385               (cond_prob p (A1 DIFF A2) B =
9386                cond_prob p A1 B - cond_prob p (A1 INTER A2) B)
9387Proof
9388    RW_TAC std_ss [cond_prob_def]
9389 >> `(A1 DIFF A2) INTER B IN events p` by METIS_TAC [EVENTS_INTER, EVENTS_DIFF]
9390 >> `A1 INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9391 >> `A1 INTER A2 INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9392 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9393 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9394 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9395 >> ASM_SIMP_TAC std_ss [ldiv_eq]
9396 >> `prob p (A1 INTER B) <> PosInf /\
9397     prob p (A1 INTER B) <> NegInf` by METIS_TAC [PROB_FINITE]
9398 >> `prob p (A1 INTER A2 INTER B) <> PosInf /\
9399     prob p (A1 INTER A2 INTER B) <> NegInf` by METIS_TAC [PROB_FINITE]
9400 >> Know `prob p (A1 INTER B) / prob p B <> PosInf /\
9401          prob p (A1 INTER B) / prob p B <> NegInf`
9402 >- (`?a. prob p (A1 INTER B) = Normal a` by METIS_TAC [extreal_cases] \\
9403     POP_ORW >> METIS_TAC [div_not_infty]) >> STRIP_TAC
9404 >> Know `prob p (A1 INTER A2 INTER B) / prob p B <> PosInf /\
9405          prob p (A1 INTER A2 INTER B) / prob p B <> NegInf`
9406 >- (`?a. prob p (A1 INTER A2 INTER B) = Normal a`
9407          by METIS_TAC [extreal_cases] >> POP_ORW \\
9408     METIS_TAC [div_not_infty]) >> STRIP_TAC
9409 >> ASM_SIMP_TAC std_ss [sub_rdistrib]
9410 >> Know `prob p (A1 INTER B) / prob p B * prob p B = prob p (A1 INTER B)`
9411 >- simp[prob_div_mul_refl]
9412 >> Know `prob p (A1 INTER A2 INTER B) / prob p B * prob p B =
9413          prob p (A1 INTER A2 INTER B)`
9414 >- simp[prob_div_mul_refl]
9415 >> ASM_SIMP_TAC std_ss [eq_sub_ladd]
9416 >> `prob p ((A1 DIFF A2) INTER B) + prob p (A1 INTER A2 INTER B) =
9417        prob p (((A1 DIFF A2) INTER B) UNION (A1 INTER A2 INTER B))`
9418        by (ONCE_REWRITE_TAC [EQ_SYM_EQ] >> MATCH_MP_TAC PROB_ADDITIVE
9419           >> RW_TAC std_ss [EVENTS_INTER, EVENTS_DIFF, DISJOINT_DEF, EXTENSION]
9420           >> RW_TAC std_ss [IN_DIFF, IN_INTER, NOT_IN_EMPTY] >> PROVE_TAC [])
9421 >> `((A1 DIFF A2) INTER B UNION A1 INTER A2 INTER B) = (A1 INTER B)`
9422        by (RW_TAC std_ss [EXTENSION, IN_INTER, IN_DIFF, IN_UNION] THEN PROVE_TAC [])
9423 >> RW_TAC std_ss []
9424QED
9425
9426Theorem COND_PROB_MUL_RULE :
9427    !p A B. prob_space p /\ A IN events p /\ B IN events p /\ prob p B <> 0 ==>
9428           (prob p (A INTER B) = (prob p B) * (cond_prob p A B))
9429Proof
9430    RW_TAC std_ss []
9431 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9432 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9433 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9434 >> ASM_SIMP_TAC std_ss [cond_prob_def, ldiv_eq, Once mul_comm]
9435 >> `?b. prob p B = Normal b` by METIS_TAC [extreal_cases]
9436 >> `b <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] >> art []
9437 >> MATCH_MP_TAC div_mul_refl >> art []
9438QED
9439
9440Theorem COND_PROB_MUL_EQ :
9441    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9442            prob p A <> 0 /\ prob p B <> 0 ==>
9443           (cond_prob p A B * prob p B = cond_prob p B A * prob p A)
9444Proof
9445    RW_TAC std_ss [cond_prob_def, Once INTER_COMM]
9446 >> `prob p A <> PosInf /\ prob p A <> NegInf` by METIS_TAC [PROB_FINITE]
9447 >> `prob p A < PosInf` by METIS_TAC [lt_infty]
9448 >> `0 < prob p A` by METIS_TAC [le_lt, PROB_POSITIVE]
9449 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9450 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9451 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9452 >> Know `prob p (B INTER A) / prob p A * prob p A = prob p (B INTER A)`
9453 >- simp[prob_div_mul_refl]
9454 >> Know `prob p (B INTER A) / prob p B * prob p B = prob p (B INTER A)`
9455 >- simp[prob_div_mul_refl] >> rw[]
9456QED
9457
9458Theorem COND_PROB_UNION :
9459    !p A1 A2 B.
9460       prob_space p /\ A1 IN events p /\ A2 IN events p /\ B IN events p /\
9461       prob p B <> 0 ==>
9462      (cond_prob p (A1 UNION A2) B =
9463       (cond_prob p A1 B) + (cond_prob p A2 B) - (cond_prob p (A1 INTER A2) B))
9464Proof
9465    RW_TAC std_ss []
9466 >> `cond_prob p A1 B <> PosInf /\ cond_prob p A1 B <> NegInf /\
9467     cond_prob p A2 B <> PosInf /\ cond_prob p A2 B <> NegInf`
9468      by METIS_TAC [COND_PROB_FINITE]
9469 >> ASM_SIMP_TAC std_ss [Once add_comm]
9470 >> `A1 INTER A2 IN events p` by METIS_TAC [EVENTS_INTER]
9471 >> `cond_prob p (A1 INTER A2) B <> PosInf /\
9472     cond_prob p (A1 INTER A2) B <> NegInf` by METIS_TAC [COND_PROB_FINITE]
9473 >> Know `cond_prob p A2 B + cond_prob p A1 B - cond_prob p (A1 INTER A2) B =
9474          cond_prob p A2 B + (cond_prob p A1 B - cond_prob p (A1 INTER A2) B)`
9475 >- (`?a. cond_prob p A2 B = Normal a` by METIS_TAC [extreal_cases] >> POP_ORW \\
9476     `?b. cond_prob p A1 B = Normal b` by METIS_TAC [extreal_cases] >> POP_ORW \\
9477     `?c. cond_prob p (A1 INTER A2) B = Normal c` by METIS_TAC [extreal_cases] \\
9478     POP_ORW >> SIMP_TAC real_ss [extreal_add_def, extreal_sub_def, extreal_11] \\
9479     REAL_ARITH_TAC) >> Rewr'
9480 >> `cond_prob p A1 B - cond_prob p (A1 INTER A2) B = cond_prob p (A1 DIFF A2) B`
9481        by PROVE_TAC [COND_PROB_DIFF] >> POP_ORW
9482 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9483 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9484 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9485 >> ASM_SIMP_TAC std_ss [cond_prob_def, ldiv_eq]
9486 >> Know `(prob p (A2 INTER B) / prob p B +
9487           prob p ((A1 DIFF A2) INTER B) / prob p B) * prob p B =
9488           prob p (A2 INTER B) / prob p B * prob p B +
9489           prob p ((A1 DIFF A2) INTER B) / prob p B * prob p B`
9490 >- (`?r. prob p B = Normal r` by METIS_TAC [extreal_cases] >> art [] \\
9491     MATCH_MP_TAC add_rdistrib_normal >> DISJ1_TAC \\
9492     POP_ASSUM (ONCE_REWRITE_TAC o wrap o SYM) \\
9493     REWRITE_TAC [GSYM cond_prob_def] >> art [] \\
9494    `A1 DIFF A2 IN events p` by METIS_TAC [EVENTS_DIFF] \\
9495     METIS_TAC [COND_PROB_FINITE]) >> Rewr'
9496 >> Know `prob p (A2 INTER B) / prob p B * prob p B = prob p (A2 INTER B)`
9497 >- simp[prob_div_mul_refl]
9498 >> Know `prob p ((A1 DIFF A2) INTER B) / prob p B * prob p B =
9499          prob p ((A1 DIFF A2) INTER B)`
9500 >- simp[prob_div_mul_refl]
9501 >> `(A1 UNION A2) INTER B IN events p` by METIS_TAC [EVENTS_UNION, EVENTS_INTER]
9502 >> `A2 INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9503 >> `(A1 DIFF A2) INTER B IN events p` by METIS_TAC [EVENTS_INTER, EVENTS_DIFF]
9504 >> `prob p (A2 INTER B) + prob p ((A1 DIFF A2) INTER B) =
9505       prob p ((A2 INTER B) UNION ((A1 DIFF A2) INTER B))`
9506       by (ONCE_REWRITE_TAC [EQ_SYM_EQ] >> MATCH_MP_TAC PROB_ADDITIVE
9507          >> RW_TAC std_ss [EVENTS_INTER, EVENTS_DIFF, DISJOINT_DEF, EXTENSION]
9508          >> RW_TAC std_ss [IN_INTER, IN_DIFF, NOT_IN_EMPTY] >> PROVE_TAC [])
9509 >> `(A2 INTER B UNION (A1 DIFF A2) INTER B) = ((A1 UNION A2) INTER B)`
9510        by (RW_TAC std_ss [EXTENSION, IN_INTER, IN_DIFF, IN_UNION] THEN PROVE_TAC [])
9511 >> RW_TAC std_ss []
9512QED
9513
9514Theorem COND_PROB_FINITE_ADDITIVE :
9515    !p A B n s. prob_space p /\ B IN events p /\ A IN ((count n) -> events p) /\
9516                (s = BIGUNION (IMAGE A (count n))) /\ prob p B <> 0 /\
9517                (!a b. a <> b ==> DISJOINT (A a) (A b)) ==>
9518                (cond_prob p s B = SIGMA (\i. cond_prob p (A i) B) (count n))
9519Proof
9520    RW_TAC std_ss [IN_FUNSET, IN_COUNT]
9521 >> `0 <= prob p (B:'a -> bool)` by RW_TAC std_ss [PROB_POSITIVE]
9522 >> `BIGUNION (IMAGE A (count n)) IN events p` by METIS_TAC [EVENTS_BIGUNION, IN_FUNSET, IN_COUNT]
9523 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9524 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9525 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9526 >> GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [cond_prob_def]
9527 >> ASM_SIMP_TAC std_ss [ldiv_eq, Once mul_comm]
9528 >> Know `prob p B * SIGMA (\i. cond_prob p (A i) B) (count n) =
9529          SIGMA (\i. prob p B * (\i. cond_prob p (A i) B) i) (count n)`
9530 >- (`?r. prob p B = Normal r` by METIS_TAC [extreal_cases] >> POP_ORW \\
9531     MATCH_MP_TAC EQ_SYM >> irule EXTREAL_SUM_IMAGE_CMUL \\
9532     REWRITE_TAC [FINITE_COUNT] >> DISJ1_TAC \\
9533     RW_TAC std_ss [IN_COUNT] >> METIS_TAC [COND_PROB_FINITE])
9534 >> BETA_TAC >> Rewr'
9535 >> REWRITE_TAC [cond_prob_def, Once mul_comm]
9536 >> Know `!i. prob p (A i INTER B) / prob p B * prob p B = prob p (A i INTER B)`
9537 >- simp[prob_div_mul_refl] >> Rewr'
9538 >> `SIGMA (\i. prob p (A i INTER B)) (count n) = SIGMA (prob p o (\i. A i INTER B)) (count n)`
9539        by METIS_TAC [] >> POP_ORW
9540 >> Know `BIGUNION (IMAGE A (count n)) INTER B = BIGUNION (IMAGE (\i. A i INTER B) (count n))`
9541 >- (RW_TAC set_ss [INTER_COMM, INTER_BIGUNION, Once EXTENSION, IN_IMAGE] \\
9542     EQ_TAC >> rpt STRIP_TAC >| (* 3 subgoals *)
9543     [ (* goal 1 (of 3) *)
9544       rename1 `s = A i` >> Q.EXISTS_TAC `B INTER (A i)` \\
9545       reverse CONJ_TAC >- (Q.EXISTS_TAC `i` >> art []) \\
9546       METIS_TAC [IN_INTER],
9547       (* goal 2 (of 3) *)
9548       fs [IN_INTER] >> Q.EXISTS_TAC `A i` >> art [] \\
9549       Q.EXISTS_TAC `i` >> art [],
9550       (* goal 3 (of 3) *)
9551       fs [IN_INTER] ]) >> Rewr'
9552 >> MATCH_MP_TAC PROB_FINITE_ADDITIVE
9553 >> RW_TAC std_ss [IN_FUNSET, IN_COUNT, FINITE_COUNT]
9554 >- METIS_TAC [EVENTS_INTER]
9555 >> MATCH_MP_TAC DISJOINT_RESTRICT_L
9556 >> PROVE_TAC []
9557QED
9558
9559Theorem BAYES_RULE :
9560    !p A B. prob_space p /\ A IN events p /\ B IN events p /\
9561            prob p A <> 0 ==>
9562           (cond_prob p B A = (cond_prob p A B) * (prob p B) / (prob p A))
9563Proof
9564    RW_TAC std_ss []
9565 >> Cases_on ‘prob p B = 0’
9566 >- gvs[zero_div, cond_prob_def, PROB_ZERO_INTER]
9567 >> `prob p A <> PosInf /\ prob p A <> NegInf` by METIS_TAC [PROB_FINITE]
9568 >> `prob p A < PosInf` by METIS_TAC [lt_infty]
9569 >> `0 < prob p A` by METIS_TAC [le_lt, PROB_POSITIVE]
9570 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9571 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9572 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9573 >> GEN_REWRITE_TAC (RATOR_CONV o ONCE_DEPTH_CONV) empty_rewrites [cond_prob_def]
9574 >> ASM_SIMP_TAC bool_ss [ldiv_eq]
9575 >> Know `cond_prob p A B * prob p B / prob p A * prob p A =
9576          cond_prob p A B * prob p B`
9577 >- simp[ prob_div_mul_refl]
9578 >> Rewr'
9579 >> REWRITE_TAC [cond_prob_def]
9580 >> Know `prob p (A INTER B) / prob p B * prob p B = prob p (A INTER B)`
9581 >- simp[prob_div_mul_refl] >> Rewr'
9582 >> REWRITE_TAC [Once INTER_COMM]
9583QED
9584
9585Theorem TOTAL_PROB_SIGMA :
9586    !p A B s. prob_space p /\ A IN events p /\ FINITE s /\
9587             (!x. x IN s ==> B x IN events p /\ prob p (B x) <> 0) /\
9588             (!a b. a IN s /\ b IN s /\ ~(a = b) ==> DISJOINT (B a) (B b)) /\
9589             (BIGUNION (IMAGE B s) = p_space p) ==>
9590             (prob p A = SIGMA (\i. (prob p (B i)) * (cond_prob p A (B i))) s)
9591Proof
9592    RW_TAC std_ss []
9593 >> `!x. x IN s ==> prob p (B x) <> PosInf /\
9594                    prob p (B x) <> NegInf` by METIS_TAC [PROB_FINITE]
9595 >> `!x. x IN s ==> prob p (B x) < PosInf` by METIS_TAC [lt_infty]
9596 >> `!x. x IN s ==> 0 < prob p (B x)` by METIS_TAC [le_lt, PROB_POSITIVE]
9597 >> Know `SIGMA (\i. prob p (B i) * cond_prob p A (B i)) (s:'b -> bool) =
9598          SIGMA (\i. prob p (A INTER (B i))) s`
9599 >- (irule EXTREAL_SUM_IMAGE_EQ \\
9600     STRONG_CONJ_TAC
9601     >- (RW_TAC std_ss [cond_prob_def, Once mul_comm] \\
9602         MATCH_MP_TAC EQ_SYM \\
9603        `?b. prob p (B x) = Normal b` by METIS_TAC [extreal_cases] \\
9604        `b <> 0` by METIS_TAC [extreal_of_num_def, extreal_11] >> art [] \\
9605         MATCH_MP_TAC div_mul_refl >> art []) \\
9606     RW_TAC std_ss [] >> DISJ1_TAC >> GEN_TAC >> DISCH_TAC \\
9607    `A INTER B x IN events p` by METIS_TAC [EVENTS_INTER] \\
9608     METIS_TAC [PROB_FINITE]) >> Rewr'
9609 >> MATCH_MP_TAC PROB_EXTREAL_SUM_IMAGE_FN
9610 >> RW_TAC std_ss [EVENTS_INTER, INTER_IDEMPOT]
9611QED
9612
9613Theorem BAYES_RULE_GENERAL_SIGMA :
9614    !p A B s k. prob_space p /\ A IN events p /\ prob p A <> 0 /\ FINITE s /\
9615        (!x . x IN s ==> B x IN events p /\ prob p (B x) <> 0) /\
9616         k IN s /\ (!a b. a IN s /\ b IN s /\ ~(a = b) ==> DISJOINT (B a) (B b)) /\
9617        (BIGUNION (IMAGE B s) = p_space p) ==>
9618        (cond_prob p (B k) A = ((cond_prob p A (B k)) * prob p (B k)) /
9619                                (SIGMA (\i. (prob p (B i)) * (cond_prob p A (B i)))) s)
9620Proof
9621    RW_TAC std_ss [GSYM TOTAL_PROB_SIGMA]
9622 >> MATCH_MP_TAC BAYES_RULE
9623 >> RW_TAC std_ss []
9624QED
9625
9626Theorem COND_PROB_ADDITIVE :
9627    !p A B s. prob_space p /\ FINITE s /\ B IN events p /\
9628             (!x. x IN s ==> A x IN events p) /\ prob p B <> 0 /\
9629             (!x y. x IN s /\ y IN s /\ x <> y ==> DISJOINT (A x) (A y)) /\
9630             (BIGUNION (IMAGE A s) = p_space p) ==>
9631             (SIGMA (\i. cond_prob p (A i) B) s = 1)
9632Proof
9633    RW_TAC std_ss []
9634 >> `prob p B <> PosInf /\ prob p B <> NegInf` by METIS_TAC [PROB_FINITE]
9635 >> `prob p B < PosInf` by METIS_TAC [lt_infty]
9636 >> `0 < prob p B` by METIS_TAC [le_lt, PROB_POSITIVE]
9637 >> `(SIGMA (\i. cond_prob p (A i) B) (s:'b -> bool) = 1) <=>
9638          (prob p B * SIGMA (\i. cond_prob p (A i) B) s = prob p B * 1)`
9639     by METIS_TAC [mul_lcancel] >> POP_ORW
9640 >> Know `prob p B * SIGMA (\i. cond_prob p (A i) B) (s:'b -> bool) =
9641          SIGMA (\i. prob p B * (\i. cond_prob p (A i) B) i) s`
9642 >- (`?r. prob p B = Normal r` by METIS_TAC [extreal_cases] >> POP_ORW \\
9643     MATCH_MP_TAC EQ_SYM >> irule EXTREAL_SUM_IMAGE_CMUL \\
9644     RW_TAC std_ss [COND_PROB_FINITE]) >> BETA_TAC >> Rewr'
9645 >> RW_TAC std_ss [cond_prob_def, Once mul_comm]
9646 >> Know `!i. prob p (A i INTER B) / prob p B * prob p B = prob p (A i INTER B)`
9647 >- (GEN_TAC >> simp[prob_div_mul_refl]) >> Rewr'
9648 >> REWRITE_TAC [mul_rone, Once EQ_SYM_EQ, Once INTER_COMM]
9649 >> MATCH_MP_TAC PROB_EXTREAL_SUM_IMAGE_FN
9650 >> RW_TAC std_ss [INTER_IDEMPOT, EVENTS_INTER]
9651QED
9652
9653Theorem COND_PROB_SWAP :
9654    !p A B C.
9655       prob_space p /\ A IN events p /\ B IN events p /\ C IN events p /\
9656       prob p (B INTER C) <> 0 /\ prob p (A INTER C) <> 0 ==>
9657      (cond_prob p A (B INTER C) * cond_prob p B C =
9658       cond_prob p B (A INTER C) * cond_prob p A C)
9659Proof
9660    RW_TAC std_ss []
9661 >> `B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9662 >> `A INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9663 >> `A INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9664 >> Know `prob p C <> 0`
9665 >- (CCONTR_TAC >> fs [] \\
9666    `0 < prob p (B INTER C)` by METIS_TAC [PROB_POSITIVE, le_lt] \\
9667     Know `prob p (B INTER C) <= prob p C`
9668     >- (MATCH_MP_TAC PROB_INCREASING >> ASM_SET_TAC [EVENTS_INTER]) \\
9669     DISCH_TAC >> METIS_TAC [lte_trans, lt_refl]) >> DISCH_TAC
9670 >> RW_TAC std_ss [cond_prob_def]
9671 >> `A INTER (B INTER C) = B INTER (A INTER C)`
9672       by METIS_TAC [GSYM INTER_ASSOC, INTER_COMM] >> POP_ORW
9673 >> `B INTER (A INTER C) IN events p` by METIS_TAC [EVENTS_INTER]
9674 >> `?a. prob p (B INTER (A INTER C)) = Normal a` by METIS_TAC [PROB_FINITE, extreal_cases]
9675 >> `?b. prob p (B INTER C) = Normal b` by METIS_TAC [PROB_FINITE, extreal_cases]
9676 >> `?c. prob p (A INTER C) = Normal c` by METIS_TAC [PROB_FINITE, extreal_cases]
9677 >> `?d. prob p C = Normal d` by METIS_TAC [PROB_FINITE, extreal_cases]
9678 >> `b <> 0 /\ c <> 0 /\ d <> 0` by METIS_TAC [extreal_of_num_def, extreal_11]
9679 >> ASM_SIMP_TAC std_ss [extreal_mul_def, extreal_div_eq, extreal_11]
9680 >> `!(a:real) b c d. a * b * (c * d) = a * (b * c) * d` by METIS_TAC [REAL_MUL_ASSOC]
9681 >> RW_TAC std_ss [real_div, REAL_MUL_LINV, REAL_MUL_LID, REAL_MUL_RID]
9682QED
9683
9684Theorem PROB_INTER_SPLIT :
9685    !p A B C.
9686       prob_space p /\ A IN events p /\ B IN events p /\ C IN events p /\
9687       prob p (B INTER C) <> 0 ==>
9688      (prob p (A INTER B INTER C) =
9689       cond_prob p A (B INTER C) * cond_prob p B C * prob p C)
9690Proof
9691    RW_TAC std_ss []
9692 >> `B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9693 >> `A INTER B IN events p` by METIS_TAC [EVENTS_INTER]
9694 >> Know `prob p C <> 0`
9695 >- (CCONTR_TAC >> fs [] \\
9696    `0 < prob p (B INTER C)` by METIS_TAC [PROB_POSITIVE, le_lt] \\
9697     Know `prob p (B INTER C) <= prob p C`
9698     >- (MATCH_MP_TAC PROB_INCREASING >> ASM_SET_TAC [EVENTS_INTER]) \\
9699     DISCH_TAC >> METIS_TAC [lte_trans, lt_refl]) >> DISCH_TAC
9700 >> RW_TAC std_ss [cond_prob_def]
9701 >> `A INTER (B INTER C) = A INTER B INTER C` by SET_TAC [] >> POP_ORW
9702 >> `A INTER B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9703 >> `?a. prob p (A INTER B INTER C) = Normal a` by METIS_TAC [PROB_FINITE, extreal_cases]
9704 >> `?b. prob p (B INTER C) = Normal b` by METIS_TAC [PROB_FINITE, extreal_cases]
9705 >> `?c. prob p C = Normal c` by METIS_TAC [PROB_FINITE, extreal_cases]
9706 >> `b <> 0 /\ c <> 0` by METIS_TAC [extreal_of_num_def, extreal_11]
9707 >> ASM_SIMP_TAC std_ss [extreal_mul_def, extreal_div_eq, extreal_11]
9708 >> `!(a:real) b c d e. a * b * (c * d) * e = a * (b * c) * (d * e)` by METIS_TAC [REAL_MUL_ASSOC]
9709 >> RW_TAC std_ss [real_div, REAL_MUL_LINV, REAL_MUL_LID, REAL_MUL_RID]
9710QED
9711
9712Theorem COND_PROB_INTER_SPLIT :
9713    !p A B C.
9714        prob_space p /\ A IN events p /\ B IN events p /\ C IN events p /\
9715        prob p (B INTER C) <> 0 ==>
9716        (cond_prob p (A INTER B) C = cond_prob p A (B INTER C) * cond_prob p B C)
9717Proof
9718    RW_TAC std_ss []
9719 >> `B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9720 >> Know `prob p C <> 0`
9721 >- (CCONTR_TAC >> fs [] \\
9722    `0 < prob p (B INTER C)` by METIS_TAC [PROB_POSITIVE, le_lt] \\
9723     Know `prob p (B INTER C) <= prob p C`
9724     >- (MATCH_MP_TAC PROB_INCREASING >> ASM_SET_TAC [EVENTS_INTER]) \\
9725     DISCH_TAC >> METIS_TAC [lte_trans, lt_refl]) >> DISCH_TAC
9726 >> RW_TAC std_ss [cond_prob_def]
9727 >> `A INTER (B INTER C) = A INTER B INTER C` by SET_TAC [] >> POP_ORW
9728 >> `A INTER B INTER C IN events p` by METIS_TAC [EVENTS_INTER]
9729 >> `?a. prob p (A INTER B INTER C) = Normal a` by METIS_TAC [PROB_FINITE, extreal_cases]
9730 >> `?b. prob p (B INTER C) = Normal b` by METIS_TAC [PROB_FINITE, extreal_cases]
9731 >> `?c. prob p C = Normal c` by METIS_TAC [PROB_FINITE, extreal_cases]
9732 >> `b <> 0 /\ c <> 0` by METIS_TAC [extreal_of_num_def, extreal_11]
9733 >> ASM_SIMP_TAC std_ss [extreal_mul_def, extreal_div_eq, extreal_11]
9734 >> `!(x:real) y z w. x * y * (z * w) = x * (y * z) * w`
9735        by METIS_TAC [REAL_MUL_ASSOC, REAL_MUL_COMM]
9736 >> RW_TAC std_ss [real_div, REAL_MUL_LINV, REAL_MUL_RID]
9737QED
9738
9739(* ========================================================================= *)
9740(*  Additional theorems of conditional probabilities on independent events   *)
9741(* ========================================================================= *)
9742
9743Theorem indep_alt_cond_prob :
9744    !p A B. prob_space p /\ A IN events p /\ B IN events p /\ prob p B <> 0 ==>
9745           (indep p A B <=> cond_prob p A B = prob p A)
9746Proof
9747    rw [indep_def]
9748 >> rw [COND_PROB_MUL_RULE, Once mul_comm]
9749 >> Suff ‘cond_prob p A B * prob p B = prob p A * prob p B <=>
9750          prob p B = 0 \/ cond_prob p A B = prob p A’ >- rw []
9751 >> MATCH_MP_TAC mul_rcancel >> rw [PROB_FINITE]
9752QED
9753
9754(* ========================================================================= *)
9755(*   Probability Density Function (PDF)                                      *)
9756(*  (see examples/probability/distributionScript.sml for ‘lborel’ version)   *)
9757(* ========================================================================= *)
9758
9759(* This is the recommmended ext_lborel version (was: pdf) *)
9760Definition prob_density_function_def :
9761    prob_density_function p X = RN_deriv (distribution p X) ext_lborel
9762End
9763Overload pdf[local] = “prob_density_function”
9764
9765(* local backward compatibility *)
9766Theorem pdf_def[local] = prob_density_function_def
9767
9768Theorem pdf_le_pos :
9769    !p X x. prob_space p /\ random_variable X p Borel /\
9770            distribution p X << ext_lborel ==> 0 <= pdf p X x
9771Proof
9772    rpt STRIP_TAC
9773 >> `measure_space (space Borel, subsets Borel, distribution p X)`
9774       by PROVE_TAC [distribution_prob_space, prob_space_def, SIGMA_ALGEBRA_BOREL]
9775 >> ASSUME_TAC sigma_finite_ext_lborel
9776 >> ASSUME_TAC measure_space_ext_lborel
9777 >> MP_TAC (ISPECL [(* m *) ``ext_lborel``,
9778                    (* v *) ``distribution (p :'a m_space) (X :'a -> extreal)``]
9779                   Radon_Nikodym')
9780 >> rw [ext_lborel_def]
9781 >> fs [pdf_def, RN_deriv_def, ext_lborel_def, SPACE]
9782 >> SELECT_ELIM_TAC
9783 >> METIS_TAC [SPACE_BOREL, IN_UNIV]
9784QED
9785
9786Theorem expectation_pdf[local] :
9787    !p X. prob_space p /\ random_variable X p Borel /\
9788          distribution p X << ext_lborel ==>
9789          pdf p X IN Borel_measurable Borel /\
9790          expectation ext_lborel (pdf p X) = 1
9791Proof
9792    rpt GEN_TAC >> STRIP_TAC
9793 >> `prob_space (space Borel, subsets Borel, distribution p X)`
9794       by PROVE_TAC [distribution_prob_space, SIGMA_ALGEBRA_BOREL]
9795 >> NTAC 2 (POP_ASSUM MP_TAC) >> KILL_TAC
9796 >> simp [prob_space_def, p_space_def, m_space_def, measure_def, expectation_def]
9797 >> NTAC 2 STRIP_TAC
9798 >> ASSUME_TAC sigma_finite_ext_lborel
9799 >> ASSUME_TAC measure_space_ext_lborel
9800 >> MP_TAC (ISPECL [(* m *) ``ext_lborel``,
9801                    (* v *) ``distribution (p :'a m_space) (X :'a -> extreal)``]
9802                   Radon_Nikodym')
9803 >> fs [pdf_def, RN_deriv_def, SPACE, ext_lborel_def]
9804 >> STRIP_TAC
9805 >> SELECT_ELIM_TAC
9806 >> CONJ_TAC >- METIS_TAC []
9807 >> Q.X_GEN_TAC `g`
9808 >> STRIP_TAC
9809 >> fs [density_measure_def]
9810 >> POP_ASSUM (MP_TAC o Q.SPEC `space Borel`)
9811 >> Know `space Borel IN subsets Borel`
9812 >- (MATCH_MP_TAC SIGMA_ALGEBRA_SPACE \\
9813     REWRITE_TAC [SIGMA_ALGEBRA_BOREL])
9814 >> RW_TAC std_ss []
9815 >> fs [GSYM ext_lborel_def]
9816 >> Know `integral ext_lborel g = pos_fn_integral ext_lborel g`
9817 >- (MATCH_MP_TAC integral_pos_fn >> art [] \\
9818     rw [ext_lborel_def]) >> Rewr'
9819 >> Know `pos_fn_integral ext_lborel g =
9820          pos_fn_integral ext_lborel (\x. g x * indicator_fn (space Borel) x)`
9821 >- (MATCH_MP_TAC pos_fn_integral_cong \\
9822     rw [indicator_fn_def, mul_rone, mul_rzero, le_refl, SPACE_BOREL])
9823 >> DISCH_THEN (art o wrap)
9824QED
9825
9826(* |- !p X.
9827        prob_space p /\ random_variable X p Borel /\
9828        distribution p X << ext_lborel ==>
9829        expectation ext_lborel (pdf p X) = 1
9830 *)
9831Theorem expectation_pdf_1 = cj 2 expectation_pdf
9832
9833(* |- !p X.
9834        prob_space p /\ random_variable X p Borel /\
9835        distribution p X << ext_lborel ==>
9836        pdf p X IN Borel_measurable Borel
9837 *)
9838Theorem pdf_in_measurable_borel = cj 1 expectation_pdf
9839
9840(* ========================================================================= *)
9841(*  Two canonical probability spaces                                         *)
9842(* ========================================================================= *)
9843
9844Theorem prob_space_lborel_01 :
9845    prob_space (restrict_space lborel (interval [0,1]))
9846Proof
9847    rw [prob_space_def]
9848 >- (MATCH_MP_TAC measure_space_restrict_space \\
9849     rw [lborel_def, sets_lborel] \\
9850     rw [borel_measurable_sets, CLOSED_interval])
9851 >> simp [space_restrict_space]
9852 >> rw [restrict_space, measure_def, m_space_def, space_lborel,
9853        lambda_closed_interval]
9854QED
9855
9856Theorem prob_space_lborel_01' :
9857    prob_space (restrict_space lborel (interval (0,1)))
9858Proof
9859    rw [prob_space_def]
9860 >- (MATCH_MP_TAC measure_space_restrict_space \\
9861     rw [lborel_def, sets_lborel] \\
9862     rw [borel_measurable_sets, OPEN_interval])
9863 >> simp [space_restrict_space]
9864 >> rw [restrict_space, measure_def, m_space_def, space_lborel,
9865        lambda_open_interval]
9866QED
9867
9868Theorem prob_space_ext_lborel_01 :
9869    prob_space (restrict_space ext_lborel {x | 0 <= x /\ x <= 1})
9870Proof
9871    rw [prob_space_def]
9872 >- (MATCH_MP_TAC measure_space_restrict_space \\
9873     rw [measure_space_ext_lborel] \\
9874     rw [ext_lborel_def, measurable_sets_def] \\
9875     rw [BOREL_MEASURABLE_SETS])
9876 >> simp [space_restrict_space]
9877 >> rw [restrict_space, measure_def, ext_lborel_def, m_space_def, SPACE_BOREL]
9878 >> Suff ‘real_set {x | 0 <= x /\ x <= 1} = interval [0,1]’
9879 >- rw [lambda_closed_interval]
9880 >> rw [Once EXTENSION, real_set_def, CLOSED_interval]
9881 >> EQ_TAC >> rw []
9882 >| [ (* goal 1 (of 3) *)
9883      rename1 ‘z <= 1’ \\
9884     ‘?r. 0 <= r /\ r <= 1 /\ z = Normal r’
9885        by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_le_eq] \\
9886      rw [real_def],
9887      (* goal 2 (of 3) *)
9888      rename1 ‘0 <= z’ \\
9889     ‘?r. 0 <= r /\ r <= 1 /\ z = Normal r’
9890        by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_le_eq] \\
9891      rw [real_def],
9892      (* goal 3 (of 3) *)
9893      Q.EXISTS_TAC ‘Normal x’ >> rw [] ]
9894QED
9895
9896Theorem prob_space_ext_lborel_01' :
9897    prob_space (restrict_space ext_lborel {x | 0 < x /\ x < 1})
9898Proof
9899    rw [prob_space_def]
9900 >- (MATCH_MP_TAC measure_space_restrict_space \\
9901     rw [measure_space_ext_lborel] \\
9902     rw [ext_lborel_def, measurable_sets_def] \\
9903     rw [BOREL_MEASURABLE_SETS])
9904 >> simp [space_restrict_space]
9905 >> rw [restrict_space, measure_def, ext_lborel_def, m_space_def, SPACE_BOREL]
9906 >> Suff ‘real_set {x | 0 < x /\ x < 1} = interval (0,1)’
9907 >- rw [lambda_open_interval]
9908 >> rw [Once EXTENSION, real_set_def, OPEN_interval]
9909 >> EQ_TAC >> rw []
9910 >| [ (* goal 1 (of 3) *)
9911      rename1 ‘z < 1’ \\
9912     ‘?r. 0 < r /\ r < 1 /\ z = Normal r’
9913        by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_lt_eq] \\
9914      rw [real_def],
9915      (* goal 2 (of 3) *)
9916      rename1 ‘0 < z’ \\
9917     ‘?r. 0 < r /\ r < 1 /\ z = Normal r’
9918        by METIS_TAC [extreal_cases, extreal_of_num_def, extreal_lt_eq] \\
9919      rw [real_def],
9920      (* goal 3 (of 3) *)
9921      Q.EXISTS_TAC ‘Normal x’ >> rw [] ]
9922QED
9923
9924Theorem existence_of_prod_prob_space :
9925    !p1 p2. prob_space p1 /\ prob_space p2 ==>
9926            ?p. p = p1 CROSS p2 /\ prob_space p /\
9927                !e1 e2. e1 IN events p1 /\ e2 IN events p2 ==>
9928                        e1 CROSS e2 IN events p /\
9929                        prob p (e1 CROSS e2) = prob p1 e1 * prob p2 e2
9930Proof
9931    rpt STRIP_TAC
9932 >> ‘sigma_finite_measure_space p1 /\
9933     sigma_finite_measure_space p2’
9934       by PROVE_TAC [prob_space_def, PROB_SPACE_SIGMA_FINITE,
9935                     sigma_finite_measure_space_def]
9936 >> Q.EXISTS_TAC ‘p1 CROSS p2’ >> simp []
9937 >> reverse CONJ_TAC
9938 >- (rw [prod_measure_space_def, prob_def, events_def]
9939     >- (rw [prod_sigma_def] \\
9940         MATCH_MP_TAC IN_SIGMA \\
9941         rw [prod_sets_def] \\
9942         qexistsl_tac [‘e1’, ‘e2’] >> art []) \\
9943     MATCH_MP_TAC PROD_MEASURE_CROSS \\
9944     fs [prob_space_def])
9945 >> rw [prob_space_def]
9946 >- (MATCH_MP_TAC measure_space_prod_measure >> art [])
9947 >> rw [prod_measure_space_def]
9948 >> Know ‘prod_measure p1 p2 (m_space p1 CROSS m_space p2) =
9949          measure p1 (m_space p1) * measure p2 (m_space p2)’
9950 >- (MATCH_MP_TAC PROD_MEASURE_CROSS \\
9951     fs [prob_space_def] \\
9952     rw [MEASURE_SPACE_MSPACE_MEASURABLE])
9953 >> Rewr'
9954 >> simp [GSYM prob_def, GSYM p_space_def, PROB_UNIV]
9955QED
9956
9957Theorem prob_space_eq :
9958    !p1 p2. prob_space p1 /\ p_space p2 = p_space p1 /\ events p2 = events p1 /\
9959           (!s. s IN events p2 ==> prob p2 s = prob p1 s) ==> prob_space p2
9960Proof
9961    rpt GEN_TAC
9962 >> simp [prob_space_def, p_space_def, events_def, prob_def]
9963 >> STRIP_TAC
9964 >> CONJ_ASM1_TAC
9965 >- (MATCH_MP_TAC measure_space_eq \\
9966     Q.EXISTS_TAC ‘p1’ >> rw [])
9967 >> Suff ‘measure p2 (m_space p1) = measure p1 (m_space p1)’ >- rw []
9968 >> FIRST_X_ASSUM MATCH_MP_TAC
9969 >> Q.PAT_X_ASSUM ‘_ = m_space p1’ (REWRITE_TAC o wrap o SYM)
9970 >> MATCH_MP_TAC MEASURE_SPACE_SPACE >> art []
9971QED
9972
9973Theorem prob_space_cong :
9974    !sp sts u v. (!s. s IN sts ==> u s = v s) ==>
9975                 (prob_space (sp,sts,u) <=> prob_space (sp,sts,v))
9976Proof
9977    rw [prob_space_def, p_space_def, events_def, prob_def]
9978 >> Know ‘measure_space (sp,sts,u) <=> measure_space (sp,sts,v)’
9979 >- (MATCH_MP_TAC measure_space_cong >> art [])
9980 >> Rewr'
9981 >> Cases_on ‘measure_space (sp,sts,v)’ >> simp []
9982 >> Suff ‘u sp = v sp’ >- rw []
9983 >> FIRST_X_ASSUM MATCH_MP_TAC
9984 >> qabbrev_tac ‘m = (sp,sts,v)’
9985 >> ‘sp = m_space m /\ sts = measurable_sets m’ by simp [Abbr ‘m’]
9986 >> simp [MEASURE_SPACE_SPACE]
9987QED
9988
9989Theorem converge_in_dist_cong_full:
9990    ∀p X Y A B m.
9991      prob_space p ∧
9992      (∀n x. m ≤ n ∧ x ∈ p_space p ⇒ X n x = Y n x) ∧
9993      (∀x. x ∈ p_space p ⇒ A x = B x) ⇒
9994      ((X ⟶ A) (in_distribution p) ⇔ (Y ⟶ B) (in_distribution p))
9995Proof
9996    rw [converge_in_dist_def, EXTREAL_LIM_SEQUENTIALLY]
9997 >> EQ_TAC >> rw []
9998 >> Q.PAT_X_ASSUM ‘∀f. f ∈ C_b ext_euclidean ⇒ _’ (STRIP_ASSUME_TAC o Q.SPEC ‘f’)
9999 >> gvs []
10000 >> POP_ASSUM (MP_TAC o (Q.SPEC ‘e’)) >> rw []
10001 >> Q.EXISTS_TAC ‘MAX N m’ >> rw [MAX_LE]
10002 >> Q.PAT_X_ASSUM ‘∀n. N ≤ n ⇒ _’(MP_TAC o (Q.SPEC ‘n’)) >> rw []
10003 >> ‘expectation p (Normal ∘ f ∘ Y n) = expectation p (Normal ∘ f ∘ X n)’
10004   by (irule expectation_cong >> METIS_TAC[o_DEF, extreal_11])
10005 >> ‘expectation p (Normal ∘ f ∘ B) = expectation p (Normal ∘ f ∘ A)’
10006   by (irule expectation_cong >> METIS_TAC[o_DEF, extreal_11])
10007 >> fs []
10008QED
10009
10010Theorem converge_in_dist_cong:
10011    ∀p X Y Z m.
10012      prob_space p ∧
10013      (∀n x. m ≤ n ∧ x ∈ p_space p ⇒ X n x = Y n x) ⇒
10014      ((X ⟶ Z) (in_distribution p) ⇔ (Y ⟶ Z) (in_distribution p))
10015Proof
10016    rpt STRIP_TAC
10017 >> MATCH_MP_TAC converge_in_dist_cong_full
10018 >> Q.EXISTS_TAC ‘m’ >> rw []
10019QED
10020
10021(* tidy up theory exports, learnt from Magnus Myreen *)
10022val _ = List.app Theory.delete_binding
10023  ["convergence_mode_TY_DEF",
10024   "convergence_mode_case_def",
10025   "convergence_mode_size_def",
10026   "convergence_mode_11",
10027   "convergence_mode_Axiom",
10028   "convergence_mode_case_cong",
10029   "convergence_mode_case_eq",
10030   "convergence_mode_distinct",
10031   "convergence_mode_induction",
10032   "convergence_mode_nchotomy",
10033   "datatype_convergence_mode",
10034   "converge_def"];
10035
10036(* References:
10037
10038  [1] Kolmogorov, A.N.: Foundations of the Theory of Probability (Grundbegriffe der
10039      Wahrscheinlichkeitsrechnung). Chelsea Publishing Company, New York. (1950).
10040  [2] Chung, K.L.: A Course in Probability Theory, Third Edition.
10041      Academic Press (2001).
10042  [3] Rosenthal, J.S.: A First Look at Rigorous Probability Theory (Second Edition).
10043      World Scientific Publishing Company (2006).
10044  [4] Shiryaev, A.N.: Probability-1. Springer-Verlag New York (2016).
10045  [5] Shiryaev, A.N.: Probability-2. Springer-Verlag New York (2019).
10046  [6] Billingsley, P.: Probability and Measure (Third Edition).
10047      Wiley-Interscience (1995).
10048  [7] Hurd, J.: Formal verification of probabilistic algorithms.
10049      University of Cambridge (2003). UCAM-CL-TR-566
10050  [8] Coble, A.R.: Anonymity, information, and machine-assisted proof.
10051      University of Cambridge (2010). UCAM-CL-TR-785
10052  [9] Schilling, R.L.: Measures, Integrals and Martingales (Second Edition).
10053      Cambridge University Press (2017).
10054  [10] Mhamdi, T., Hasan, O., Tahar, S.: Formalization of Measure Theory and Lebesgue
10055       Integration for Probabilistic Analysis in HOL.
10056       ACM Trans. Embedded Comput. Syst. 12, 1-23 (2013). DOI:10.1145/2406336.2406349
10057  [11] Qasim, M.: Formalization of Normal Random Variables,
10058       Concordia University (2016).
10059 *)