Theorem: MeasureTheory.Measure.prod_prod
File: Mathlib/MeasureTheory/Constructions/Prod/Basic.lean

tactic: apply le_antisymm
state_before: α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
⊢ ↑↑(Measure.prod μ ν) (s ×ˢ t) = ↑↑μ s * ↑↑ν t

tactic: set ST := toMeasurable μ s ×ˢ toMeasurable ν t
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
⊢ ↑↑(Measure.prod μ ν) (s ×ˢ t) ≤ ↑↑μ s * ↑↑ν t

tactic: have hSTm : MeasurableSet ST :=
  (measurableSet_toMeasurable _ _).prod (measurableSet_toMeasurable _ _)
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable μ s ×ˢ toMeasurable ν t
⊢ ↑↑(Measure.prod μ ν) (s ×ˢ t) ≤ ↑↑μ s * ↑↑ν t

tactic: calc
  μ.prod ν (s ×ˢ t) ≤ μ.prod ν ST :=
    measure_mono <| Set.prod_mono (subset_toMeasurable _ _) (subset_toMeasurable _ _)
  _ = μ (toMeasurable μ s) * ν (toMeasurable ν t) := by
    rw [prod_apply hSTm]
    simp_rw [mk_preimage_prod_right_eq_if, measure_if,
      lintegral_indicator _ (measurableSet_toMeasurable _ _), lintegral_const,
      restrict_apply_univ, mul_comm]
  _ = μ s * ν t := by rw [measure_toMeasurable, measure_toMeasurable]
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable μ s ×ˢ toMeasurable ν t
hSTm : MeasurableSet ST
⊢ ↑↑(Measure.prod μ ν) (s ×ˢ t) ≤ ↑↑μ s * ↑↑ν t

tactic: rw [prod_apply hSTm]
state_before: α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable μ s ×ˢ toMeasurable ν t
hSTm : MeasurableSet ST
⊢ ↑↑(Measure.prod μ ν) ST = ↑↑μ (toMeasurable μ s) * ↑↑ν (toMeasurable ν t)

tactic: simp_rw [mk_preimage_prod_right_eq_if, measure_if,
  lintegral_indicator _ (measurableSet_toMeasurable _ _), lintegral_const,
  restrict_apply_univ, mul_comm]
state_before: α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable μ s ×ˢ toMeasurable ν t
hSTm : MeasurableSet ST
⊢ (∫⁻ (x : α), ↑↑ν (Prod.mk x ⁻¹' ST) ∂μ) = ↑↑μ (toMeasurable μ s) * ↑↑ν (toMeasurable ν t)

tactic: rw [measure_toMeasurable, measure_toMeasurable]
state_before: α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable μ s ×ˢ toMeasurable ν t
hSTm : MeasurableSet ST
⊢ ↑↑μ (toMeasurable μ s) * ↑↑ν (toMeasurable ν t) = ↑↑μ s * ↑↑ν t

tactic: set ST := toMeasurable (μ.prod ν) (s ×ˢ t)
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: have hSTm : MeasurableSet ST := measurableSet_toMeasurable _ _
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: have hST : s ×ˢ t ⊆ ST := subset_toMeasurable _ _
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: set f : α → ℝ≥0∞ := fun x => ν (Prod.mk x ⁻¹' ST)
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: have hfm : Measurable f := measurable_measure_prod_mk_left hSTm
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
f : α → ℝ≥0∞ := fun x => ↑↑ν (Prod.mk x ⁻¹' ST)
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: set s' : Set α := { x | ν t ≤ f x }
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
f : α → ℝ≥0∞ := fun x => ↑↑ν (Prod.mk x ⁻¹' ST)
hfm : Measurable f
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: have hss' : s ⊆ s' := fun x hx => measure_mono fun y hy => hST <| mk_mem_prod hx hy
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
f : α → ℝ≥0∞ := fun x => ↑↑ν (Prod.mk x ⁻¹' ST)
hfm : Measurable f
s' : Set α := {x | ↑↑ν t ≤ f x}
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: calc
  μ s * ν t ≤ μ s' * ν t := mul_le_mul_right' (measure_mono hss') _
  _ = ∫⁻ _ in s', ν t ∂μ := by rw [set_lintegral_const, mul_comm]
  _ ≤ ∫⁻ x in s', f x ∂μ := (set_lintegral_mono measurable_const hfm fun x => id)
  _ ≤ ∫⁻ x, f x ∂μ := (lintegral_mono' restrict_le_self le_rfl)
  _ = μ.prod ν ST := (prod_apply hSTm).symm
  _ = μ.prod ν (s ×ˢ t) := measure_toMeasurable _
state_before: case a
α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
f : α → ℝ≥0∞ := fun x => ↑↑ν (Prod.mk x ⁻¹' ST)
hfm : Measurable f
s' : Set α := {x | ↑↑ν t ≤ f x}
hss' : s ⊆ s'
⊢ ↑↑μ s * ↑↑ν t ≤ ↑↑(Measure.prod μ ν) (s ×ˢ t)

tactic: rw [set_lintegral_const, mul_comm]
state_before: α : Type u_1
α' : Type ?u.4426845
β : Type u_2
β' : Type ?u.4426851
γ : Type ?u.4426854
E : Type ?u.4426857
inst✝⁶ : MeasurableSpace α
inst✝⁵ : MeasurableSpace α'
inst✝⁴ : MeasurableSpace β
inst✝³ : MeasurableSpace β'
inst✝² : MeasurableSpace γ
μ μ' : Measure α
ν ν' : Measure β
τ : Measure γ
inst✝¹ : NormedAddCommGroup E
inst✝ : SigmaFinite ν
s : Set α
t : Set β
ST : Set (α × β) := toMeasurable (Measure.prod μ ν) (s ×ˢ t)
hSTm : MeasurableSet ST
hST : s ×ˢ t ⊆ ST
f : α → ℝ≥0∞ := fun x => ↑↑ν (Prod.mk x ⁻¹' ST)
hfm : Measurable f
s' : Set α := {x | ↑↑ν t ≤ f x}
hss' : s ⊆ s'
⊢ ↑↑μ s' * ↑↑ν t = ∫⁻ (x : α) in s', ↑↑ν t ∂μ