Theorem: Set.PartiallyWellOrderedOn.exists_min_bad_of_exists_bad
File: Mathlib/Order/WellFoundedSet.lean

tactic: rintro ⟨f0, hf0 : IsBadSeq r s f0⟩
state_before: ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
⊢ (∃ f, IsBadSeq r s f) → ∃ f, IsBadSeq r s f ∧ ∀ (n : ℕ), IsMinBadSeq r rk s n f

tactic: refine ⟨fun n => (fs n).1 n, ⟨fun n => (fs n).2.1.1 n, fun m n mn => ?_⟩, fun n g hg1 hg2 => ?_⟩
state_before: case intro
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
⊢ ∃ f, IsBadSeq r s f ∧ ∀ (n : ℕ), IsMinBadSeq r rk s n f

tactic: refine' Nat.rec _ fun n fn => _
state_before: ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
⊢ (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f }

tactic: exact ⟨(minBadSeqOfBadSeq r rk s 0 f0 hf0).1, (minBadSeqOfBadSeq r rk s 0 f0 hf0).2.2⟩
state_before: case refine'_1
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
⊢ { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s Nat.zero f }

tactic: exact ⟨(minBadSeqOfBadSeq r rk s (n + 1) fn.1 fn.2.1).1,
  (minBadSeqOfBadSeq r rk s (n + 1) fn.1 fn.2.1).2.2⟩
state_before: case refine'_2
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
n : ℕ
fn : { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f }
⊢ { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s (Nat.succ n) f }

tactic: obtain ⟨k, rfl⟩ := exists_add_of_le mn
state_before: ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m n : ℕ
mn : m ≤ n
⊢ ↑(fs m) m = ↑(fs n) m

tactic: clear mn
state_before: case intro
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m k : ℕ
mn : m ≤ m + k
⊢ ↑(fs m) m = ↑(fs (m + k)) m

tactic: induction' k with k ih
state_before: case intro
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m k : ℕ
⊢ ↑(fs m) m = ↑(fs (m + k)) m

tactic: rfl
state_before: case intro.zero
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m : ℕ
⊢ ↑(fs m) m = ↑(fs (m + Nat.zero)) m

tactic: rw [ih, (minBadSeqOfBadSeq r rk s (m + k + 1) (fs (m + k)).1 (fs (m + k)).2.1).2.1 m
  (Nat.lt_succ_iff.2 (Nat.add_le_add_left k.zero_le m))]
state_before: case intro.succ
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m k : ℕ
ih : ↑(fs m) m = ↑(fs (m + k)) m
⊢ ↑(fs m) m = ↑(fs (m + Nat.succ k)) m

tactic: rfl
state_before: case intro.succ
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
m k : ℕ
ih : ↑(fs m) m = ↑(fs (m + k)) m
⊢ ↑(minBadSeqOfBadSeq r rk s (m + k + 1) ↑(fs (m + k)) (_ : IsBadSeq r s ↑(fs (m + k)))) m = ↑(fs (m + Nat.succ k)) m

tactic: dsimp
state_before: case intro.refine_1
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
m n : ℕ
mn : m < n
⊢ ¬r ((fun n => ↑(fs n) n) m) ((fun n => ↑(fs n) n) n)

tactic: rw [h m n mn.le]
state_before: case intro.refine_1
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
m n : ℕ
mn : m < n
⊢ ¬r
      (↑(Nat.rec
            { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
              property :=
                (_ :
                  IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
                    IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
            (fun n fn =>
              { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
                property :=
                  (_ :
                    IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                      IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
            m)
        m)
      (↑(Nat.rec
            { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
              property :=
                (_ :
                  IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
                    IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
            (fun n fn =>
              { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
                property :=
                  (_ :
                    IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                      IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
            n)
        n)

tactic: exact (fs n).2.1.2 m n mn
state_before: case intro.refine_1
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
m n : ℕ
mn : m < n
⊢ ¬r (↑(fs n) m)
      (↑(Nat.rec
            { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
              property :=
                (_ :
                  IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
                    IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
            (fun n fn =>
              { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
                property :=
                  (_ :
                    IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                      IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
            n)
        n)

tactic: refine (fs n).2.2 g (fun m mn => ?_) hg2
state_before: case intro.refine_2
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
n : ℕ
g : ℕ → α
hg1 : ∀ (m : ℕ), m < n → (fun n => ↑(fs n) n) m = g m
hg2 : rk (g n) < rk ((fun n => ↑(fs n) n) n)
⊢ ¬IsBadSeq r s g

tactic: rw [← h m n mn.le, ← hg1 m mn]
state_before: case intro.refine_2
ι : Type ?u.145238
α : Type u_1
β : Type ?u.145244
r✝ r : α → α → Prop
rk : α → ℕ
s : Set α
f0 : ℕ → α
hf0 : IsBadSeq r s f0
fs : (n : ℕ) → { f // IsBadSeq r s f ∧ IsMinBadSeq r rk s n f } :=
  fun t =>
    Nat.rec
      { val := ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0),
        property :=
          (_ :
            IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0) ∧
              IsMinBadSeq r rk s 0 ↑(minBadSeqOfBadSeq r rk s 0 f0 hf0)) }
      (fun n fn =>
        { val := ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)),
          property :=
            (_ :
              IsBadSeq r s ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn)) ∧
                IsMinBadSeq r rk s (n + 1) ↑(minBadSeqOfBadSeq r rk s (n + 1) ↑fn (_ : IsBadSeq r s ↑fn))) })
      t
h : ∀ (m n : ℕ), m ≤ n → ↑(fs m) m = ↑(fs n) m
n : ℕ
g : ℕ → α
hg1 : ∀ (m : ℕ), m < n → (fun n => ↑(fs n) n) m = g m
hg2 : rk (g n) < rk ((fun n => ↑(fs n) n) n)
m : ℕ
mn : m < n
⊢ ↑(fs n) m = g m