Theorem: Finset.exists_subsuperset_card_eq
File: Mathlib/Data/Finset/Card.lean

tactic: obtain ⟨k, hk⟩ := Nat.le.dest hnt
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.card ≤ n
hnt : n ≤ t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro
α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.card ≤ n
hnt : n ≤ t.card
k : ℕ
hk : n + k = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: clear hnt
state_before: case intro
α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.card ≤ n
hnt : n ≤ t.card
k : ℕ
hk : n + k = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro
α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.card ≤ n
k : ℕ
hk : n + k = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: induction' k with k ih generalizing t
state_before: case intro
α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.card ≤ n
k : ℕ
hk : n + k = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro.zero
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
t : Finset α
hst : s ⊆ t
hk : n + 0 = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

case intro.succ
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: obtain ⟨a, ha⟩ : (t \ s).Nonempty := by rw [← card_pos, card_sdiff hst]; omega
state_before: case intro.succ
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: replace hst : s ⊆ t.erase a := subset_erase.2 ⟨hst, (mem_sdiff.1 ha).2⟩
state_before: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: replace hk : n + k = card (erase t a) := by rw [card_erase_of_mem (mem_sdiff.1 ha).1]; omega
state_before: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
hk : n + k = (t.erase a).card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: obtain ⟨u, hsu, hut, hu⟩ := ih hst hk
state_before: case intro.succ.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
hk : n + k = (t.erase a).card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: case intro.succ.intro.intro.intro.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u✝ : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
hk : n + k = (t.erase a).card
u : Finset α
hsu : s ⊆ u
hut : u ⊆ t.erase a
hu : u.card = n
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n

tactic: exact ⟨u, hsu, hut.trans (erase_subset ..), hu⟩
state_before: case intro.succ.intro.intro.intro.intro
α : Type u_1
β : Type u_2
R : Type u_3
s u✝ : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
hk : n + k = (t.erase a).card
u : Finset α
hsu : s ⊆ u
hut : u ⊆ t.erase a
hu : u.card = n
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: no goals

tactic: exact ⟨t, hst, Subset.rfl, hk.symm⟩
state_before: case intro.zero
α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
t : Finset α
hst : s ⊆ t
hk : n + 0 = t.card
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
state_after: no goals

tactic: rw [← card_pos, card_sdiff hst]
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
⊢ (t \ s).Nonempty
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
⊢ 0 < t.card - s.card

tactic: omega
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hst : s ⊆ t
hk : n + (k + 1) = t.card
⊢ 0 < t.card - s.card
state_after: no goals

tactic: rw [card_erase_of_mem (mem_sdiff.1 ha).1]
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
⊢ n + k = (t.erase a).card
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
⊢ n + k = t.card - 1

tactic: omega
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s u : Finset α
f : α → β
n : ℕ
hsn : s.card ≤ n
k : ℕ
ih : ∀ {t : Finset α}, s ⊆ t → n + k = t.card → ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.card = n
t : Finset α
hk : n + (k + 1) = t.card
a : α
ha : a ∈ t \ s
hst : s ⊆ t.erase a
⊢ n + k = t.card - 1
state_after: no goals