Theorem: exists_seq_of_forall_finset_exists
File: Mathlib/Data/Fintype/Basic.lean

tactic: classical
  have : Nonempty α := by
    rcases h ∅ (by simp) with ⟨y, _⟩
    exact ⟨y⟩
  choose! F hF using h
  have h' : ∀ s : Finset α, ∃ y, (∀ x ∈ s, P x) → P y ∧ ∀ x ∈ s, r x y := fun s => ⟨F s, hF s⟩
  set f := seqOfForallFinsetExistsAux P r h' with hf
  have A : ∀ n : ℕ, P (f n) := by
    intro n
    induction' n using Nat.strong_induction_on with n IH
    have IH' : ∀ x : Fin n, P (f x) := fun n => IH n.1 n.2
    rw [hf, seqOfForallFinsetExistsAux]
    exact
      (Classical.choose_spec
          (h' (Finset.image (fun i : Fin n => f i) (Finset.univ : Finset (Fin n))))
          (by simp [IH'])).1
  refine' ⟨f, A, fun m n hmn => _⟩
  conv_rhs => rw [hf]
  rw [seqOfForallFinsetExistsAux]
  apply
    (Classical.choose_spec
        (h' (Finset.image (fun i : Fin n => f i) (Finset.univ : Finset (Fin n)))) (by simp [A])).2
  exact Finset.mem_image.2 ⟨⟨m, hmn⟩, Finset.mem_univ _, rfl⟩
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: have : Nonempty α := by
  rcases h ∅ (by simp) with ⟨y, _⟩
  exact ⟨y⟩
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: choose! F hF using h
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
this : Nonempty α
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: have h' : ∀ s : Finset α, ∃ y, (∀ x ∈ s, P x) → P y ∧ ∀ x ∈ s, r x y := fun s => ⟨F s, hF s⟩
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: set f := seqOfForallFinsetExistsAux P r h' with hf
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: have A : ∀ n : ℕ, P (f n) := by
  intro n
  induction' n using Nat.strong_induction_on with n IH
  have IH' : ∀ x : Fin n, P (f x) := fun n => IH n.1 n.2
  rw [hf, seqOfForallFinsetExistsAux]
  exact
    (Classical.choose_spec
        (h' (Finset.image (fun i : Fin n => f i) (Finset.univ : Finset (Fin n))))
        (by simp [IH'])).1
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: refine' ⟨f, A, fun m n hmn => _⟩
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
⊢ ∃ f, (∀ (n : ℕ), P (f n)) ∧ ∀ (m n : ℕ), m < n → r (f m) (f n)

tactic: conv_rhs => rw [hf]
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
m n : ℕ
hmn : m < n
⊢ r (f m) (f n)

tactic: rw [seqOfForallFinsetExistsAux]
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
m n : ℕ
hmn : m < n
⊢ r (f m) (seqOfForallFinsetExistsAux P r h' n)

tactic: apply
  (Classical.choose_spec
      (h' (Finset.image (fun i : Fin n => f i) (Finset.univ : Finset (Fin n)))) (by simp [A])).2
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
m n : ℕ
hmn : m < n
⊢ r (f m)
    (Classical.choose
      (_ :
        ∃ y,
          (∀ (x : α), x ∈ image (fun i => seqOfForallFinsetExistsAux P r h' ↑i) univ → P x) →
            P y ∧ ∀ (x : α), x ∈ image (fun i => seqOfForallFinsetExistsAux P r h' ↑i) univ → r x y))

tactic: exact Finset.mem_image.2 ⟨⟨m, hmn⟩, Finset.mem_univ _, rfl⟩
state_before: case a
α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
m n : ℕ
hmn : m < n
⊢ f m ∈ image (fun i => f ↑i) univ

tactic: rcases h ∅ (by simp) with ⟨y, _⟩
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
⊢ Nonempty α

tactic: exact ⟨y⟩
state_before: case intro
α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
y : α
h✝ : P y ∧ ∀ (x : α), x ∈ ∅ → r x y
⊢ Nonempty α

tactic: simp
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
h : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → ∃ y, P y ∧ ∀ (x : α), x ∈ s → r x y
⊢ ∀ (x : α), x ∈ ∅ → P x

tactic: intro n
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
⊢ ∀ (n : ℕ), P (f n)

tactic: induction' n using Nat.strong_induction_on with n IH
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
n : ℕ
⊢ P (f n)

tactic: have IH' : ∀ x : Fin n, P (f x) := fun n => IH n.1 n.2
state_before: case h
α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
n : ℕ
IH : ∀ (m : ℕ), m < n → P (f m)
⊢ P (f n)

tactic: rw [hf, seqOfForallFinsetExistsAux]
state_before: case h
α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
n : ℕ
IH : ∀ (m : ℕ), m < n → P (f m)
IH' : ∀ (x : Fin n), P (f ↑x)
⊢ P (f n)

tactic: exact
  (Classical.choose_spec
      (h' (Finset.image (fun i : Fin n => f i) (Finset.univ : Finset (Fin n))))
      (by simp [IH'])).1
state_before: case h
α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
n : ℕ
IH : ∀ (m : ℕ), m < n → P (f m)
IH' : ∀ (x : Fin n), P (f ↑x)
⊢ P
    (Classical.choose
      (_ :
        ∃ y,
          (∀ (x : α), x ∈ image (fun i => seqOfForallFinsetExistsAux P r h' ↑i) univ → P x) →
            P y ∧ ∀ (x : α), x ∈ image (fun i => seqOfForallFinsetExistsAux P r h' ↑i) univ → r x y))

tactic: simp [IH']
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
n : ℕ
IH : ∀ (m : ℕ), m < n → P (f m)
IH' : ∀ (x : Fin n), P (f ↑x)
⊢ ∀ (x : α), x ∈ image (fun i => f ↑i) univ → P x

tactic: simp [A]
state_before: α✝ : Type ?u.153481
β : Type ?u.153484
γ : Type ?u.153487
α : Type u_1
P : α → Prop
r : α → α → Prop
this : Nonempty α
F : Finset α → α
hF : ∀ (s : Finset α), (∀ (x : α), x ∈ s → P x) → P (F s) ∧ ∀ (x : α), x ∈ s → r x (F s)
h' : ∀ (s : Finset α), ∃ y, (∀ (x : α), x ∈ s → P x) → P y ∧ ∀ (x : α), x ∈ s → r x y
f : ℕ → α := seqOfForallFinsetExistsAux P r h'
hf : f = seqOfForallFinsetExistsAux P r h'
A : ∀ (n : ℕ), P (f n)
m n : ℕ
hmn : m < n
⊢ ∀ (x : α), x ∈ image (fun i => f ↑i) univ → P x