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

tactic: obtain ht | ht := t.infinite_or_finite
state_before: α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n ≤ t.ncard
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n
state_after: case inl
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n ≤ t.ncard
ht : t.Infinite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n

case inr
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n ≤ t.ncard
ht : t.Finite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n

tactic: lift s to Finset α using ht.subset hst
state_before: case inr
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n ≤ t.ncard
ht : t.Finite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n
state_after: case inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
n : ℕ
hnt : n ≤ t.ncard
ht : t.Finite
s : Finset α
hst : ↑s ⊆ t
hsn : (↑s).ncard ≤ n
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ t ∧ u.ncard = n

tactic: lift t to Finset α using ht
state_before: case inr.intro
α : Type u_1
β : Type u_2
t : Set α
f : α → β
n : ℕ
hnt : n ≤ t.ncard
ht : t.Finite
s : Finset α
hst : ↑s ⊆ t
hsn : (↑s).ncard ≤ n
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ t ∧ u.ncard = n
state_after: case inr.intro.intro
α : Type u_1
β : Type u_2
f : α → β
n : ℕ
s : Finset α
hsn : (↑s).ncard ≤ n
t : Finset α
hnt : n ≤ (↑t).ncard
hst : ↑s ⊆ ↑t
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ ↑t ∧ u.ncard = n

tactic: obtain ⟨u, hsu, hut, hu⟩ := Finset.exists_subsuperset_card_eq (mod_cast hst) (by simpa using hsn)
  (mod_cast hnt)
state_before: case inr.intro.intro
α : Type u_1
β : Type u_2
f : α → β
n : ℕ
s : Finset α
hsn : (↑s).ncard ≤ n
t : Finset α
hnt : n ≤ (↑t).ncard
hst : ↑s ⊆ ↑t
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ ↑t ∧ u.ncard = n
state_after: case inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
f : α → β
n : ℕ
s : Finset α
hsn : (↑s).ncard ≤ n
t : Finset α
hnt : n ≤ (↑t).ncard
hst : ↑s ⊆ ↑t
u : Finset α
hsu : s ⊆ u
hut : u ⊆ t
hu : u.card = n
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ ↑t ∧ u.ncard = n

tactic: exact ⟨u, mod_cast hsu, mod_cast hut, mod_cast hu⟩
state_before: case inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
f : α → β
n : ℕ
s : Finset α
hsn : (↑s).ncard ≤ n
t : Finset α
hnt : n ≤ (↑t).ncard
hst : ↑s ⊆ ↑t
u : Finset α
hsu : s ⊆ u
hut : u ⊆ t
hu : u.card = n
⊢ ∃ u, ↑s ⊆ u ∧ u ⊆ ↑t ∧ u.ncard = n
state_after: no goals

tactic: rw [ht.ncard, Nat.le_zero, ← ht.ncard] at hnt
state_before: case inl
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n ≤ t.ncard
ht : t.Infinite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n
state_after: case inl
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n = t.ncard
ht : t.Infinite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n

tactic: exact ⟨t, hst, Subset.rfl, hnt.symm⟩
state_before: case inl
α : Type u_1
β : Type u_2
s t : Set α
f : α → β
n : ℕ
hst : s ⊆ t
hsn : s.ncard ≤ n
hnt : n = t.ncard
ht : t.Infinite
⊢ ∃ u, s ⊆ u ∧ u ⊆ t ∧ u.ncard = n
state_after: no goals

tactic: simpa using hsn
state_before: α : Type u_1
β : Type u_2
f : α → β
n : ℕ
s : Finset α
hsn : (↑s).ncard ≤ n
t : Finset α
hnt : n ≤ (↑t).ncard
hst : ↑s ⊆ ↑t
⊢ s.card ≤ n
state_after: no goals