-- Lean 4 proof step from Mathlib.Data.PFunctor.Univariate.M (goal)
Goal:
F : PFunctor.{uA, uB}
R : F.M → F.M → Prop
inst : Inhabited F.M
inst_1 : DecidableEq F.A
bisim : IsBisimulation R
ps : List F.Idx
ps_ih :
  ∀ (a : F.A) (f f' : F.B a → F.M)
    (h₀ :
      R (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f))
        (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f')))
    (hh :
      IsPath ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) ∨
        IsPath ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))),
    (isubtree ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f))).head =
        (isubtree ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))).head ∧
      ∃ (a_1 : F.A) (f_1 : F.B a_1 → F.M) (f'_1 : F.B a_1 → F.M),
        isubtree ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) =
            M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f_1) ∧
          isubtree ps (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f')) =
              M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f'_1) ∧
            ∀ (i : F.B a_1), R (f_1 i) (f'_1 i)
a : F.A
f f' : F.B a → F.M
h₀ :
  R (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))
i : F.B a
hh :
  IsPath (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps) (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) ∨
    IsPath (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps) (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))
h₁ : R (f i) (f' i)
⊢ (isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
          (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f))).head =
      (isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
          (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))).head ∧
    ∃ (a_1 : F.A) (f_1 : F.B a_1 → F.M) (f'_1 : F.B a_1 → F.M),
      isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
            (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) =
          M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f_1) ∧
        isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
              (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f')) =
            M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f'_1) ∧
          ∀ (i : F.B a_1), R (f_1 i) (f'_1 i)
have f₁ : ∀ (a₀ : F.A) (f₀ : F.B a₀ → F.M) (h : f i = M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a₀ f₀)),
  (isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
          (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f))).head =
      (isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
          (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f'))).head ∧
    ∃ (a_1 : F.A) (f_1 : F.B a_1 → F.M) (f'_1 : F.B a_1 → F.M),
      isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
            (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f)) =
          M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f_1) ∧
        isubtree (Sigma.mk (β := fun (x : F.A) ↦ F.B x) a i :: ps)
              (M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a f')) =
            M.mk (Sigma.mk (β := fun (x : F.A) ↦ F.B x → F.M) a_1 f'_1) ∧
          ∀ (i : F.B a_1), R (f_1 i) (f'_1 i)
Tactic: induction h : f i using PFunctor.M.casesOn' with | _ a₀ f₀