-- Mathlib/Order/WellFoundedSet.lean
theorem partiallyWellOrderedOn_iff_finite_antichains [IsSymm α r] :
    s.PartiallyWellOrderedOn r ↔ ∀ t, t ⊆ s → IsAntichain r t → t.Finite

Proof state:
case refine_1.inr.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : n < m
⊢ r (f n) (f m)

Tactic:
rw [hmn]

Result:
case refine_1.inr.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : n < m
⊢ r (f n) (f n)

Proof state:
case refine_1
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
⊢ m = n

Tactic:
obtain h | h | h := lt_trichotomy m n

Result:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ m = n

case refine_1.inr.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m = n
⊢ m = n

case refine_1.inr.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : n < m
⊢ m = n

Proof state:
case refine_2.intro.refl.intro.refl.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m ≠ f n
h : m < n
⊢ rᶜ (f m) (f n)

Tactic:
exact H _ _ h

Result:
no goals

Proof state:
case refine_2.intro.refl.intro.refl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m ≠ f n
⊢ rᶜ (f m) (f n)

Tactic:
obtain h | h := (ne_of_apply_ne _ hmn).lt_or_lt

Result:
case refine_2.intro.refl.intro.refl.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m ≠ f n
h : m < n
⊢ rᶜ (f m) (f n)

case refine_2.intro.refl.intro.refl.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m ≠ f n
h : n < m
⊢ rᶜ (f m) (f n)

Proof state:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ r (f m) (f n)

Tactic:
rw [hmn]

Result:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ r (f n) (f n)

Proof state:
case refine_2
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
⊢ IsAntichain r (range f)

Tactic:
rintro _ ⟨m, hm, rfl⟩ _ ⟨n, hn, rfl⟩ hmn

Result:
case refine_2.intro.refl.intro.refl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m ≠ f n
⊢ rᶜ (f m) (f n)

Proof state:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ r (f n) (f n)

Tactic:
exact refl _

Result:
no goals

Proof state:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
⊢ s.PartiallyWellOrderedOn r ↔ ∀ t ⊆ s, IsAntichain r t → t.Finite

Tactic:
refine ⟨fun h t ht hrt => hrt.finite_of_partiallyWellOrderedOn (h.mono ht), ?_⟩

Result:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
⊢ (∀ t ⊆ s, IsAntichain r t → t.Finite) → s.PartiallyWellOrderedOn r

Proof state:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
⊢ ∃ m n, m < n ∧ r (f m) (f n)

Tactic:
by_contra! H

Result:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
⊢ False

Proof state:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
⊢ (∀ t ⊆ s, IsAntichain r t → t.Finite) → s.PartiallyWellOrderedOn r

Tactic:
rintro hs f hf

Result:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
⊢ ∃ m n, m < n ∧ r (f m) (f n)

Proof state:
case refine_1.inr.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : n < m
⊢ m = n

Tactic:
refine (H _ _ h ?_).elim

Result:
case refine_1.inr.inr
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : n < m
⊢ r (f n) (f m)

Proof state:
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
⊢ False

Tactic:
refine infinite_range_of_injective (fun m n hmn => ?_) (hs _ (range_subset_iff.2 hf) ?_)

Result:
case refine_1
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
⊢ m = n

case refine_2
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
⊢ IsAntichain r (range f)

Proof state:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ m = n

Tactic:
refine (H _ _ h ?_).elim

Result:
case refine_1.inl
α : Type u_2
r : α → α → Prop
s : Set α
inst✝¹ : IsRefl α r
inst✝ : IsSymm α r
hs : ∀ t ⊆ s, IsAntichain r t → t.Finite
f : ℕ → α
hf : ∀ (n : ℕ), f n ∈ s
H : ∀ (m n : ℕ), m < n → ¬r (f m) (f n)
m n : ℕ
hmn : f m = f n
h : m < n
⊢ r (f m) (f n)