Module FormalML.ProbTheory.Dynkin
Require Import Program.Basics.
Require Import Lia.
Require Import List Permutation.
Require Import Morphisms EquivDec.
Require Import Equivalence.
Require Import Classical ClassicalFacts ClassicalChoice.
Require Import Utils.
Import ListNotations.
Require Export Event SigmaAlgebras ProbSpace.
Set Bullet Behavior "
Strict Subproofs".
Local Open Scope prob.
Section dynkin.
Context {
T:
Type}.
Class Pi_system (
c:
pre_event T ->
Prop)
:=
pi_inter :
forall a,
c a ->
forall b,
c b ->
c (
pre_event_inter a b).
Class Lambda_system (
c:
pre_event T ->
Prop)
:=
mk_lambda_system {
lambda_Ω :
c pre_Ω
;
lambda_proper :>
Proper (
pre_event_equiv ==>
iff)
c
;
lambda_complement {
a} :
c a ->
c (
pre_event_complement a)
;
lambda_disjoint_countable_union (
an :
nat ->
pre_event T) :
(
forall x,
c (
an x)) ->
pre_collection_is_pairwise_disjoint an ->
c (
pre_union_of_collection an)
}.
Lemma lambda_none (
c:
pre_event T ->
Prop) {
c_lambda:
Lambda_system c}:
c pre_event_none.
Proof.
Lemma lambda_disjoint_list_union (
c:
pre_event T ->
Prop) {
c_lambda:
Lambda_system c}
l :
(
forall x,
In x l ->
c x) ->
ForallOrdPairs pre_event_disjoint l ->
c (
pre_list_union l).
Proof.
Lemma lambda_disjoint_union (
c:
pre_event T ->
Prop) {
c_lambda:
Lambda_system c}
a b :
c a ->
c b ->
pre_event_disjoint a b ->
c (
pre_event_union a b).
Proof.
Lemma lambda_complement_alt (
c:
pre_event T ->
Prop) {
c_lambda:
Lambda_system c}
a b :
c a ->
c b ->
pre_event_sub a b ->
c (
pre_event_diff b a).
Proof.
Lemma lambda_complement_alt_suffices (
c:
pre_event T ->
Prop)
(
lambda_Ω :
c pre_Ω)
(
lambda_proper :
Proper (
pre_event_equiv ==>
iff)
c)
(
lambda_complement :
forall a b,
c a ->
c b ->
pre_event_sub a b ->
c (
pre_event_diff b a))
(
lambda_disjoint_countable_union :
forall (
an :
nat ->
pre_event T),
(
forall x,
c (
an x)) ->
pre_collection_is_pairwise_disjoint an ->
c (
pre_union_of_collection an)) :
Lambda_system c.
Proof.
Program Instance Pi_Lambda_sa (
c:
pre_event T ->
Prop) (
c_pi:
Pi_system c) {
c_lambda:
Lambda_system c}
:
SigmaAlgebra T
:= {|
sa_sigma :=
c
|}.
Next Obligation.
Next Obligation.
Next Obligation.
apply lambda_Ω.
Qed.
Definition lambda_system_inter (
coll:(
pre_event T->
Prop)->
Prop) :
pre_event T ->
Prop
:=
fun e =>
forall a,
coll a ->
a e.
Instance lambda_system_inter_lambda (
coll:(
pre_event T->
Prop)->
Prop)
{
lcoll:
forall (
c:
pre_event T ->
Prop),
coll c ->
Lambda_system c} :
Lambda_system (
lambda_system_inter coll).
Proof.
unfold lambda_system_inter.
constructor.
-
intros.
specialize (
lcoll _ H).
apply lambda_Ω.
-
intros ???.
split;
intros ???
;
specialize (
lcoll _ H1).
+
rewrite <-
H.
apply (
H0 _ H1).
+
rewrite H.
apply (
H0 _ H1).
-
intros.
specialize (
lcoll _ H0).
apply lambda_complement.
apply (
H _ H0).
-
intros.
specialize (
lcoll _ H1).
apply lambda_disjoint_countable_union;
trivial.
exact (
fun x =>
H x _ H1).
Qed.
Lemma lambda_system_intersection_sub (
coll:(
pre_event T->
Prop)->
Prop)
:
forall s,
coll s ->
forall x, (
lambda_system_inter coll)
x ->
s x.
Proof.
firstorder.
Qed.
Definition lambda_all_included (
F:
pre_event T ->
Prop) : (
pre_event T->
Prop)->
Prop
:=
fun l =>
Lambda_system l /\
forall (
e:
pre_event T),
F e ->
l e.
Global Instance lambda_all_included_proper :
Proper (
equiv ==>
equiv)
lambda_all_included.
Proof.
firstorder.
Qed.
Instance lambda_all_included_lambda (
F:
pre_event T ->
Prop) :
forall c,
lambda_all_included F c ->
Lambda_system c.
Proof.
firstorder.
Qed.
Definition generated_lambda (
F:
pre_event T ->
Prop) :
pre_event T ->
Prop
:=
lambda_system_inter (
lambda_all_included F).
Global Instance generated_lambda_lambda (
F:
pre_event T ->
Prop) :
Lambda_system (
generated_lambda F).
Proof.
Lemma generated_lambda_sub (
F:
pre_event T ->
Prop) :
forall x,
F x ->
generated_lambda F x.
Proof.
firstorder.
Qed.
Lemma generated_lambda_minimal (
F:
pre_event T ->
Prop) (
c:(
pre_event T->
Prop)) {
c_lambda:
Lambda_system c} :
pre_event_sub F c ->
pre_event_sub (
generated_lambda F)
c.
Proof.
firstorder.
Qed.
Instance pi_generated_lambda_pi (
C:
pre_event T ->
Prop) {
cpi:
Pi_system C} :
Pi_system (
generated_lambda C).
Proof.
Instance pi_generated_lambda_sa (
C:
pre_event T ->
Prop) {
cpi:
Pi_system C} :
SigmaAlgebra T
:=
Pi_Lambda_sa (
generated_lambda C) (
pi_generated_lambda_pi C).
Instance SigmaAlgebra_Lambda (
sa:
SigmaAlgebra T) :
Lambda_system (
fun x =>
sa_sigma x).
Proof.
Instance SigmaAlgebra_Pi (
sa:
SigmaAlgebra T) :
Pi_system (
fun x =>
sa_sigma x).
Proof.
Lemma pi_generated_lambda_generated_sa (
C:
pre_event T ->
Prop) {
cpi:
Pi_system C} :
sa_equiv (
pi_generated_lambda_sa C)
(
generated_sa C).
Proof.
Theorem Dynkin (
C:
pre_event T ->
Prop) (
D:
pre_event T ->
Prop) {
cpi:
Pi_system C} {
dlambda:
Lambda_system D} :
pre_event_sub C D ->
pre_event_sub (@
sa_sigma _ (
generated_sa C))
D.
Proof.
End dynkin.
Section extension_uniqueness.
Definition generated_sa_base_event {
T} {
C:
pre_event T ->
Prop} {
a} (
Ca:
C a) :
event (
generated_sa C)
:=
exist _ a (
generated_sa_sub _ _ Ca).
Lemma pi_prob_extension_unique {
T} (
C:
pre_event T ->
Prop) {
cpi:
Pi_system C}
(
P1 P2:
ProbSpace (
generated_sa C)) :
(
forall a (
Ca:
C a),
ps_P (
ProbSpace:=
P1) (
generated_sa_base_event Ca) =
ps_P (
ProbSpace:=
P2) (
generated_sa_base_event Ca)) ->
(
forall a,
ps_P (
ProbSpace:=
P1)
a =
ps_P (
ProbSpace:=
P2)
a).
Proof.
End extension_uniqueness.