Theorem: Set.countable_setOf_nonempty_of_disjoint
File: Mathlib/Data/Set/Countable.lean

tactic: rw [← Set.countable_coe_iff] at hs ⊢
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : s.Countable
⊢ {t | (f t).Nonempty}.Countable
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
⊢ Countable ↑{t | (f t).Nonempty}

tactic: have : ∀ t : {t // (f t).Nonempty}, ∃ x : s, x.1 ∈ f t := by
  rintro ⟨t, ⟨x, hx⟩⟩
  exact ⟨⟨x, (h'f t hx)⟩, hx⟩
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
⊢ Countable ↑{t | (f t).Nonempty}
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
this : ∀ (t : { t // (f t).Nonempty }), ∃ x, ↑x ∈ f ↑t
⊢ Countable ↑{t | (f t).Nonempty}

tactic: choose F hF using this
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
this : ∀ (t : { t // (f t).Nonempty }), ∃ x, ↑x ∈ f ↑t
⊢ Countable ↑{t | (f t).Nonempty}
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
⊢ Countable ↑{t | (f t).Nonempty}

tactic: have A : Injective F := by
  rintro ⟨t, ht⟩ ⟨t', ht'⟩ htt'
  have A : (f t ∩ f t').Nonempty := by
    refine ⟨F ⟨t, ht⟩, hF _, ?_⟩
    rw [htt']
    exact hF _
  simp only [Subtype.mk.injEq]
  by_contra H
  exact not_disjoint_iff_nonempty_inter.2 A (hf H)
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
⊢ Countable ↑{t | (f t).Nonempty}
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
A : Injective F
⊢ Countable ↑{t | (f t).Nonempty}

tactic: exact Injective.countable A
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
A : Injective F
⊢ Countable ↑{t | (f t).Nonempty}
state_after: no goals

tactic: rintro ⟨t, ⟨x, hx⟩⟩
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
⊢ ∀ (t : { t // (f t).Nonempty }), ∃ x, ↑x ∈ f ↑t
state_after: case mk.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
t : β
x : α
hx : x ∈ f t
⊢ ∃ x_1, ↑x_1 ∈ f ↑⟨t, ⋯⟩

tactic: exact ⟨⟨x, (h'f t hx)⟩, hx⟩
state_before: case mk.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
t : β
x : α
hx : x ∈ f t
⊢ ∃ x_1, ↑x_1 ∈ f ↑⟨t, ⋯⟩
state_after: no goals

tactic: rintro ⟨t, ht⟩ ⟨t', ht'⟩ htt'
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
⊢ Injective F
state_after: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ⟨t, ht⟩ = ⟨t', ht'⟩

tactic: have A : (f t ∩ f t').Nonempty := by
  refine ⟨F ⟨t, ht⟩, hF _, ?_⟩
  rw [htt']
  exact hF _
state_before: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ⟨t, ht⟩ = ⟨t', ht'⟩
state_after: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
⊢ ⟨t, ht⟩ = ⟨t', ht'⟩

tactic: simp only [Subtype.mk.injEq]
state_before: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
⊢ ⟨t, ht⟩ = ⟨t', ht'⟩
state_after: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
⊢ t = t'

tactic: by_contra H
state_before: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
⊢ t = t'
state_after: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
H : ¬t = t'
⊢ False

tactic: exact not_disjoint_iff_nonempty_inter.2 A (hf H)
state_before: case mk.mk
α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
A : (f t ∩ f t').Nonempty
H : ¬t = t'
⊢ False
state_after: no goals

tactic: refine ⟨F ⟨t, ht⟩, hF _, ?_⟩
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ (f t ∩ f t').Nonempty
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ↑(F ⟨t, ht⟩) ∈ f t'

tactic: rw [htt']
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ↑(F ⟨t, ht⟩) ∈ f t'
state_after: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ↑(F ⟨t', ht'⟩) ∈ f t'

tactic: exact hF _
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
f : β → Set α
hf : Pairwise (Disjoint on f)
s : Set α
h'f : ∀ (t : β), f t ⊆ s
hs : Countable ↑s
F : { t // (f t).Nonempty } → ↑s
hF : ∀ (t : { t // (f t).Nonempty }), ↑(F t) ∈ f ↑t
t : β
ht : (f t).Nonempty
t' : β
ht' : (f t').Nonempty
htt' : F ⟨t, ht⟩ = F ⟨t', ht'⟩
⊢ ↑(F ⟨t', ht'⟩) ∈ f t'
state_after: no goals