Theorem: Cardinal.mk_bounded_set_le_of_infinite
File: Mathlib/SetTheory/Cardinal/Ordinal.lean

Proof steps:
state_before: α : Type u
inst✝ : Infinite α
c : Cardinal.{u}
⊢ #{ t // #↑t ≤ c } ≤ #α ^ c
state_after: α : Type u
inst✝ : Infinite α
c : Cardinal.{u}
⊢ #{ t // #↑t ≤ c } ≤ (#α + 1) ^ c
tactic: refine le_trans ?_ (by rw [← add_one_eq (aleph0_le_mk α)])
state_before: α : Type u
inst✝ : Infinite α
c : Cardinal.{u}
⊢ #{ t // #↑t ≤ c } ≤ (#α + 1) ^ c
state_after: case h
α : Type u
inst✝ : Infinite α
β : Type u
⊢ #{ t // #↑t ≤ #β } ≤ (#α + 1) ^ #β
tactic: induction' c using Cardinal.inductionOn with β
state_before: case h
α : Type u
inst✝ : Infinite α
β : Type u
⊢ #{ t // #↑t ≤ #β } ≤ (#α + 1) ^ #β
state_after: case h.f
α : Type u
inst✝ : Infinite α
β : Type u
⊢ (fun α β => β → α) (α ⊕ ULift.{u, 0} (Fin 1)) β → { t // #↑t ≤ #β }

case h.hf
α : Type u
inst✝ : Infinite α
β : Type u
⊢ Surjective ?h.f
tactic: fapply mk_le_of_surjective
state_before: case h.hf
α : Type u
inst✝ : Infinite α
β : Type u
⊢ Surjective fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩
state_after: case h.hf.mk.intro
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ∃ a, (fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) a = ⟨s, ⋯⟩
tactic: rintro ⟨s, ⟨g⟩⟩
state_before: case h.hf.mk.intro
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ∃ a, (fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) a = ⟨s, ⋯⟩
state_after: case h
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
      if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) =
    ⟨s, ⋯⟩
tactic: use fun y => if h : ∃ x : s, g x = y then Sum.inl (Classical.choose h).val
               else Sum.inr (ULift.up 0)
state_before: case h
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
      if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) =
    ⟨s, ⋯⟩
state_after: case h.a
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
        if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) =
    ↑⟨s, ⋯⟩
tactic: apply Subtype.eq
state_before: case h.a
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
⊢ ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
        if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) =
    ↑⟨s, ⋯⟩
state_after: case h.a.h
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
x : α
⊢ x ∈
      ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
          if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) ↔
    x ∈ ↑⟨s, ⋯⟩
tactic: ext x
state_before: case h.a.h
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
x : α
⊢ x ∈
      ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
          if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) ↔
    x ∈ ↑⟨s, ⋯⟩
state_after: case h.a.h.mp
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
x : α
⊢ x ∈
      ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
          if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 }) →
    x ∈ ↑⟨s, ⋯⟩

case h.a.h.mpr
α : Type u
inst✝ : Infinite α
β : Type u
s : Set α
g : ↑s ↪ β
x : α
⊢ x ∈ ↑⟨s, ⋯⟩ →
    x ∈
      ↑((fun f => ⟨Sum.inl ⁻¹' range f, ⋯⟩) fun y =>
          if h : ∃ x, g x = y then Sum.inl ↑(Classical.choose h) else Sum.inr { down := 0 })
tactic: constructor