Theorem: PMF.bindOnSupport_bindOnSupport
File: Mathlib/Probability/ProbabilityMassFunction/Monad.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
⊢ (p.bindOnSupport f).bindOnSupport g = p.bindOnSupport fun a ha => (f a ha).bindOnSupport fun b hb => g b ⋯
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ ((p.bindOnSupport f).bindOnSupport g) a = (p.bindOnSupport fun a ha => (f a ha).bindOnSupport fun b hb => g b ⋯) a
tactic: refine PMF.ext fun a => ?_
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ ((p.bindOnSupport f).bindOnSupport g) a = (p.bindOnSupport fun a ha => (f a ha).bindOnSupport fun b hb => g b ⋯) a
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β),
      (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) *
        if h : (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) = 0 then 0 else (g a_1 h) a) =
    ∑' (a_1 : α),
      p a_1 *
        if h : p a_1 = 0 then 0 else ∑' (a_2 : β), (f a_1 h) a_2 * if h : (f a_1 h) a_2 = 0 then 0 else (g a_2 ⋯) a
tactic: dsimp only [bindOnSupport_apply]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β),
      (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) *
        if h : (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) = 0 then 0 else (g a_1 h) a) =
    ∑' (a_1 : α),
      p a_1 *
        if h : p a_1 = 0 then 0 else ∑' (a_2 : β), (f a_1 h) a_2 * if h : (f a_1 h) a_2 = 0 then 0 else (g a_2 ⋯) a
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β) (i : α),
      (p i * if h : p i = 0 then 0 else (f i h) a_1) *
        if h : (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) = 0 then 0 else (g a_1 h) a) =
    ∑' (a_1 : α) (i : β),
      p a_1 * if h : p a_1 = 0 then 0 else (f a_1 h) i * if h : (f a_1 h) i = 0 then 0 else (g i ⋯) a
tactic: simp only [← tsum_dite_right, ENNReal.tsum_mul_left.symm, ENNReal.tsum_mul_right.symm]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β) (i : α),
      (p i * if h : p i = 0 then 0 else (f i h) a_1) *
        if h : (∑' (a : α), p a * if h : p a = 0 then 0 else (f a h) a_1) = 0 then 0 else (g a_1 h) a) =
    ∑' (a_1 : α) (i : β),
      p a_1 * if h : p a_1 = 0 then 0 else (f a_1 h) i * if h : (f a_1 h) i = 0 then 0 else (g i ⋯) a
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β) (i : α),
      (p i * if h : p i = 0 then 0 else (f i h) a_1) *
        if h : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) a_1) = 0 then 0 else (g a_1 ⋯) a) =
    ∑' (a_1 : α) (i : β),
      p a_1 * if h : p a_1 = 0 then 0 else (f a_1 h) i * if h : (f a_1 h) i = 0 then 0 else (g i ⋯) a
tactic: simp only [ENNReal.tsum_eq_zero, dite_eq_left_iff]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
⊢ (∑' (a_1 : β) (i : α),
      (p i * if h : p i = 0 then 0 else (f i h) a_1) *
        if h : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) a_1) = 0 then 0 else (g a_1 ⋯) a) =
    ∑' (a_1 : α) (i : β),
      p a_1 * if h : p a_1 = 0 then 0 else (f a_1 h) i * if h : (f a_1 h) i = 0 then 0 else (g i ⋯) a
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
⊢ ((p a' * if h : p a' = 0 then 0 else (f a' h) b) *
      if h : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0 then 0 else (g b ⋯) a) =
    p a' * if h : p a' = 0 then 0 else (f a' h) b * if h : (f a' h) b = 0 then 0 else (g b ⋯) a
tactic: refine ENNReal.tsum_comm.trans (tsum_congr fun a' => tsum_congr fun b => ?_)
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
⊢ ((p a' * if h : p a' = 0 then 0 else (f a' h) b) *
      if h : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0 then 0 else (g b ⋯) a) =
    p a' * if h : p a' = 0 then 0 else (f a' h) b * if h : (f a' h) b = 0 then 0 else (g b ⋯) a
state_after: case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : p a' = 0
_ : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
⊢ p a' * 0 * 0 = p a' * 0

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : p a' = 0
_ : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
⊢ p a' * 0 * (g b ⋯) a = p a' * 0

case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
_ : (f a' h) b = 0
⊢ p a' * (f a' h) b * 0 = p a' * ((f a' h) b * 0)

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
_ : ¬(f a' h) b = 0
⊢ p a' * (f a' h) b * 0 = p a' * ((f a' h) b * (g b ⋯) a)

case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
h_2 : (f a' h) b = 0
⊢ p a' * (f a' h) b * (g b ⋯) a = p a' * ((f a' h) b * 0)

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
h_2 : ¬(f a' h) b = 0
⊢ p a' * (f a' h) b * (g b ⋯) a = p a' * ((f a' h) b * (g b ⋯) a)
tactic: split_ifs with h _ h_1 _ h_2
state_before: case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : p a' = 0
_ : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
⊢ p a' * 0 * 0 = p a' * 0

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : p a' = 0
_ : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
⊢ p a' * 0 * (g b ⋯) a = p a' * 0

case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
_ : (f a' h) b = 0
⊢ p a' * (f a' h) b * 0 = p a' * ((f a' h) b * 0)

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
_ : ¬(f a' h) b = 0
⊢ p a' * (f a' h) b * 0 = p a' * ((f a' h) b * (g b ⋯) a)

case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
h_2 : (f a' h) b = 0
⊢ p a' * (f a' h) b * (g b ⋯) a = p a' * ((f a' h) b * 0)

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
h_2 : ¬(f a' h) b = 0
⊢ p a' * (f a' h) b * (g b ⋯) a = p a' * ((f a' h) b * (g b ⋯) a)
state_after: case neg
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
_ : ¬(f a' h) b = 0
⊢ p a' * (f a' h) b * 0 = p a' * ((f a' h) b * (g b ⋯) a)

case pos
α : Type u_1
β : Type u_2
γ : Type u_3
p✝ : PMF α
f✝ : (a : α) → a ∈ p✝.support → PMF β
p : PMF α
f : (a : α) → a ∈ p.support → PMF β
g : (b : β) → b ∈ (p.bindOnSupport f).support → PMF γ
a : γ
a' : α
b : β
h : ¬p a' = 0
h_1 : ¬∀ (i : α), (p i * if h : p i = 0 then 0 else (f i h) b) = 0
h_2 : (f a' h) b = 0
⊢ p a' * (f a' h) b * (g b ⋯) a = p a' * ((f a' h) b * 0)
tactic: any_goals ring1