Theorem: PFun.fixInduction'_fwd
File: Mathlib/Data/PFun.lean

tactic: unfold fixInduction'
state_before: α : Type u_2
β : Type u_3
γ : Type ?u.34568
δ : Type ?u.34571
ε : Type ?u.34574
ι : Type ?u.34577
C : α → Sort u_1
f : α →. β ⊕ α
b : β
a a' : α
h : b ∈ fix f a
h' : b ∈ fix f a'
fa : Sum.inr a' ∈ f a
hbase : (a_final : α) → Sum.inl b ∈ f a_final → C a_final
hind : (a₀ a₁ : α) → b ∈ fix f a₁ → Sum.inr a₁ ∈ f a₀ → C a₁ → C a₀
⊢ fixInduction' h hbase hind = hind a a' h' fa (fixInduction' h' hbase hind)

tactic: rw [fixInduction_spec]
state_before: α : Type u_2
β : Type u_3
γ : Type ?u.34568
δ : Type ?u.34571
ε : Type ?u.34574
ι : Type ?u.34577
C : α → Sort u_1
f : α →. β ⊕ α
b : β
a a' : α
h : b ∈ fix f a
h' : b ∈ fix f a'
fa : Sum.inr a' ∈ f a
hbase : (a_final : α) → Sum.inl b ∈ f a_final → C a_final
hind : (a₀ a₁ : α) → b ∈ fix f a₁ → Sum.inr a₁ ∈ f a₀ → C a₁ → C a₀
⊢ (fixInduction h fun a' h ih =>
      Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → C a') (Part.get (f a') (_ : (f a').Dom))
        (fun b' e =>
          let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
          hbase a' (_ : Sum.inl b ∈ f a'))
        (fun a'' e =>
          let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
          hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
        (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom))) =
    hind a a' h' fa
      (fixInduction h' fun a' h ih =>
        Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → (fun x => C x) a')
          (Part.get (f a') (_ : (f a').Dom))
          (fun b' e =>
            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
            hbase a' (_ : Sum.inl b ∈ f a'))
          (fun a'' e =>
            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
            hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
          (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom)))

tactic: refine' Eq.rec (motive := fun x e =>
    Sum.casesOn (motive := fun y => (f a).get (dom_of_mem_fix h) = y → C a) x _ _
    (Eq.trans (Part.get_eq_of_mem fa (dom_of_mem_fix h)) e) = _) _
  (Part.get_eq_of_mem fa (dom_of_mem_fix h)).symm
state_before: α : Type u_2
β : Type u_3
γ : Type ?u.34568
δ : Type ?u.34571
ε : Type ?u.34574
ι : Type ?u.34577
C : α → Sort u_1
f : α →. β ⊕ α
b : β
a a' : α
h : b ∈ fix f a
h' : b ∈ fix f a'
fa : Sum.inr a' ∈ f a
hbase : (a_final : α) → Sum.inl b ∈ f a_final → C a_final
hind : (a₀ a₁ : α) → b ∈ fix f a₁ → Sum.inr a₁ ∈ f a₀ → C a₁ → C a₀
⊢ Sum.casesOn (motive := fun x => Part.get (f a) (_ : (f a).Dom) = x → C a) (Part.get (f a) (_ : (f a).Dom))
      (fun b' e =>
        let_fun e := (_ : ∃ h, Part.get (f a) h = Sum.inl b');
        hbase a (_ : Sum.inl b ∈ f a))
      (fun a'' e =>
        let_fun e := (_ : ∃ h, Part.get (f a) h = Sum.inr a'');
        hind a a'' (_ : b ∈ fix f a'') e
          ((fun a' h' =>
              fixInduction (_ : b ∈ fix f a') fun a' h ih =>
                Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → C a')
                  (Part.get (f a') (_ : (f a').Dom))
                  (fun b' e =>
                    let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
                    hbase a' (_ : Sum.inl b ∈ f a'))
                  (fun a'' e =>
                    let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
                    hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
                  (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom)))
            a'' e))
      (_ : Part.get (f a) (_ : (f a).Dom) = Part.get (f a) (_ : (f a).Dom)) =
    hind a a' h' fa
      (fixInduction h' fun a' h ih =>
        Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → (fun x => C x) a')
          (Part.get (f a') (_ : (f a').Dom))
          (fun b' e =>
            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
            hbase a' (_ : Sum.inl b ∈ f a'))
          (fun a'' e =>
            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
            hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
          (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom)))

tactic: simp
state_before: α : Type u_2
β : Type u_3
γ : Type ?u.34568
δ : Type ?u.34571
ε : Type ?u.34574
ι : Type ?u.34577
C : α → Sort u_1
f : α →. β ⊕ α
b : β
a a' : α
h : b ∈ fix f a
h' : b ∈ fix f a'
fa : Sum.inr a' ∈ f a
hbase : (a_final : α) → Sum.inl b ∈ f a_final → C a_final
hind : (a₀ a₁ : α) → b ∈ fix f a₁ → Sum.inr a₁ ∈ f a₀ → C a₁ → C a₀
⊢ (fun x e =>
      Sum.casesOn (motive := fun y => Part.get (f a) (_ : (f a).Dom) = y → C a) x
          (fun val =>
            (fun b' e =>
                let_fun e := (_ : ∃ h, Part.get (f a) h = Sum.inl b');
                hbase a (_ : Sum.inl b ∈ f a))
              val)
          (fun val =>
            (fun a'' e =>
                let_fun e := (_ : ∃ h, Part.get (f a) h = Sum.inr a'');
                hind a a'' (_ : b ∈ fix f a'') e
                  ((fun a' h' =>
                      fixInduction (_ : b ∈ fix f a') fun a' h ih =>
                        Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → C a')
                          (Part.get (f a') (_ : (f a').Dom))
                          (fun b' e =>
                            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
                            hbase a' (_ : Sum.inl b ∈ f a'))
                          (fun a'' e =>
                            let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
                            hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
                          (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom)))
                    a'' e))
              val)
          (_ : Part.get (f a) (_ : (f a).Dom) = x) =
        hind a a' h' fa
          (fixInduction h' fun a' h ih =>
            Sum.casesOn (motive := fun x => Part.get (f a') (_ : (f a').Dom) = x → (fun x => C x) a')
              (Part.get (f a') (_ : (f a').Dom))
              (fun b' e =>
                let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inl b');
                hbase a' (_ : Sum.inl b ∈ f a'))
              (fun a'' e =>
                let_fun e := (_ : ∃ h, Part.get (f a') h = Sum.inr a'');
                hind a' a'' (_ : b ∈ fix f a'') e (ih a'' e))
              (_ : Part.get (f a') (_ : (f a').Dom) = Part.get (f a') (_ : (f a').Dom))))
    (Sum.inr a') (_ : Sum.inr a' = Sum.inr a')