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

tactic: constructor
state_before: α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
⊢ (∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤) ↔ ∃ S, Set.Countable S ∧ (∀ (s : α), s ∈ S → p s) ∧ sSup S = ⊤

tactic: rintro ⟨s, hps, hs⟩
state_before: case mp
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
⊢ (∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤) → ∃ S, Set.Countable S ∧ (∀ (s : α), s ∈ S → p s) ∧ sSup S = ⊤

tactic: refine' ⟨range s, countable_range s, forall_range_iff.2 hps, _⟩
state_before: case mp.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
s : ℕ → α
hps : ∀ (n : ℕ), p (s n)
hs : (⨆ (n : ℕ), s n) = ⊤
⊢ ∃ S, Set.Countable S ∧ (∀ (s : α), s ∈ S → p s) ∧ sSup S = ⊤

tactic: rwa [sSup_range]
state_before: case mp.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
s : ℕ → α
hps : ∀ (n : ℕ), p (s n)
hs : (⨆ (n : ℕ), s n) = ⊤
⊢ sSup (range s) = ⊤

tactic: rintro ⟨S, hSc, hps, hS⟩
state_before: case mpr
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
⊢ (∃ S, Set.Countable S ∧ (∀ (s : α), s ∈ S → p s) ∧ sSup S = ⊤) → ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: rcases eq_empty_or_nonempty S with (rfl | hne)
state_before: case mpr.intro.intro.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
S : Set α
hSc : Set.Countable S
hps : ∀ (s : α), s ∈ S → p s
hS : sSup S = ⊤
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: rw [sSup_empty] at hS
state_before: case mpr.intro.intro.intro.inl
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
hSc : Set.Countable ∅
hps : ∀ (s : α), s ∈ ∅ → p s
hS : sSup ∅ = ⊤
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: haveI := subsingleton_of_bot_eq_top hS
state_before: case mpr.intro.intro.intro.inl
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
hSc : Set.Countable ∅
hps : ∀ (s : α), s ∈ ∅ → p s
hS : ⊥ = ⊤
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: rcases h with ⟨x, hx⟩
state_before: case mpr.intro.intro.intro.inl
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
hSc : Set.Countable ∅
hps : ∀ (s : α), s ∈ ∅ → p s
hS : ⊥ = ⊤
this : Subsingleton α
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: exact ⟨fun _ => x, fun _ => hx, Subsingleton.elim _ _⟩
state_before: case mpr.intro.intro.intro.inl.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
hSc : Set.Countable ∅
hps : ∀ (s : α), s ∈ ∅ → p s
hS : ⊥ = ⊤
this : Subsingleton α
x : α
hx : p x
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: rcases(Set.countable_iff_exists_surjective hne).1 hSc with ⟨s, hs⟩
state_before: case mpr.intro.intro.intro.inr
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
S : Set α
hSc : Set.Countable S
hps : ∀ (s : α), s ∈ S → p s
hS : sSup S = ⊤
hne : Set.Nonempty S
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: refine' ⟨fun n => s n, fun n => hps _ (s n).coe_prop, _⟩
state_before: case mpr.intro.intro.intro.inr.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
S : Set α
hSc : Set.Countable S
hps : ∀ (s : α), s ∈ S → p s
hS : sSup S = ⊤
hne : Set.Nonempty S
s : ℕ → ↑S
hs : Surjective s
⊢ ∃ s, (∀ (n : ℕ), p (s n)) ∧ (⨆ (n : ℕ), s n) = ⊤

tactic: rwa [hs.iSup_comp, ← sSup_eq_iSup']
state_before: case mpr.intro.intro.intro.inr.intro
α : Type u
β : Type v
γ : Type w
ι : Sort x
inst✝ : CompleteLattice α
p : α → Prop
h : ∃ x, p x
S : Set α
hSc : Set.Countable S
hps : ∀ (s : α), s ∈ S → p s
hS : sSup S = ⊤
hne : Set.Nonempty S
s : ℕ → ↑S
hs : Surjective s
⊢ (⨆ (n : ℕ), (fun n => ↑(s n)) n) = ⊤