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

tactic: rcases ord_eq α with ⟨r, wo, re⟩
state_before: α✝ : Type u_1
r : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
⊢ ⟦α⟧ < ⟦α⟧ ^ (ord ⟦α⟧).cof
state_after: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
⊢ ⟦α⟧ < ⟦α⟧ ^ (ord ⟦α⟧).cof

tactic: have := ord_isLimit h
state_before: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
⊢ ⟦α⟧ < ⟦α⟧ ^ (ord ⟦α⟧).cof
state_after: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (ord ⟦α⟧).IsLimit
⊢ ⟦α⟧ < ⟦α⟧ ^ (ord ⟦α⟧).cof

tactic: rw [mk'_def, re] at this ⊢
state_before: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (ord ⟦α⟧).IsLimit
⊢ ⟦α⟧ < ⟦α⟧ ^ (ord ⟦α⟧).cof
state_after: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
⊢ #α < #α ^ (type r).cof

tactic: rcases cof_eq' r this with ⟨S, H, Se⟩
state_before: case intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
⊢ #α < #α ^ (type r).cof
state_after: case intro.intro.intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
⊢ #α < #α ^ (type r).cof

tactic: have := sum_lt_prod (fun a : S => #{ x // r x a }) (fun _ => #α) fun i => ?_
state_before: case intro.intro.intro.intro
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
⊢ #α < #α ^ (type r).cof
state_after: case intro.intro.intro.intro.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : (sum fun a => #{ x // r x ↑a }) < prod fun x => #α
⊢ #α < #α ^ (type r).cof

case intro.intro.intro.intro.refine_1
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
i : ↑S
⊢ (fun a => #{ x // r x ↑a }) i < (fun x => #α) i

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_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : (sum fun a => #{ x // r x ↑a }) < prod fun x => #α
⊢ #α < #α ^ (type r).cof
state_after: case intro.intro.intro.intro.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ #α < #(↑S → α)

tactic: refine lt_of_le_of_lt ?_ this
state_before: case intro.intro.intro.intro.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ #α < #(↑S → α)
state_after: case intro.intro.intro.intro.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ #α ≤ #((i : ↑S) × { x // r x ↑i })

tactic: refine ⟨Embedding.ofSurjective ?_ ?_⟩
state_before: case intro.intro.intro.intro.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ #α ≤ #((i : ↑S) × { x // r x ↑i })
state_after: case intro.intro.intro.intro.refine_2.refine_1
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ (i : ↑S) × { x // r x ↑i } → α

case intro.intro.intro.intro.refine_2.refine_2
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ Surjective ?intro.intro.intro.intro.refine_2.refine_1

tactic: exact fun x => x.2.1
state_before: case intro.intro.intro.intro.refine_2.refine_1
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ (i : ↑S) × { x // r x ↑i } → α
state_after: no goals

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_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
this : #((i : ↑S) × { x // r x ↑i }) < #(↑S → α)
⊢ Surjective fun x => ↑x.snd
state_after: no goals

tactic: have := typein_lt_type r i
state_before: case intro.intro.intro.intro.refine_1
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
i : ↑S
⊢ (fun a => #{ x // r x ↑a }) i < (fun x => #α) i
state_after: case intro.intro.intro.intro.refine_1
α✝ : Type u_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
i : ↑S
this : typein r ↑i < type r
⊢ (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_1
r✝ : α✝ → α✝ → Prop
c : Cardinal.{u}
α : Type u
h : ℵ₀ ≤ ⟦α⟧
r : α → α → Prop
wo : IsWellOrder α r
re : (#α).ord = type r
this✝ : (type r).IsLimit
S : Set α
H : ∀ (a : α), ∃ b ∈ S, r a b
Se : #↑S = (type r).cof
i : ↑S
this : typein r ↑i < type r
⊢ (fun a => #{ x // r x ↑a }) i < (fun x => #α) i
state_after: no goals