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

tactic: rcases eq_or_ne (#α) 0 with (ha | ha)
state_before: α✝ : Type ?u.117471
r : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: have h' : IsStrongLimit (#α) := ⟨ha, h⟩
state_before: case inr
α✝ : Type ?u.117471
r : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: rcases ord_eq α with ⟨r, wo, hr⟩
state_before: case inr
α✝ : Type ?u.117471
r : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: haveI := wo
state_before: case inr.intro.intro
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: apply le_antisymm
state_before: case inr.intro.intro
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: rw [ha]
state_before: case inl
α✝ : Type ?u.117471
r : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) = 0
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) = (#α)

tactic: simp [fun s => (Cardinal.zero_le s).not_lt]
state_before: case inl
α✝ : Type ?u.117471
r : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) = 0
⊢ (#{ s // (#↑s) < Ordinal.cof (ord 0) }) = 0

tactic: conv_rhs => rw [← mk_bounded_subset h hr]
state_before: case inr.intro.intro.a
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) ≤ (#α)

tactic: apply mk_le_mk_of_subset
state_before: case inr.intro.intro.a
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) }) ≤ (#{ s // Bounded r s })

tactic: intro s hs
state_before: case inr.intro.intro.a.h
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ (fun x =>
      Quotient.liftOn₂ (#↑x) (Ordinal.cof (ord (#α))) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1 ∧
        ¬Quotient.liftOn₂ (Ordinal.cof (ord (#α))) (#↑x) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1) ⊆
    fun x => ∃ a, ∀ (b : α), b ∈ x → r b a

tactic: rw [hr] at hs
state_before: case inr.intro.intro.a.h
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
s : Set α
hs :
  s ∈ fun x =>
    Quotient.liftOn₂ (#↑x) (Ordinal.cof (ord (#α))) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1 ∧
      ¬Quotient.liftOn₂ (Ordinal.cof (ord (#α))) (#↑x) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1
⊢ s ∈ fun x => ∃ a, ∀ (b : α), b ∈ x → r b a

tactic: exact lt_cof_type hs
state_before: case inr.intro.intro.a.h
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
s : Set α
hs :
  s ∈ fun x =>
    Quotient.liftOn₂ (#↑x) (Ordinal.cof (type r)) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1 ∧
      ¬Quotient.liftOn₂ (Ordinal.cof (type r)) (#↑x) (fun α β => Nonempty (α ↪ β)) instLECardinal.proof_1
⊢ s ∈ fun x => ∃ a, ∀ (b : α), b ∈ x → r b a

tactic: refine' @mk_le_of_injective α _ (fun x => Subtype.mk {x} _) _
state_before: case inr.intro.intro.a
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ (#α) ≤ (#{ s // (#↑s) < Ordinal.cof (ord (#α)) })

tactic: rw [mk_singleton]
state_before: case inr.intro.intro.a.refine'_1
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
x : α
⊢ (#↑{x}) < Ordinal.cof (ord (#α))

tactic: exact one_lt_aleph0.trans_le (aleph0_le_cof.2 (ord_isLimit h'.isLimit.aleph0_le))
state_before: case inr.intro.intro.a.refine'_1
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
x : α
⊢ 1 < Ordinal.cof (ord (#α))

tactic: intro a b hab
state_before: case inr.intro.intro.a.refine'_2
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
⊢ Injective fun x => { val := {x}, property := (_ : (#↑{x}) < Ordinal.cof (ord (#α))) }

tactic: simpa [singleton_eq_singleton_iff] using hab
state_before: case inr.intro.intro.a.refine'_2
α✝ : Type ?u.117471
r✝ : α✝ → α✝ → Prop
α : Type u_1
h : ∀ (x : Cardinal), x < (#α) → 2 ^ x < (#α)
ha : (#α) ≠ 0
h' : IsStrongLimit (#α)
r : α → α → Prop
wo : IsWellOrder α r
hr : ord (#α) = type r
this : IsWellOrder α r
a b : α
hab :
  (fun x => { val := {x}, property := (_ : (#↑{x}) < Ordinal.cof (ord (#α))) }) a =
    (fun x => { val := {x}, property := (_ : (#↑{x}) < Ordinal.cof (ord (#α))) }) b
⊢ a = b