Skip to content

Commit 57c5d5b

Browse files
committed
refactor(Probability/Kernel/Composition): define compProd for all kernels (#6054)
`compProd` and `prod` make sense only for s-finite kernels and were defined only for those. I define them for all kernels, with default value 0 when one of the kernels is not s-finite. The new definitions allow rewriting a kernel inside a compProd, which was not possible before (it would raise a "motive is not type correct" error due to the s-finite argument). Co-authored-by: Rémy Degenne <remydegenne@gmail.com>
1 parent b19ab15 commit 57c5d5b

File tree

2 files changed

+64
-25
lines changed

2 files changed

+64
-25
lines changed

Mathlib/Probability/Kernel/Composition.lean

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -187,15 +187,20 @@ theorem measurable_compProdFun (κ : kernel α β) [IsSFiniteKernel κ] (η : ke
187187
exact h_meas.lintegral_kernel_prod_right
188188
#align probability_theory.kernel.measurable_comp_prod_fun ProbabilityTheory.kernel.measurable_compProdFun
189189

190-
/-- Composition-Product of kernels. It verifies
190+
open Classical
191+
192+
/-- Composition-Product of kernels. For s-finite kernels, it satisfies
191193
`∫⁻ bc, f bc ∂(compProd κ η a) = ∫⁻ b, ∫⁻ c, f (b, c) ∂(η (a, b)) ∂(κ a)`
192-
(see `lintegral_compProd`). -/
193-
noncomputable def compProd (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
194-
[IsSFiniteKernel η] : kernel α (β × γ) where
195-
val a :=
194+
(see `ProbabilityTheory.kernel.lintegral_compProd`).
195+
If either of the kernels is not s-finite, `compProd` is given the junk value 0. -/
196+
noncomputable def compProd (κ : kernel α β) (η : kernel (α × β) γ) : kernel α (β × γ) :=
197+
if h : IsSFiniteKernel κ ∧ IsSFiniteKernel η then
198+
{ val := λ a ↦
196199
Measure.ofMeasurable (fun s _ => compProdFun κ η a s) (compProdFun_empty κ η a)
197-
(compProdFun_iUnion κ η a)
200+
(@compProdFun_iUnion _ _ _ _ _ _ κ η h.2 a)
198201
property := by
202+
have : IsSFiniteKernel κ := h.1
203+
have : IsSFiniteKernel η := h.2
199204
refine' Measure.measurable_of_measurable_coe _ fun s hs => _
200205
have :
201206
(fun a =>
@@ -204,14 +209,18 @@ noncomputable def compProd (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel
204209
fun a => compProdFun κ η a s :=
205210
by ext1 a; rwa [Measure.ofMeasurable_apply]
206211
rw [this]
207-
exact measurable_compProdFun κ η hs
212+
exact measurable_compProdFun κ η hs }
213+
else 0
208214
#align probability_theory.kernel.comp_prod ProbabilityTheory.kernel.compProd
209215

210216
scoped[ProbabilityTheory] infixl:100 " ⊗ₖ " => ProbabilityTheory.kernel.compProd
211217

212218
theorem compProd_apply_eq_compProdFun (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
213-
[IsSFiniteKernel η] (a : α) (hs : MeasurableSet s) : (κ ⊗ₖ η) a s = compProdFun κ η a s := by
214-
rw [compProd]
219+
[IsSFiniteKernel η] (a : α) (hs : MeasurableSet s) :
220+
(κ ⊗ₖ η) a s = compProdFun κ η a s := by
221+
rw [compProd, dif_pos]
222+
swap
223+
· constructor <;> infer_instance
215224
change
216225
Measure.ofMeasurable (fun s _ => compProdFun κ η a s) (compProdFun_empty κ η a)
217226
(compProdFun_iUnion κ η a) s =
@@ -220,6 +229,18 @@ theorem compProd_apply_eq_compProdFun (κ : kernel α β) [IsSFiniteKernel κ] (
220229
rfl
221230
#align probability_theory.kernel.comp_prod_apply_eq_comp_prod_fun ProbabilityTheory.kernel.compProd_apply_eq_compProdFun
222231

232+
theorem compProd_of_not_isSFiniteKernel_left (κ : kernel α β) (η : kernel (α × β) γ)
233+
(h : ¬ IsSFiniteKernel κ) :
234+
κ ⊗ₖ η = 0 := by
235+
rw [compProd, dif_neg]
236+
simp [h]
237+
238+
theorem compProd_of_not_isSFiniteKernel_right (κ : kernel α β) (η : kernel (α × β) γ)
239+
(h : ¬ IsSFiniteKernel η) :
240+
κ ⊗ₖ η = 0 := by
241+
rw [compProd, dif_neg]
242+
simp [h]
243+
223244
theorem compProd_apply (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
224245
[IsSFiniteKernel η] (a : α) (hs : MeasurableSet s) :
225246
(κ ⊗ₖ η) a s = ∫⁻ b, η (a, b) {c | (b, c) ∈ s} ∂κ a :=
@@ -449,16 +470,24 @@ theorem compProd_eq_sum_compProd (κ : kernel α β) [IsSFiniteKernel κ] (η :
449470
ext a s hs; simp_rw [kernel.sum_apply' _ a hs]; rw [compProd_eq_tsum_compProd κ η a hs]
450471
#align probability_theory.kernel.comp_prod_eq_sum_comp_prod ProbabilityTheory.kernel.compProd_eq_sum_compProd
451472

452-
theorem compProd_eq_sum_compProd_left (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
453-
[IsSFiniteKernel η] : κ ⊗ₖ η = kernel.sum fun n => seq κ n ⊗ₖ η := by
473+
theorem compProd_eq_sum_compProd_left (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ) :
474+
κ ⊗ₖ η = kernel.sum fun n => seq κ n ⊗ₖ η := by
475+
by_cases h : IsSFiniteKernel η
476+
swap
477+
· simp_rw [compProd_of_not_isSFiniteKernel_right _ _ h]
478+
simp
454479
rw [compProd_eq_sum_compProd]
455480
congr with n a s hs
456481
simp_rw [kernel.sum_apply' _ _ hs, compProd_apply_eq_compProdFun _ _ _ hs,
457482
compProdFun_tsum_right _ η a hs]
458483
#align probability_theory.kernel.comp_prod_eq_sum_comp_prod_left ProbabilityTheory.kernel.compProd_eq_sum_compProd_left
459484

460-
theorem compProd_eq_sum_compProd_right (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
485+
theorem compProd_eq_sum_compProd_right (κ : kernel α β) (η : kernel (α × β) γ)
461486
[IsSFiniteKernel η] : κ ⊗ₖ η = kernel.sum fun n => κ ⊗ₖ seq η n := by
487+
by_cases hκ : IsSFiniteKernel κ
488+
swap
489+
· simp_rw [compProd_of_not_isSFiniteKernel_left _ _ hκ]
490+
simp
462491
rw [compProd_eq_sum_compProd]
463492
simp_rw [compProd_eq_sum_compProd_left κ _]
464493
rw [kernel.sum_comm]
@@ -472,8 +501,12 @@ instance IsMarkovKernel.compProd (κ : kernel α β) [IsMarkovKernel κ] (η : k
472501
simp only [Set.mem_univ, Set.setOf_true, measure_univ, lintegral_one]⟩⟩
473502
#align probability_theory.kernel.is_markov_kernel.comp_prod ProbabilityTheory.kernel.IsMarkovKernel.compProd
474503

475-
theorem compProd_apply_univ_le (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
476-
[IsFiniteKernel η] (a : α) : (κ ⊗ₖ η) a Set.univ ≤ κ a Set.univ * IsFiniteKernel.bound η := by
504+
theorem compProd_apply_univ_le (κ : kernel α β) (η : kernel (α × β) γ) [IsFiniteKernel η] (a : α) :
505+
(κ ⊗ₖ η) a Set.univ ≤ κ a Set.univ * IsFiniteKernel.bound η := by
506+
by_cases hκ : IsSFiniteKernel κ
507+
swap
508+
· rw [compProd_of_not_isSFiniteKernel_left _ _ hκ]
509+
simp
477510
rw [compProd_apply κ η a MeasurableSet.univ]
478511
simp only [Set.mem_univ, Set.setOf_true]
479512
let Cη := IsFiniteKernel.bound η
@@ -494,8 +527,16 @@ instance IsFiniteKernel.compProd (κ : kernel α β) [IsFiniteKernel κ] (η : k
494527
mul_le_mul (measure_le_bound κ a Set.univ) le_rfl (zero_le _) (zero_le _)⟩⟩
495528
#align probability_theory.kernel.is_finite_kernel.comp_prod ProbabilityTheory.kernel.IsFiniteKernel.compProd
496529

497-
instance IsSFiniteKernel.compProd (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel (α × β) γ)
498-
[IsSFiniteKernel η] : IsSFiniteKernel (κ ⊗ₖ η) := by
530+
instance IsSFiniteKernel.compProd (κ : kernel α β) (η : kernel (α × β) γ) :
531+
IsSFiniteKernel (κ ⊗ₖ η) := by
532+
by_cases h : IsSFiniteKernel κ
533+
swap
534+
· rw [compProd_of_not_isSFiniteKernel_left _ _ h]
535+
infer_instance
536+
by_cases h : IsSFiniteKernel η
537+
swap
538+
· rw [compProd_of_not_isSFiniteKernel_right _ _ h]
539+
infer_instance
499540
rw [compProd_eq_sum_compProd]
500541
exact kernel.isSFiniteKernel_sum fun n => kernel.isSFiniteKernel_sum inferInstance
501542
#align probability_theory.kernel.is_s_finite_kernel.comp_prod ProbabilityTheory.kernel.IsSFiniteKernel.compProd
@@ -774,7 +815,7 @@ section Comp
774815

775816
variable {γ : Type _} {mγ : MeasurableSpace γ} {f : β → γ} {g : γ → α}
776817

777-
/-- Composition of two s-finite kernels. -/
818+
/-- Composition of two kernels. -/
778819
noncomputable def comp (η : kernel β γ) (κ : kernel α β) : kernel α γ where
779820
val a := (κ a).bind η
780821
property := (Measure.measurable_bind' (kernel.measurable _)).comp (kernel.measurable _)
@@ -847,9 +888,8 @@ section Prod
847888

848889
variable {γ : Type _} {mγ : MeasurableSpace γ}
849890

850-
/-- Product of two s-finite kernels. -/
851-
noncomputable def prod (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel α γ) [IsSFiniteKernel η] :
852-
kernel α (β × γ) :=
891+
/-- Product of two kernels. This is meaningful only when the kernels are s-finite. -/
892+
noncomputable def prod (κ : kernel α β) (η : kernel α γ) : kernel α (β × γ) :=
853893
κ ⊗ₖ swapLeft (prodMkLeft β η)
854894
#align probability_theory.kernel.prod ProbabilityTheory.kernel.prod
855895

@@ -875,8 +915,8 @@ instance IsFiniteKernel.prod (κ : kernel α β) [IsFiniteKernel κ] (η : kerne
875915
[IsFiniteKernel η] : IsFiniteKernel (κ ×ₖ η) := by rw [prod]; infer_instance
876916
#align probability_theory.kernel.is_finite_kernel.prod ProbabilityTheory.kernel.IsFiniteKernel.prod
877917

878-
instance IsSFiniteKernel.prod (κ : kernel α β) [IsSFiniteKernel κ] (η : kernel α γ)
879-
[IsSFiniteKernel η] : IsSFiniteKernel (κ ×ₖ η) := by rw [prod]; infer_instance
918+
instance IsSFiniteKernel.prod (κ : kernel α β) (η : kernel α γ) :
919+
IsSFiniteKernel (κ ×ₖ η) := by rw [prod]; infer_instance
880920
#align probability_theory.kernel.is_s_finite_kernel.prod ProbabilityTheory.kernel.IsSFiniteKernel.prod
881921

882922
end Prod

Mathlib/Probability/Kernel/Disintegration.lean

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,9 +262,8 @@ variable {Ω : Type _} [TopologicalSpace Ω] [PolishSpace Ω] [MeasurableSpace
262262

263263
/-- Existence of a conditional kernel. Use the definition `condKernel` to get that kernel. -/
264264
theorem exists_cond_kernel (γ : Type _) [MeasurableSpace γ] :
265-
∃ (η : kernel α Ω) (h : IsMarkovKernel η), kernel.const γ ρ =
266-
@kernel.compProd γ α _ _ Ω _ (kernel.const γ ρ.fst) _ (kernel.prodMkLeft γ η)
267-
(by haveI := h; infer_instance) := by
265+
∃ (η : kernel α Ω) (_h : IsMarkovKernel η), kernel.const γ ρ =
266+
kernel.compProd (kernel.const γ ρ.fst) (kernel.prodMkLeft γ η) := by
268267
obtain ⟨f, hf⟩ := exists_measurableEmbedding_real Ω
269268
let ρ' : Measure (α × ℝ) := ρ.map (Prod.map id f)
270269
-- The general idea is to define `η = kernel.comapRight (condKernelReal ρ') hf`. There is

0 commit comments

Comments
 (0)