Theorem: ZFSet.sUnion_lem
File: Mathlib/SetTheory/ZFC/Basic.lean

tactic: let ⟨b, hb⟩ := αβ a
state_before: α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: induction' ea : A a with γ Γ
state_before: α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
b : β
hb : PSet.Equiv (A a) (B b)
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: induction' eb : B b with δ Δ
state_before: case mk
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
b : β
hb : PSet.Equiv (A a) (B b)
x✝ : PSet
ea✝ : A a = x✝
γ : Type u
Γ : γ → PSet
A_ih✝ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: rw [ea, eb] at hb
state_before: case mk.mk
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
b : β
hb : PSet.Equiv (A a) (B b)
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: cases' hb with γδ δγ
state_before: case mk.mk
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
hb : PSet.Equiv (PSet.mk γ Γ) (PSet.mk δ Δ)
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: let c : (A a).Type := c
state_before: case mk.mk.intro
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c }) (Func (⋃₀ PSet.mk β B) b)

tactic: let ⟨d, hd⟩ := γδ (by rwa [ea] at c)
state_before: case mk.mk.intro
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)

tactic: use ⟨b, Eq.ndrec d (Eq.symm eb)⟩
state_before: case mk.mk.intro
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
d : δ
hd : PSet.Equiv (Γ (Eq.mp (_ : Type (A a) = Type (PSet.mk γ Γ)) c)) (Δ d)
⊢ ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)

tactic: change PSet.Equiv ((A a).Func c) ((B b).Func (Eq.ndrec d eb.symm))
state_before: case mk.mk.intro
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
d : δ
hd : PSet.Equiv (Γ (Eq.mp (_ : Type (A a) = Type (PSet.mk γ Γ)) c)) (Δ d)
⊢ PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ })
    (Func (⋃₀ PSet.mk β B) { fst := b, snd := (_ : PSet.mk δ Δ = Func (PSet.mk β B) b) ▸ d })

tactic: match A a, B b, ea, eb, c, d, hd with
| _, _, rfl, rfl, _, _, hd => exact hd
state_before: case mk.mk.intro
α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
d : δ
hd : PSet.Equiv (Γ (Eq.mp (_ : Type (A a) = Type (PSet.mk γ Γ)) c)) (Δ d)
⊢ PSet.Equiv (Func (A a) c) (Func (B b) ((_ : PSet.mk δ Δ = B b) ▸ d))

tactic: rwa [ea] at c
state_before: α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝¹ : PSet
ea✝ : A a = x✝¹
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝ : PSet
eb✝ : B b = x✝
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
⊢ γ

tactic: exact hd
state_before: α β : Type u
A : α → PSet
B : β → PSet
αβ : ∀ (a : α), ∃ b, PSet.Equiv (A a) (B b)
a : Type (PSet.mk α A)
c✝ : Type (Func (PSet.mk α A) a)
b : β
x✝³ : PSet
ea✝ : A a = x✝³
γ : Type u
Γ : γ → PSet
A_ih✝¹ :
  ∀ (a_1 : γ), A a = Γ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
ea : A a = PSet.mk γ Γ
x✝² : PSet
eb✝ : B b = x✝²
δ : Type u
Δ : δ → PSet
A_ih✝ :
  ∀ (a_1 : δ), B b = Δ a_1 → ∃ b, PSet.Equiv (Func (⋃₀ PSet.mk α A) { fst := a, snd := c✝ }) (Func (⋃₀ PSet.mk β B) b)
eb : B b = PSet.mk δ Δ
γδ : ∀ (a : γ), ∃ b, PSet.Equiv (Γ a) (Δ b)
δγ : ∀ (b : δ), ∃ a, PSet.Equiv (Γ a) (Δ b)
c : Type (A a) := c✝
d : δ
hd✝ : PSet.Equiv (Γ (Eq.mp (_ : Type (A a) = Type (PSet.mk γ Γ)) c)) (Δ d)
x✝¹ : Type (PSet.mk γ Γ)
x✝ : δ
hd : PSet.Equiv (Γ (Eq.mp (_ : Type (PSet.mk γ Γ) = Type (PSet.mk γ Γ)) x✝¹)) (Δ x✝)
⊢ PSet.Equiv (Func (PSet.mk γ Γ) x✝¹) (Func (PSet.mk δ Δ) ((_ : PSet.mk δ Δ = PSet.mk δ Δ) ▸ x✝))