Theorem: Set.seq_of_forall_finite_exists
File: Mathlib/Data/Set/Finite.lean

tactic: haveI : Nonempty γ := (h ∅ finite_empty).nonempty
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
h : ∀ (t : Set γ), t.Finite → ∃ c, P c t
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)
state_after: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
h : ∀ (t : Set γ), t.Finite → ∃ c, P c t
this : Nonempty γ
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)

tactic: choose! c hc using h
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
h : ∀ (t : Set γ), t.Finite → ∃ c, P c t
this : Nonempty γ
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)
state_after: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)

tactic: set f : (n : ℕ) → (g : (m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k : Iio n => g k.1 k.2)
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)
state_after: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)

tactic: set u : ℕ → γ := fun n => Nat.strongRecOn' n f
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)
state_after: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)

tactic: refine ⟨u, fun n => ?_⟩
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
⊢ ∃ u, ∀ (n : ℕ), P (u n) (u '' Iio n)
state_after: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ P (u n) (u '' Iio n)

tactic: convert hc (u '' Iio n) ((finite_lt_nat _).image _)
state_before: α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ P (u n) (u '' Iio n)
state_after: case h.e'_1
α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ u n = c (u '' Iio n)

tactic: rw [image_eq_range]
state_before: case h.e'_1
α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ u n = c (u '' Iio n)
state_after: case h.e'_1
α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ u n = c (range fun x => u ↑x)

tactic: exact Nat.strongRecOn'_beta
state_before: case h.e'_1
α : Type u
β : Type v
ι : Sort w
γ✝ : Type x
γ : Type u_1
P : γ → Set γ → Prop
this : Nonempty γ
c : Set γ → γ
hc : ∀ (t : Set γ), t.Finite → P (c t) t
f : (n : ℕ) → ((m : ℕ) → m < n → γ) → γ := fun n g => c (range fun k => g ↑k ⋯)
u : ℕ → γ := fun n => n.strongRecOn' f
n : ℕ
⊢ u n = c (range fun x => u ↑x)
state_after: no goals