awhecmu/canonical-drafter-extract-mathlib huggingface dataset:
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
x y : P.M α
r : R x y
obtain :
  ∀ (a₁ : P.mp.A) (f₁ : P.mp.B a₁ ⟹ α) (r : R (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁) y),
    Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁ = y
⊢ x = y

Tactic:
obtain ⟨a₁, f₁⟩ := x
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
y : P.M α
a₁ : P.mp.A
f₁ : P.mp.B a₁ ⟹ α
r : R (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁) y
obtain :
  ∀ (a₂ : P.mp.A) (f₂ : P.mp.B a₂ ⟹ α)
    (r :
      R (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁)
        (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₂ f₂)),
    Eq (α := P.M α) (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁)
      (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₂ f₂)
⊢ Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) a₁ f₁ = y

Tactic:
obtain ⟨a₂, f₂⟩ := y
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
f₁ : P.mp.B a₁ ⟹ α
a₂ : P.mp.A
f₂ : P.mp.B a₂ ⟹ α
r :
  R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₂ f₂)
⊢ a₁ = a₂

Tactic:
PFunctor.M.bisim (fun a₁ a₂ => ∃ x y, R x y ∧ x.1 = a₁ ∧ y.1 = a₂) ?_ _ _
        ⟨⟨a₁, f₁⟩, ⟨a₂, f₂⟩, r, rfl, rfl⟩

Premises used: PFunctor.M, Exists, Sigma.fst, And, And.intro, Exists.intro, Sigma.mk, Eq, rfl, PFunctor.M.bisim
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
f₁ : P.mp.B a₁ ⟹ α
a₂ : P.mp.A
f₂ : P.mp.B a₂ ⟹ α
r :
  R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₂ f₂)
a₃ :
  ∀ (x y : P.last.M),
    (fun (a₁ a₂ : P.last.M) ↦
          ∃ (x : P.M α) (y : P.M α),
            R x y ∧
              x.fst (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) = a₁ ∧ y.fst (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) = a₂)
        x y →
      ∃ (a : P.last.A) (f : P.last.B a → P.last.M) (f' : P.last.B a → P.last.M),
        x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f ∧
          y.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f' ∧
            ∀ (i : P.last.B a),
              (fun (a₁ a₂ : P.last.M) ↦
                  ∃ (x : P.M α) (y : P.M α),
                    R x y ∧
                      x.fst (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) = a₁ ∧
                        y.fst (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) = a₂)
                (f i) (f' i)
⊢ a₁ = a₂

Tactic:
refine
      PFunctor.M.bisim (fun a₁ a₂ => ∃ x y, R x y ∧ x.1 = a₁ ∧ y.1 = a₂) ?_ _ _
        ⟨⟨a₁, f₁⟩, ⟨a₂, f₂⟩, r, rfl, rfl⟩

Premises used: Exists, Sigma.fst, And, And.intro, Exists.intro, Sigma.mk, Eq, rfl, PFunctor.M.bisim
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
f₁ : P.mp.B a₁ ⟹ α
a₂ : P.mp.A
f₂ : P.mp.B a₂ ⟹ α
r :
  R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₂ f₂)
⊢ a₁ = a₂

Tactic:
have : a₁ = a₂ := by
    refine
      PFunctor.M.bisim (fun a₁ a₂ => ∃ x y, R x y ∧ x.1 = a₁ ∧ y.1 = a₂) ?_ _ _
        ⟨⟨a₁, f₁⟩, ⟨a₂, f₂⟩, r, rfl, rfl⟩
    rintro _ _ ⟨⟨a₁, f₁⟩, ⟨a₂, f₂⟩, r, rfl, rfl⟩
    rcases h _ _ r with ⟨a', f', f₁', f₂', e₁, e₂, h'⟩
    rcases M.bisim_lemma P e₁ with ⟨g₁', e₁', rfl, rfl⟩
    rcases M.bisim_lemma P e₂ with ⟨g₂', e₂', _, rfl⟩
    rw [e₁', e₂']
    exact ⟨_, _, _, rfl, rfl, fun b => ⟨_, _, h' b, rfl, rfl⟩⟩
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
f₁ : P.mp.B a₁ ⟹ α
a₂ : P.mp.A
f₂ : P.mp.B a₂ ⟹ α
r :
  R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₂ f₂)
this : a₁ = a₂
subst :
  ∀ (f₂ : P.mp.B a₁ ⟹ α)
    (r :
      R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁)
        (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₂)),
    Eq (α := P.M α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁)
      (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₂)
⊢ Eq (α := P.M α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁)
    (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₂ f₂)

Tactic:
subst this
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
f₁ f₂ : P.mp.B a₁ ⟹ α
r :
  R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₂)
e_snd : ∀ (i : Fin2 n) (p : P.mp.B a₁ i), f₁ i p = f₂ i p
⊢ Eq (α := P.M α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₁)
    (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) a₁ f₂)

Tactic:
congr with (i p)
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
i_1 : Fin2 n
x : P.last.M
a : P.A
f : P.last.B a → P.last.M
h' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
i : Fin2 n
c : P.drop.B a i
f₁ f₂ : P.mp.B x ⟹ α
r : R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂)
e_snd :
  ∀ (a' : P.A) (f' : (P.B a').drop ⟹ (α ::: P.M α).drop) (f₁' f₂' : (P.B a').last → (α ::: P.M α).last)
    (e₁ :
      Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
        (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
        (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a' (splitFun (α := P.B a') (α' := α ::: P.M α) f' f₁')))
    (e₂ :
      Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
        (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
        (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a' (splitFun (α := P.B a') (α' := α ::: P.M α) f' f₂')))
    (h'' : ∀ (i : (P.B a').last), R (f₁' i) (f₂' i)), f₁ i (Path.root x a f h' i c) = f₂ i (Path.root x a f h' i c)
⊢ f₁ i (Path.root x a f h' i c) = f₂ i (Path.root x a f h' i c)

Tactic:
obtain ⟨a', f', f₁', f₂', e₁, e₂, h''⟩ := h _ _ r
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
i_1 : Fin2 n
x : P.last.M
a : P.A
f : P.last.B a → P.last.M
h' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
i : Fin2 n
c : P.drop.B a i
f₁ f₂ : P.mp.B x ⟹ α
r : R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂)
a' : P.A
f' : (P.B a').drop ⟹ (α ::: P.M α).drop
f₁' f₂' : (P.B a').last → (α ::: P.M α).last
e₁ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a' (splitFun (α := P.B a') (α' := α ::: P.M α) f' f₁'))
e₂ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a' (splitFun (α := P.B a') (α' := α ::: P.M α) f' f₂'))
h'' : ∀ (i : (P.B a').last), R (f₁' i) (f₂' i)
e_snd :
  ∀ (g₁' : P.last.B a' → P.last.M) (e₁' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a' g₁')
    (e₂ :
      Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
        (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
        (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a'
          (splitFun (α := P.B a') (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) f₂')))
    (h'' :
      ∀ (i : (P.B a').last),
        R
          ((fun (x_1 : P.last.B a') ↦
              (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₁' x_1) (pathDestRight P (α := α) e₁' f₁ x_1) :
                (a : P.mp.A) × P.mp.B a ⟹ α))
            i)
          (f₂' i))
    (e₁ :
      Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
        (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
        (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a'
          (splitFun (α := P.B a') (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a') ↦
            Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₁' x_1) (pathDestRight P (α := α) e₁' f₁ x_1)))),
    f₁ i (Path.root x a f h' i c) = f₂ i (Path.root x a f h' i c)
⊢ f₁ i (Path.root x a f h' i c) = f₂ i (Path.root x a f h' i c)

Tactic:
obtain ⟨g₁', e₁', rfl, rfl⟩ := M.bisim_lemma P e₁

Premises used: MvPFunctor.M.bisim_lemma, rfl
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
i_1 : Fin2 n
x : P.last.M
a : P.A
f : P.last.B a → P.last.M
h' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
i : Fin2 n
c : P.drop.B a i
f₁ f₂ : P.mp.B x ⟹ α
r : R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂)
g₂' : P.last.B a → P.last.M
e₂' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a g₂'
e₁' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
e₁ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1)))
e₃ : pathDestLeft P (α := α) e₁' f₁ = pathDestLeft P (α := α) e₂' f₂
e₂ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1)))
h'' :
  ∀ (i : (P.B a).last),
    R
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
⊢ x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f

Tactic:
cases h'.symm.trans e₂'

Premises used: Eq.symm, Eq.trans
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
i_1 : Fin2 n
x : P.last.M
a : P.A
f : P.last.B a → P.last.M
h' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
i : Fin2 n
c : P.drop.B a i
f₁ f₂ : P.mp.B x ⟹ α
r : R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂)
g₂' : P.last.B a → P.last.M
e₂' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a g₂'
e₁' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
e₁ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1)))
e₃ : pathDestLeft P (α := α) e₁' f₁ = pathDestLeft P (α := α) e₂' f₂
e₂ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1)))
h'' :
  ∀ (i : (P.B a).last),
    R
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
e₂'₁ : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
⊢ pathDestLeft P (α := α) e₁' f₁ = pathDestLeft P (α := α) e₂'₁ f₂

Tactic:
cases h'.symm.trans e₂'

Premises used: Eq.symm, Eq.trans
-- Module: Mathlib.Data.PFunctor.Multivariate.M
Goal:
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
R : P.M α → P.M α → Prop
h :
  ∀ (x y : P.M α),
    R x y →
      ∃ (a : P.A) (f : (P.B a).drop ⟹ (α ::: P.M α).drop) (f₁ : (P.B a).last → (α ::: P.M α).last) (f₂ :
        (P.B a).last → (α ::: P.M α).last),
        dest P (α := α) x =
            Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₁) ∧
          dest P (α := α) y =
              Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a (splitFun (α := P.B a) (α' := α ::: P.M α) f f₂) ∧
            ∀ (i : (P.B a).last), R (f₁ i) (f₂ i)
a₁ : P.mp.A
i_1 : Fin2 n
x : P.last.M
a : P.A
f : P.last.B a → P.last.M
h' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
i : Fin2 n
c : P.drop.B a i
f₁ f₂ : P.mp.B x ⟹ α
r : R (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂)
g₂' : P.last.B a → P.last.M
e₂' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a g₂'
e₁' : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
e₁ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₁))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1)))
e₃ : pathDestLeft P (α := α) e₁' f₁ = pathDestLeft P (α := α) e₂' f₂
e₂ :
  Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1)))
h'' :
  ∀ (i : (P.B a).last),
    R
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₁' f₁ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
      ((fun (x_1 : P.last.B a) ↦
          (Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (g₂' x_1) (pathDestRight P (α := α) e₂' f₂ x_1) :
            (a : P.mp.A) × P.mp.B a ⟹ α))
        i)
e₂'₁ : x.dest = Sigma.mk (β := fun (x : P.last.A) ↦ P.last.B x → P.last.M) a f
e₄ : pathDestLeft P (α := α) e₁' f₁ = pathDestLeft P (α := α) e₂'₁ f₂
⊢ Eq (α := (↑P : (α : TypeVec.{u} (n + 1)) → Type u) (α ::: P.M α))
    (dest P (α := α) (Sigma.mk (β := fun (a : P.last.M) ↦ Path P a ⟹ α) x f₂))
    (Sigma.mk (β := fun (a : P.A) ↦ P.B a ⟹ α ::: P.M α) a
      (splitFun (α := P.B a) (α' := α ::: P.M α) (pathDestLeft P (α := α) e₁' f₁) fun (x_1 : P.last.B a) ↦
        Sigma.mk (β := fun (a : P.mp.A) ↦ P.mp.B a ⟹ α) (f x_1) (pathDestRight P (α := α) e₂'₁ f₂ x_1)))

Tactic:
cases h'.symm.trans e₂'

Premises used: Eq.symm, Eq.trans