Theorem: Set.exists_subset_encard_eq
File: Mathlib/Data/Set/Card.lean

tactic: revert hk
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
hk : k ≤ s.encard
⊢ ∃ t ⊆ s, t.encard = k
state_after: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ k ≤ s.encard → ∃ t ⊆ s, t.encard = k

tactic: refine ENat.nat_induction k (fun _ ↦ ⟨∅, empty_subset _, by simp⟩) (fun n IH hle ↦ ?_) ?_
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ k ≤ s.encard → ∃ t ⊆ s, t.encard = k
state_after: case refine_1
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
hle : ↑n.succ ≤ s.encard
⊢ ∃ t ⊆ s, t.encard = ↑n.succ

case refine_2
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ (∀ (n : ℕ), ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n) → ⊤ ≤ s.encard → ∃ t ⊆ s, t.encard = ⊤

tactic: simp only [top_le_iff, encard_eq_top_iff]
state_before: case refine_2
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ (∀ (n : ℕ), ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n) → ⊤ ≤ s.encard → ∃ t ⊆ s, t.encard = ⊤
state_after: case refine_2
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ (∀ (n : ℕ), ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n) → s.Infinite → ∃ t ⊆ s, t.Infinite

tactic: exact fun _ hi ↦ ⟨s, Subset.rfl, hi⟩
state_before: case refine_2
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
⊢ (∀ (n : ℕ), ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n) → s.Infinite → ∃ t ⊆ s, t.Infinite
state_after: no goals

tactic: simp
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
x✝ : 0 ≤ s.encard
⊢ ∅.encard = 0
state_after: no goals

tactic: obtain ⟨t₀, ht₀s, ht₀⟩ := IH (le_trans (by simp) hle)
state_before: case refine_1
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
hle : ↑n.succ ≤ s.encard
⊢ ∃ t ⊆ s, t.encard = ↑n.succ
state_after: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
hle : ↑n.succ ≤ s.encard
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
⊢ ∃ t ⊆ s, t.encard = ↑n.succ

tactic: simp only [Nat.cast_succ] at *
state_before: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
hle : ↑n.succ ≤ s.encard
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
⊢ ∃ t ⊆ s, t.encard = ↑n.succ
state_after: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
⊢ ∃ t ⊆ s, t.encard = ↑n + 1

tactic: have hne : t₀ ≠ s := by
  rintro rfl; rw [ht₀, ← Nat.cast_one, ← Nat.cast_add, Nat.cast_le] at hle; simp at hle
state_before: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
⊢ ∃ t ⊆ s, t.encard = ↑n + 1
state_after: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
hne : t₀ ≠ s
⊢ ∃ t ⊆ s, t.encard = ↑n + 1

tactic: obtain ⟨x, hx⟩ := exists_of_ssubset (ht₀s.ssubset_of_ne hne)
state_before: case refine_1.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
hne : t₀ ≠ s
⊢ ∃ t ⊆ s, t.encard = ↑n + 1
state_after: case refine_1.intro.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
hne : t₀ ≠ s
x : α
hx : x ∈ s ∧ x ∉ t₀
⊢ ∃ t ⊆ s, t.encard = ↑n + 1

tactic: exact ⟨insert x t₀, insert_subset hx.1 ht₀s, by rw [encard_insert_of_not_mem hx.2, ht₀]⟩
state_before: case refine_1.intro.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
hne : t₀ ≠ s
x : α
hx : x ∈ s ∧ x ∉ t₀
⊢ ∃ t ⊆ s, t.encard = ↑n + 1
state_after: no goals

tactic: simp
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
hle : ↑n.succ ≤ s.encard
⊢ ↑n ≤ ↑n.succ
state_after: no goals

tactic: rintro rfl
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
⊢ t₀ ≠ s
state_after: α : Type u_1
β : Type u_2
t : Set α
k : ℕ∞
n : ℕ
t₀ : Set α
ht₀ : t₀.encard = ↑n
IH : ↑n ≤ t₀.encard → ∃ t ⊆ t₀, t.encard = ↑n
ht₀s : t₀ ⊆ t₀
hle : ↑n + 1 ≤ t₀.encard
⊢ False

tactic: rw [ht₀, ← Nat.cast_one, ← Nat.cast_add, Nat.cast_le] at hle
state_before: α : Type u_1
β : Type u_2
t : Set α
k : ℕ∞
n : ℕ
t₀ : Set α
ht₀ : t₀.encard = ↑n
IH : ↑n ≤ t₀.encard → ∃ t ⊆ t₀, t.encard = ↑n
ht₀s : t₀ ⊆ t₀
hle : ↑n + 1 ≤ t₀.encard
⊢ False
state_after: α : Type u_1
β : Type u_2
t : Set α
k : ℕ∞
n : ℕ
t₀ : Set α
ht₀ : t₀.encard = ↑n
IH : ↑n ≤ t₀.encard → ∃ t ⊆ t₀, t.encard = ↑n
ht₀s : t₀ ⊆ t₀
hle : n + 1 ≤ n
⊢ False

tactic: simp at hle
state_before: α : Type u_1
β : Type u_2
t : Set α
k : ℕ∞
n : ℕ
t₀ : Set α
ht₀ : t₀.encard = ↑n
IH : ↑n ≤ t₀.encard → ∃ t ⊆ t₀, t.encard = ↑n
ht₀s : t₀ ⊆ t₀
hle : n + 1 ≤ n
⊢ False
state_after: no goals

tactic: rw [encard_insert_of_not_mem hx.2, ht₀]
state_before: α : Type u_1
β : Type u_2
s t : Set α
k : ℕ∞
n : ℕ
IH : ↑n ≤ s.encard → ∃ t ⊆ s, t.encard = ↑n
t₀ : Set α
ht₀s : t₀ ⊆ s
ht₀ : t₀.encard = ↑n
hle : ↑n + 1 ≤ s.encard
hne : t₀ ≠ s
x : α
hx : x ∈ s ∧ x ∉ t₀
⊢ (insert x t₀).encard = ↑n + 1
state_after: no goals