Theorem: Set.wellFoundedGT_of_chainHeight_ne_top
File: Mathlib/Order/Height.lean

tactic: obtain ⟨n, hn⟩ := WithTop.ne_top_iff_exists.1 hs
state_before: α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
⊢ WellFoundedGT ↑s
state_after: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
⊢ WellFoundedGT ↑s

tactic: refine ⟨RelEmbedding.wellFounded_iff_no_descending_seq.2 ⟨fun f ↦ ?_⟩⟩
state_before: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
⊢ WellFoundedGT ↑s
state_after: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ False

tactic: refine n.lt_succ_self.not_le (WithTop.coe_le_coe.1 <| hn.symm ▸ ?_)
state_before: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ False
state_after: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ s.chainHeight

tactic: refine le_iSup₂_of_le ((ofFn (n := n.succ) fun i ↦ f i).map Subtype.val)
  ⟨chain'_map_of_chain' ((↑) : {x // x ∈ s} → α) (fun _ _ ↦ id)
    (chain'_iff_pairwise.2 <| pairwise_ofFn.2 fun i j ↦ f.map_rel_iff.2), fun i h ↦ ?_⟩ ?_
state_before: case intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ s.chainHeight
state_after: case intro.refine_1
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
i : α
h : i ∈ map Subtype.val (ofFn fun i => f ↑i)
⊢ i ∈ s

case intro.refine_2
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ ↑(map Subtype.val (ofFn fun i => f ↑i)).length

tactic: obtain ⟨a, -, rfl⟩ := mem_map.1 h
state_before: case intro.refine_1
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
i : α
h : i ∈ map Subtype.val (ofFn fun i => f ↑i)
⊢ i ∈ s
state_after: case intro.refine_1.intro.intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
a : { x // x ∈ s }
h : ↑a ∈ map Subtype.val (ofFn fun i => f ↑i)
⊢ ↑a ∈ s

tactic: exact a.prop
state_before: case intro.refine_1.intro.intro
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
a : { x // x ∈ s }
h : ↑a ∈ map Subtype.val (ofFn fun i => f ↑i)
⊢ ↑a ∈ s
state_after: no goals

tactic: rw [length_map, length_ofFn]
state_before: case intro.refine_2
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ ↑(map Subtype.val (ofFn fun i => f ↑i)).length
state_after: case intro.refine_2
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ ↑n.succ

tactic: exact le_rfl
state_before: case intro.refine_2
α : Type u_1
β : Type u_2
s✝ t : Set α
inst✝ : Preorder α
s : Set α
hs : s.chainHeight ≠ ⊤
this : IsTrans { x // x ∈ s } fun x x_1 => x < x_1
n : ℕ
hn : ↑n = s.chainHeight
f : (fun x x_1 => x > x_1) ↪r fun x x_1 => x > x_1
⊢ ↑n.succ ≤ ↑n.succ
state_after: no goals