Theorem: MvPFunctor.w_ind
File: Mathlib/Data/PFunctor/Multivariate/W.lean

tactic: intro x
state_before: n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
⊢ ∀ (x : P.W α), C x
state_after: n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
x : P.W α
⊢ C x

tactic: cases' x with a f
state_before: n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
x : P.W α
⊢ C x
state_after: case mk
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a : P.wp.A
f : P.wp.B a ⟹ α
⊢ C ⟨a, f⟩

tactic: apply @wp_ind n P α fun a f => C ⟨a, f⟩
state_before: case mk
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a : P.wp.A
f : P.wp.B a ⟹ α
⊢ C ⟨a, f⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a : P.wp.A
f : P.wp.B a ⟹ α
⊢ ∀ (a : P.A) (f : P.last.B a → P.last.W) (f' : P.WPath (WType.mk a f) ⟹ α),
    (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a f, f'⟩

tactic: intro a f f' ih'
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a : P.wp.A
f : P.wp.B a ⟹ α
⊢ ∀ (a : P.A) (f : P.last.B a → P.last.W) (f' : P.WPath (WType.mk a f) ⟹ α),
    (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩

tactic: dsimp [wMk] at ih
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih : ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α), (∀ (i : P.last.B a), C (f i)) → C (P.wMk a f' f)
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩

tactic: let ih'' := ih a (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) →
  C
    ⟨WType.mk a fun i => ⟨f i, P.wPathDestRight f' i⟩.fst,
      P.wPathCasesOn (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩.snd⟩ :=
  ih a (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩

tactic: dsimp at ih''
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) →
  C
    ⟨WType.mk a fun i => ⟨f i, P.wPathDestRight f' i⟩.fst,
      P.wPathCasesOn (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩.snd⟩ :=
  ih a (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) →
  C ⟨WType.mk a fun i => f i, P.wPathCasesOn (P.wPathDestLeft f') fun i => P.wPathDestRight f' i⟩ :=
  ih a (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩

tactic: rw [wPathCasesOn_eta] at ih''
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) →
  C ⟨WType.mk a fun i => f i, P.wPathCasesOn (P.wPathDestLeft f') fun i => P.wPathDestRight f' i⟩ :=
  ih a (P.wPathDestLeft f') fun i => ⟨f i, P.wPathDestRight f' i⟩
⊢ C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a fun i => f i, f'⟩
⊢ C ⟨WType.mk a f, f'⟩

tactic: apply ih''
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a fun i => f i, f'⟩
⊢ C ⟨WType.mk a f, f'⟩
state_after: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a fun i => f i, f'⟩
⊢ ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩

tactic: apply ih'
state_before: case mk.ih
n : ℕ
P : MvPFunctor.{u} (n + 1)
α : TypeVec.{u} n
C : P.W α → Prop
ih :
  ∀ (a : P.A) (f' : P.drop.B a ⟹ α) (f : P.last.B a → P.W α),
    (∀ (i : P.last.B a), C (f i)) → C ⟨WType.mk a fun i => (f i).fst, P.wPathCasesOn f' fun i => (f i).snd⟩
a✝ : P.wp.A
f✝ : P.wp.B a✝ ⟹ α
a : P.A
f : P.last.B a → P.last.W
f' : P.WPath (WType.mk a f) ⟹ α
ih' : ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
ih'' : (∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩) → C ⟨WType.mk a fun i => f i, f'⟩
⊢ ∀ (i : P.last.B a), C ⟨f i, P.wPathDestRight f' i⟩
state_after: no goals