Theorem: Partrec.fix_aux
File: Mathlib/Computability/Partrec.lean

tactic: intro F
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
⊢ let F := fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n;
  (∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n) ↔ b ∈ PFun.fix f a

tactic: refine' ⟨fun h => _, fun h => _⟩
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
⊢ (∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n) ↔ b ∈ PFun.fix f a

tactic: rcases h with ⟨n, ⟨_x, h₁⟩, h₂⟩
state_before: case refine'_1
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : ∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n
⊢ b ∈ PFun.fix f a

tactic: cases n <;> simp at h₂
state_before: case refine'_1.intro.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
this : ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
⊢ b ∈ PFun.fix f a

tactic: rcases h₂ with (h₂ | ⟨a', am', fa'⟩)
state_before: case refine'_1.intro.intro.intro.succ
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
this : ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
n✝ : ℕ
_x : ∃ b', Sum.inl b' ∈ F a (Nat.succ n✝)
h₁ : ∀ {m : ℕ}, m < Nat.succ n✝ → ∃ b, Sum.inr b ∈ F a m
h₂ :
  Sum.inl b ∈
      Nat.rec (Part.some (Sum.inr a))
        (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) n✝ ∨
    ∃ b_1,
      Sum.inr b_1 ∈
          Nat.rec (Part.some (Sum.inr a))
            (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) n✝ ∧
        Sum.inl b ∈ f b_1
⊢ b ∈ PFun.fix f a

tactic: intro m a' am ba
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
⊢ ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a

tactic: induction' m with m IH generalizing a' <;> simp at am
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
m : ℕ
a' : α
am : Sum.inr a' ∈ F a m
ba : b ∈ PFun.fix f a'
⊢ b ∈ PFun.fix f a

tactic: rcases am with ⟨a₂, am₂, fa₂⟩
state_before: case succ
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
m✝ : ℕ
a'✝ : α
am✝ : Sum.inr a'✝ ∈ F a m✝
ba✝ : b ∈ PFun.fix f a'✝
m : ℕ
IH : ∀ (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
a' : α
ba : b ∈ PFun.fix f a'
am :
  ∃ b,
    Sum.inr b ∈
        Nat.rec (Part.some (Sum.inr a))
          (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) m ∧
      Sum.inr a' ∈ f b
⊢ b ∈ PFun.fix f a

tactic: exact IH _ am₂ (PFun.mem_fix_iff.2 (Or.inr ⟨_, fa₂, ba⟩))
state_before: case succ.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
m✝ : ℕ
a'✝ : α
am : Sum.inr a'✝ ∈ F a m✝
ba✝ : b ∈ PFun.fix f a'✝
m : ℕ
IH : ∀ (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
a' : α
ba : b ∈ PFun.fix f a'
a₂ : α
am₂ :
  Sum.inr a₂ ∈
    Nat.rec (Part.some (Sum.inr a))
      (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) m
fa₂ : Sum.inr a' ∈ f a₂
⊢ b ∈ PFun.fix f a

tactic: rwa [← am]
state_before: case zero
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
n : ℕ
h₂ : Sum.inl b ∈ F a n
_x : ∃ b', Sum.inl b' ∈ F a n
h₁ : ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m
m : ℕ
a'✝ : α
am✝ : Sum.inr a'✝ ∈ F a m
ba✝ : b ∈ PFun.fix f a'✝
a' : α
ba : b ∈ PFun.fix f a'
am : a' = a
⊢ b ∈ PFun.fix f a

tactic: cases' h₁ (Nat.lt_succ_self _) with a' h
state_before: case refine'_1.intro.intro.intro.succ.inl
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
this : ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
n✝ : ℕ
_x : ∃ b', Sum.inl b' ∈ F a (Nat.succ n✝)
h₁ : ∀ {m : ℕ}, m < Nat.succ n✝ → ∃ b, Sum.inr b ∈ F a m
h₂ :
  Sum.inl b ∈
    Nat.rec (Part.some (Sum.inr a))
      (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) n✝
⊢ b ∈ PFun.fix f a

tactic: injection mem_unique h h₂
state_before: case refine'_1.intro.intro.intro.succ.inl.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
this : ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
n✝ : ℕ
_x : ∃ b', Sum.inl b' ∈ F a (Nat.succ n✝)
h₁ : ∀ {m : ℕ}, m < Nat.succ n✝ → ∃ b, Sum.inr b ∈ F a m
h₂ :
  Sum.inl b ∈
    Nat.rec (Part.some (Sum.inr a))
      (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) n✝
a' : α
h : Sum.inr a' ∈ F a n✝
⊢ b ∈ PFun.fix f a

tactic: exact this _ _ am' (PFun.mem_fix_iff.2 (Or.inl fa'))
state_before: case refine'_1.intro.intro.intro.succ.inr.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
this : ∀ (m : ℕ) (a' : α), Sum.inr a' ∈ F a m → b ∈ PFun.fix f a' → b ∈ PFun.fix f a
n✝ : ℕ
_x : ∃ b', Sum.inl b' ∈ F a (Nat.succ n✝)
h₁ : ∀ {m : ℕ}, m < Nat.succ n✝ → ∃ b, Sum.inr b ∈ F a m
a' : α
am' :
  Sum.inr a' ∈
    Nat.rec (Part.some (Sum.inr a))
      (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) n✝
fa' : Sum.inl b ∈ f a'
⊢ b ∈ PFun.fix f a

tactic: suffices
  ∀ (a') (_ : b ∈ PFun.fix f a') (k) (_ : Sum.inr a' ∈ F a k),
    ∃ n, Sum.inl b ∈ F a n ∧ ∀ m < n, ∀ (_ : k ≤ m), ∃ a₂, Sum.inr a₂ ∈ F a m by
  rcases this _ h 0 (by simp) with ⟨n, hn₁, hn₂⟩
  exact ⟨_, ⟨⟨_, hn₁⟩, fun {m} mn => hn₂ m mn (Nat.zero_le _)⟩, hn₁⟩
state_before: case refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
⊢ ∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n

tactic: intro a₁ h₁
state_before: case refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
⊢ ∀ (a' : α),
    b ∈ PFun.fix f a' →
      ∀ (k : ℕ), Sum.inr a' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: apply @PFun.fixInduction _ _ _ _ _ _ h₁
state_before: case refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
⊢ ∀ (k : ℕ), Sum.inr a₁ ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: intro a₂ h₂ IH k hk
state_before: case refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
⊢ ∀ (a' : α),
    b ∈ PFun.fix f a' →
      (∀ (a'' : α),
          Sum.inr a'' ∈ f a' →
            ∀ (k : ℕ),
              Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m) →
        ∀ (k : ℕ), Sum.inr a' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: rcases PFun.mem_fix_iff.1 h₂ with (h₂ | ⟨a₃, am₃, _⟩)
state_before: case refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
⊢ ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: rcases this _ h 0 (by simp) with ⟨n, hn₁, hn₂⟩
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
this :
  ∀ (a' : α),
    b ∈ PFun.fix f a' →
      ∀ (k : ℕ), Sum.inr a' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
⊢ ∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n

tactic: exact ⟨_, ⟨⟨_, hn₁⟩, fun {m} mn => hn₂ m mn (Nat.zero_le _)⟩, hn₁⟩
state_before: case intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
this :
  ∀ (a' : α),
    b ∈ PFun.fix f a' →
      ∀ (k : ℕ), Sum.inr a' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
n : ℕ
hn₁ : Sum.inl b ∈ F a n
hn₂ : ∀ (m : ℕ), m < n → 0 ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
⊢ ∃ n, ((∃ b', Sum.inl b' ∈ F a n) ∧ ∀ {m : ℕ}, m < n → ∃ b, Sum.inr b ∈ F a m) ∧ Sum.inl b ∈ F a n

tactic: simp
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
this :
  ∀ (a' : α),
    b ∈ PFun.fix f a' →
      ∀ (k : ℕ), Sum.inr a' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
⊢ Sum.inr a ∈ F a 0

tactic: refine' ⟨k.succ, _, fun m mk km => ⟨a₂, _⟩⟩
state_before: case refine'_2.inl
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂✝ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
h₂ : Sum.inl b ∈ f a₂
⊢ ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: simp
state_before: case refine'_2.inl.refine'_1
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂✝ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
h₂ : Sum.inl b ∈ f a₂
⊢ Sum.inl b ∈ F a (Nat.succ k)

tactic: exact Or.inr ⟨_, hk, h₂⟩
state_before: case refine'_2.inl.refine'_1
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂✝ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
h₂ : Sum.inl b ∈ f a₂
⊢ Sum.inl b ∈
      Nat.rec (Part.some (Sum.inr a))
        (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) k ∨
    ∃ b_1,
      Sum.inr b_1 ∈
          Nat.rec (Part.some (Sum.inr a))
            (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) k ∧
        Sum.inl b ∈ f b_1

tactic: rwa [le_antisymm (Nat.le_of_lt_succ mk) km]
state_before: case refine'_2.inl.refine'_2
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂✝ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
h₂ : Sum.inl b ∈ f a₂
m : ℕ
mk : m < Nat.succ k
km : k ≤ m
⊢ Sum.inr a₂ ∈ F a m

tactic: rcases IH _ am₃ k.succ (by simp; exact ⟨_, hk, am₃⟩) with ⟨n, hn₁, hn₂⟩
state_before: case refine'_2.inr.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
⊢ ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: simp
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
⊢ Sum.inr a₃ ∈ F a (Nat.succ k)

tactic: exact ⟨_, hk, am₃⟩
state_before: α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
⊢ ∃ b,
    Sum.inr b ∈
        Nat.rec (Part.some (Sum.inr a))
          (fun x IH => Part.bind IH fun s => Sum.rec (fun val => Part.some s) (fun val => f val) s) k ∧
      Sum.inr a₃ ∈ f b

tactic: refine' ⟨n, hn₁, fun m mn km => _⟩
state_before: case refine'_2.inr.intro.intro.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
n : ℕ
hn₁ : Sum.inl b ∈ F a n
hn₂ : ∀ (m : ℕ), m < n → Nat.succ k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
⊢ ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: cases' km.lt_or_eq_dec with km km
state_before: case refine'_2.inr.intro.intro.intro.intro
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
n : ℕ
hn₁ : Sum.inl b ∈ F a n
hn₂ : ∀ (m : ℕ), m < n → Nat.succ k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
m : ℕ
mn : m < n
km : k ≤ m
⊢ ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: exact hn₂ _ mn km
state_before: case refine'_2.inr.intro.intro.intro.intro.inl
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
n : ℕ
hn₁ : Sum.inl b ∈ F a n
hn₂ : ∀ (m : ℕ), m < n → Nat.succ k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
m : ℕ
mn : m < n
km✝ : k ≤ m
km : k < m
⊢ ∃ a₂, Sum.inr a₂ ∈ F a m

tactic: exact km ▸ ⟨_, hk⟩
state_before: case refine'_2.inr.intro.intro.intro.intro.inr
α✝ : Type ?u.236579
β : Type ?u.236582
γ : Type ?u.236585
σ✝ : Type ?u.236588
inst✝³ : Primcodable α✝
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ✝
α : Type u_1
σ : Type u_2
f : α →. σ ⊕ α
a : α
b : σ
F : α → ℕ →. σ ⊕ α :=
  fun a n =>
    Nat.rec (Part.some (Sum.inr a)) (fun x IH => Part.bind IH fun s => Sum.casesOn s (fun x => Part.some s) f) n
h : b ∈ PFun.fix f a
a₁ : α
h₁ : b ∈ PFun.fix f a₁
a₂ : α
h₂ : b ∈ PFun.fix f a₂
IH :
  ∀ (a'' : α),
    Sum.inr a'' ∈ f a₂ →
      ∀ (k : ℕ), Sum.inr a'' ∈ F a k → ∃ n, Sum.inl b ∈ F a n ∧ ∀ (m : ℕ), m < n → k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
k : ℕ
hk : Sum.inr a₂ ∈ F a k
a₃ : α
am₃ : Sum.inr a₃ ∈ f a₂
right✝ : b ∈ PFun.fix f a₃
n : ℕ
hn₁ : Sum.inl b ∈ F a n
hn₂ : ∀ (m : ℕ), m < n → Nat.succ k ≤ m → ∃ a₂, Sum.inr a₂ ∈ F a m
m : ℕ
mn : m < n
km✝ : k ≤ m
km : k = m
⊢ ∃ a₂, Sum.inr a₂ ∈ F a m