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

tactic: rcases ord_eq α with ⟨r, wo, re⟩
state_before: α✝ : Type ?u.171374
r : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
⊢ Quotient.mk isEquivalent α < Quotient.mk isEquivalent α ^ Ordinal.cof (ord (Quotient.mk isEquivalent α))

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

tactic: have := ord_isLimit h
state_before: case intro.intro
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
⊢ Quotient.mk isEquivalent α < Quotient.mk isEquivalent α ^ Ordinal.cof (ord (Quotient.mk isEquivalent α))

tactic: rw [mk'_def, re] at this⊢
state_before: case intro.intro
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
r : α → α → Prop
wo : IsWellOrder α r
re : ord (#α) = type r
this : Ordinal.IsLimit (ord (Quotient.mk isEquivalent α))
⊢ Quotient.mk isEquivalent α < Quotient.mk isEquivalent α ^ Ordinal.cof (ord (Quotient.mk isEquivalent α))

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

tactic: have := sum_lt_prod (fun a : S => #{ x // r x a }) (fun _ => #α) fun i => ?_
state_before: case intro.intro.intro.intro
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
⊢ (#α) < (#α) ^ Ordinal.cof (type r)

tactic: simp only [Cardinal.prod_const, Cardinal.lift_id, ← Se, ← mk_sigma, power_def] at this ⊢
state_before: case intro.intro.intro.intro.refine_2
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
this : (sum fun a => #{ x // r x ↑a }) < prod fun x => #α
⊢ (#α) < (#α) ^ Ordinal.cof (type r)

tactic: refine' lt_of_le_of_lt _ this
state_before: case intro.intro.intro.intro.refine_2
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
this : (#(i : ↑S) × { x // r x ↑i }) < (#↑S → α)
⊢ (#α) < (#↑S → α)

tactic: refine' ⟨Embedding.ofSurjective _ _⟩
state_before: case intro.intro.intro.intro.refine_2
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
this : (#(i : ↑S) × { x // r x ↑i }) < (#↑S → α)
⊢ (#α) ≤ (#(i : ↑S) × { x // r x ↑i })

tactic: exact fun x => x.2.1
state_before: case intro.intro.intro.intro.refine_2.refine'_1
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
this : (#(i : ↑S) × { x // r x ↑i }) < (#↑S → α)
⊢ (i : ↑S) × { x // r x ↑i } → α

tactic: exact fun a =>
  let ⟨b, h, ab⟩ := H a
  ⟨⟨⟨_, h⟩, _, ab⟩, rfl⟩
state_before: case intro.intro.intro.intro.refine_2.refine'_2
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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)
this : (#(i : ↑S) × { x // r x ↑i }) < (#↑S → α)
⊢ Surjective fun x => ↑x.snd

tactic: have := typein_lt_type r i
state_before: case intro.intro.intro.intro.refine_1
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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 a => #{ x // r x ↑a }) i < (fun x => #α) i

tactic: rwa [← re, lt_ord] at this
state_before: case intro.intro.intro.intro.refine_1
α✝ : Type ?u.171374
r✝ : α✝ → α✝ → Prop
c : Cardinal
α : Type u
h : ℵ₀ ≤ Quotient.mk isEquivalent α
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
this : typein r ↑i < type r
⊢ (fun a => #{ x // r x ↑a }) i < (fun x => #α) i