Theorem: RelEmbedding.acc_iff_no_decreasing_seq
File: Mathlib/Order/OrderIsoNat.lean

tactic: constructor
state_before: α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ Acc r x ↔ IsEmpty { f // x ∈ Set.range ⇑f }
state_after: case mp
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ Acc r x → IsEmpty { f // x ∈ Set.range ⇑f }

case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x

tactic: refine fun h => h.recOn fun x _ IH => ?_
state_before: case mp
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ Acc r x → IsEmpty { f // x ∈ Set.range ⇑f }
state_after: case mp
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
⊢ IsEmpty { f // x ∈ Set.range ⇑f }

tactic: constructor
state_before: case mp
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
⊢ IsEmpty { f // x ∈ Set.range ⇑f }
state_after: case mp.false
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
⊢ { f // x ∈ Set.range ⇑f } → False

tactic: rintro ⟨f, k, hf⟩
state_before: case mp.false
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
⊢ { f // x ∈ Set.range ⇑f } → False
state_after: case mp.false.mk.intro
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
f : (fun x x_1 => x > x_1) ↪r r
k : ℕ
hf : f k = x
⊢ False

tactic: exact IsEmpty.elim' (IH (f (k + 1)) (hf ▸ f.map_rel_iff.2 (Nat.lt_succ_self _))) ⟨f, _, rfl⟩
state_before: case mp.false.mk.intro
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝¹ : α
h : Acc r x✝¹
x : α
x✝ : ∀ (y : α), r y x → Acc r y
IH : ∀ (y : α), r y x → IsEmpty { f // y ∈ Set.range ⇑f }
f : (fun x x_1 => x > x_1) ↪r r
k : ℕ
hf : f k = x
⊢ False
state_after: no goals

tactic: have : ∀ x : { a // ¬Acc r a }, ∃ y : { a // ¬Acc r a }, r y.1 x.1 := by
  rintro ⟨x, hx⟩
  cases exists_not_acc_lt_of_not_acc hx with
  | intro w h => exact ⟨⟨w, h.1⟩, h.2⟩
state_before: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x
state_after: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
this : ∀ (x : { a // ¬Acc r a }), ∃ y, r ↑y ↑x
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x

tactic: choose f h using this
state_before: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
this : ∀ (x : { a // ¬Acc r a }), ∃ y, r ↑y ↑x
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x
state_after: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x

tactic: refine fun E =>
  by_contradiction fun hx => E.elim' ⟨natGT (fun n => (f^[n] ⟨x, hx⟩).1) fun n => ?_, 0, rfl⟩
state_before: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
⊢ IsEmpty { f // x ∈ Set.range ⇑f } → Acc r x
state_after: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
E : IsEmpty { f // x ∈ Set.range ⇑f }
hx : ¬Acc r x
n : ℕ
⊢ r ((fun n => ↑(f^[n] ⟨x, hx⟩)) (n + 1)) ((fun n => ↑(f^[n] ⟨x, hx⟩)) n)

tactic: simp only [Function.iterate_succ']
state_before: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
E : IsEmpty { f // x ∈ Set.range ⇑f }
hx : ¬Acc r x
n : ℕ
⊢ r ((fun n => ↑(f^[n] ⟨x, hx⟩)) (n + 1)) ((fun n => ↑(f^[n] ⟨x, hx⟩)) n)
state_after: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
E : IsEmpty { f // x ∈ Set.range ⇑f }
hx : ¬Acc r x
n : ℕ
⊢ r ↑((f ∘ f^[n]) ⟨x, hx⟩) ↑(f^[n] ⟨x, hx⟩)

tactic: apply h
state_before: case mpr
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
f : { a // ¬Acc r a } → { a // ¬Acc r a }
h : ∀ (x : { a // ¬Acc r a }), r ↑(f x) ↑x
E : IsEmpty { f // x ∈ Set.range ⇑f }
hx : ¬Acc r x
n : ℕ
⊢ r ↑((f ∘ f^[n]) ⟨x, hx⟩) ↑(f^[n] ⟨x, hx⟩)
state_after: no goals

tactic: rintro ⟨x, hx⟩
state_before: α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x : α
⊢ ∀ (x : { a // ¬Acc r a }), ∃ y, r ↑y ↑x
state_after: case mk
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝ x : α
hx : ¬Acc r x
⊢ ∃ y, r ↑y ↑⟨x, hx⟩

tactic: cases exists_not_acc_lt_of_not_acc hx with
| intro w h => exact ⟨⟨w, h.1⟩, h.2⟩
state_before: case mk
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝ x : α
hx : ¬Acc r x
⊢ ∃ y, r ↑y ↑⟨x, hx⟩
state_after: no goals

tactic: exact ⟨⟨w, h.1⟩, h.2⟩
state_before: case mk.intro
α : Type u_1
r : α → α → Prop
inst✝ : IsStrictOrder α r
x✝ x : α
hx : ¬Acc r x
w : α
h : ¬Acc r w ∧ r w x
⊢ ∃ y, r ↑y ↑⟨x, hx⟩
state_after: no goals