Theorem: Cardinal.isRegular_succ
File: Mathlib/SetTheory/Cardinal/Cofinality.lean

tactic: cases' Quotient.exists_rep (@succ Cardinal _ _ c) with α αe
state_before: α : Type ?u.145277
r : α → α → Prop
c : Cardinal
h : ℵ₀ ≤ c
⊢ c < Ordinal.cof (ord (succ c))

tactic: simp at αe
state_before: case intro
α✝ : Type ?u.145277
r : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : Quotient.mk isEquivalent α = succ c
⊢ c < Ordinal.cof (ord (succ c))

tactic: rcases ord_eq α with ⟨r, wo, re⟩
state_before: case intro
α✝ : Type ?u.145277
r : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
⊢ c < Ordinal.cof (ord (succ c))

tactic: skip
state_before: case intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
⊢ c < Ordinal.cof (ord (succ c))

tactic: have := ord_isLimit (h.trans (le_succ _))
state_before: case intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
⊢ c < Ordinal.cof (ord (succ c))

tactic: rw [← αe, re] at this⊢
state_before: case intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (ord (succ c))
⊢ c < Ordinal.cof (ord (succ c))

tactic: rcases cof_eq' r this with ⟨S, H, Se⟩
state_before: case intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
⊢ c < Ordinal.cof (type r)

tactic: rw [← Se]
state_before: case intro.intro.intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ c < Ordinal.cof (type r)

tactic: apply lt_imp_lt_of_le_imp_le fun h => mul_le_mul_right' h c
state_before: case intro.intro.intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ c < (#↑S)

tactic: rw [mul_eq_self h, ← succ_le_iff, ← αe, ← sum_const']
state_before: case intro.intro.intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ c * c < (#↑S) * c

tactic: refine' le_trans _ (sum_le_sum (fun (x : S) => card (typein r (x : α))) _ fun i => _)
state_before: case intro.intro.intro.intro.intro
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ (#α) ≤ sum fun x => c

tactic: simp only [← card_typein, ← mk_sigma]
state_before: case intro.intro.intro.intro.intro.refine'_1
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ (#α) ≤ sum fun x => card (typein r ↑x)

tactic: exact
  ⟨Embedding.ofSurjective (fun x => x.2.1) fun a =>
      let ⟨b, h, ab⟩ := H a
      ⟨⟨⟨_, h⟩, _, ab⟩, rfl⟩⟩
state_before: case intro.intro.intro.intro.intro.refine'_1
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
⊢ (#α) ≤ (#(i : ↑S) × { y // r y ↑i })

tactic: rw [← lt_succ_iff, ← lt_ord, ← αe, re]
state_before: case intro.intro.intro.intro.intro.refine'_2
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
i : ↑S
⊢ (fun x => card (typein r ↑x)) i ≤ c

tactic: apply typein_lt_type
state_before: case intro.intro.intro.intro.intro.refine'_2
α✝ : Type ?u.145277
r✝ : α✝ → α✝ → Prop
c : Cardinal
h : ℵ₀ ≤ c
α : Type u
αe : (#α) = succ c
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (type r)
S : Set α
H : ∀ (a : α), ∃ b, b ∈ S ∧ r a b
Se : (#↑S) = Ordinal.cof (type r)
i : ↑S
⊢ typein r ↑i < type r