Theorem: MvPFunctor.liftP_iff'
File: Mathlib/Data/PFunctor/Multivariate/Basic.lean

tactic: simp only [liftP_iff, Sigma.mk.inj_iff]
state_before: n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
⊢ LiftP p { fst := a, snd := f } ↔ ∀ (i : Fin2 n) (x : B P a i), p (f i x)

tactic: constructor
state_before: n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
⊢ (∃ a_1 f_1, { fst := a, snd := f } = { fst := a_1, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P a_1 i), p (f_1 i j)) ↔
    ∀ (i : Fin2 n) (x : B P a i), p (f i x)

tactic: . intro
  repeat' first |constructor|assumption
state_before: case mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
⊢ (∀ (i : Fin2 n) (x : B P a i), p (f i x)) →
    ∃ a_2 f_1, { fst := a, snd := f } = { fst := a_2, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P a_2 i), p (f_1 i j)

tactic: rintro ⟨_, _, ⟨⟩, _⟩
state_before: case mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
⊢ (∃ a_1 f_1, { fst := a, snd := f } = { fst := a_1, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P a_1 i), p (f_1 i j)) →
    ∀ (i : Fin2 n) (x : B P a i), p (f i x)

tactic: assumption
state_before: case mp.intro.intro.intro.refl
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
right✝ : ∀ (i : Fin2 n) (j : B P a i), p (f i j)
⊢ ∀ (i : Fin2 n) (x : B P a i), p (f i x)

tactic: intro
state_before: case mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
⊢ (∀ (i : Fin2 n) (x : B P a i), p (f i x)) →
    ∃ a_2 f_1, { fst := a, snd := f } = { fst := a_2, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P a_2 i), p (f_1 i j)

tactic: repeat' first |constructor|assumption
state_before: case mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
a✝ : ∀ (i : Fin2 n) (x : B P a i), p (f i x)
⊢ ∃ a_1 f_1, { fst := a, snd := f } = { fst := a_1, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P a_1 i), p (f_1 i j)

tactic: first |constructor|assumption
state_before: case mpr.h.h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
a✝ : ∀ (i : Fin2 n) (x : B P a i), p (f i x)
⊢ ∀ (i : Fin2 n) (j : B P a i), p (f i j)

tactic: constructor
state_before: case mpr.h.h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
a✝ : ∀ (i : Fin2 n) (x : B P a i), p (f i x)
⊢ ∀ (i : Fin2 n) (j : B P a i), p (f i j)

tactic: assumption
state_before: case mpr.h.h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
a : P.A
f : B P a ⟹ α
a✝ : ∀ (i : Fin2 n) (x : B P a i), p (f i x)
⊢ ∀ (i : Fin2 n) (j : B P a i), p (f i j)