[GOAL]
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
f : α ⟹ β
x : Obj (const n A) α
⊢ get (f <$$> x) = get x
[PROOFSTEP]
cases x
[GOAL]
case mk
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
f : α ⟹ β
fst✝ : (const n A).A
snd✝ : B (const n A) fst✝ ⟹ α
⊢ get (f <$$> { fst := fst✝, snd := snd✝ }) = get { fst := fst✝, snd := snd✝ }
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
x : A
⊢ get (mk n x) = x
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
x : Obj (const n A) α
⊢ mk n (get x) = x
[PROOFSTEP]
cases x
[GOAL]
case mk
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
fst✝ : (const n A).A
snd✝ : B (const n A) fst✝ ⟹ α
⊢ mk n (get { fst := fst✝, snd := snd✝ }) = { fst := fst✝, snd := snd✝ }
[PROOFSTEP]
dsimp [const.get, const.mk]
[GOAL]
case mk
n m : ℕ
P : MvPFunctor n
A : Type u
α β : TypeVec n
fst✝ : (const n A).A
snd✝ : B (const n A) fst✝ ⟹ α
⊢ { fst := fst✝, snd := fun x a => PEmpty.elim a } = { fst := fst✝, snd := snd✝ }
[PROOFSTEP]
congr with (_⟨⟩)
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α β : TypeVec m
f : α ⟹ β
x : Obj (comp P Q) α
⊢ get (f <$$> x) = (fun i x => f <$$> x) <$$> get x
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α β : TypeVec m
x : Obj P fun i => Obj (Q i) α
⊢ get (mk x) = x
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α β : TypeVec m
x : Obj (comp P Q) α
⊢ mk (get x) = x
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
⊢ LiftP p x ↔ ∃ a f, x = { fst := a, snd := f } ∧ ∀ (i : Fin2 n) (j : B P a i), p (f i j)
[PROOFSTEP]
constructor
[GOAL]
case mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
⊢ LiftP p x → ∃ a f, x = { fst := a, snd := f } ∧ ∀ (i : Fin2 n) (j : B P a i), p (f i j)
[PROOFSTEP]
rintro ⟨y, hy⟩
[GOAL]
case mp.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
y : Obj P fun i => Subtype p
hy : (fun i => Subtype.val) <$$> y = x
⊢ ∃ a f, x = { fst := a, snd := f } ∧ ∀ (i : Fin2 n) (j : B P a i), p (f i j)
[PROOFSTEP]
cases' h : y with a f
[GOAL]
case mp.intro.mk
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
y : Obj P fun i => Subtype p
hy : (fun i => Subtype.val) <$$> y = x
a : P.A
f : B P a ⟹ fun i => Subtype p
h : y = { fst := a, snd := f }
⊢ ∃ a f, x = { fst := a, snd := f } ∧ ∀ (i : Fin2 n) (j : B P a i), p (f i j)
[PROOFSTEP]
refine' ⟨a, fun i j => (f i j).val, _, fun i j => (f i j).property⟩
[GOAL]
case mp.intro.mk
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
y : Obj P fun i => Subtype p
hy : (fun i => Subtype.val) <$$> y = x
a : P.A
f : B P a ⟹ fun i => Subtype p
h : y = { fst := a, snd := f }
⊢ x = { fst := a, snd := fun i j => ↑(f i j) }
[PROOFSTEP]
rw [← hy, h, map_eq]
[GOAL]
case mp.intro.mk
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
y : Obj P fun i => Subtype p
hy : (fun i => Subtype.val) <$$> y = x
a : P.A
f : B P a ⟹ fun i => Subtype p
h : y = { fst := a, snd := f }
⊢ { fst := a, snd := (fun i => Subtype.val) ⊚ f } = { fst := a, snd := fun i j => ↑(f i j) }
[PROOFSTEP]
rfl
[GOAL]
case mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
⊢ (∃ a f, x = { fst := a, snd := f } ∧ ∀ (i : Fin2 n) (j : B P a i), p (f i j)) → LiftP p x
[PROOFSTEP]
rintro ⟨a, f, xeq, pf⟩
[GOAL]
case mpr.intro.intro.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
a : P.A
f : B P a ⟹ α
xeq : x = { fst := a, snd := f }
pf : ∀ (i : Fin2 n) (j : B P a i), p (f i j)
⊢ LiftP p x
[PROOFSTEP]
use⟨a, fun i j => ⟨f i j, pf i j⟩⟩
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
a : P.A
f : B P a ⟹ α
xeq : x = { fst := a, snd := f }
pf : ∀ (i : Fin2 n) (j : B P a i), p (f i j)
⊢ (fun i => Subtype.val) <$$> { fst := a, snd := fun i j => { val := f i j, property := (_ : p (f i j)) } } = x
[PROOFSTEP]
rw [xeq]
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
p : ⦃i : Fin2 n⦄ → α i → Prop
x : Obj P α
a : P.A
f : B P a ⟹ α
xeq : x = { fst := a, snd := f }
pf : ∀ (i : Fin2 n) (j : B P a i), p (f i j)
⊢ (fun i => Subtype.val) <$$> { fst := a, snd := fun i j => { val := f i j, property := (_ : p (f i j)) } } =
    { fst := a, snd := f }
[PROOFSTEP]
rfl
[GOAL]
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)
[PROOFSTEP]
simp only [liftP_iff, Sigma.mk.inj_iff]
[GOAL]
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)
[PROOFSTEP]
constructor
[GOAL]
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)
[PROOFSTEP]
rintro ⟨_, _, ⟨⟩, _⟩
[GOAL]
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)
[PROOFSTEP]
assumption
[GOAL]
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)
[PROOFSTEP]
intro
[GOAL]
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)
[PROOFSTEP]
repeat'
  first
  | constructor
  | assumption
[GOAL]
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)
[PROOFSTEP]
first
| constructor
| assumption
[GOAL]
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)
[PROOFSTEP]
constructor
[GOAL]
case mpr.h
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)
⊢ ∃ f_1, { fst := a, snd := f } = { fst := ?mpr.w, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P ?mpr.w i), p (f_1 i j)
[PROOFSTEP]
first
| constructor
| assumption
[GOAL]
case mpr.h
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)
⊢ ∃ f_1, { fst := a, snd := f } = { fst := ?mpr.w, snd := f_1 } ∧ ∀ (i : Fin2 n) (j : B P ?mpr.w i), p (f_1 i j)
[PROOFSTEP]
constructor
[GOAL]
case mpr.h.h
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)
⊢ { fst := a, snd := f } = { fst := ?mpr.w, snd := ?mpr.h.w } ∧ ∀ (i : Fin2 n) (j : B P ?mpr.w i), p (?mpr.h.w i j)
[PROOFSTEP]
first
| constructor
| assumption
[GOAL]
case mpr.h.h
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)
⊢ { fst := a, snd := f } = { fst := ?mpr.w, snd := ?mpr.h.w } ∧ ∀ (i : Fin2 n) (j : B P ?mpr.w i), p (?mpr.h.w i j)
[PROOFSTEP]
constructor
[GOAL]
case mpr.h.h.left
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)
⊢ { fst := a, snd := f } = { fst := ?mpr.w, snd := ?mpr.h.w }
[PROOFSTEP]
first
| constructor
| assumption
[GOAL]
case mpr.h.h.left
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)
⊢ { fst := a, snd := f } = { fst := ?mpr.w, snd := ?mpr.h.w }
[PROOFSTEP]
constructor
[GOAL]
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)
[PROOFSTEP]
first
| constructor
| assumption
[GOAL]
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)
[PROOFSTEP]
constructor
[GOAL]
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)
[PROOFSTEP]
assumption
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
⊢ LiftR r x y ↔
    ∃ a f₀ f₁,
      x = { fst := a, snd := f₀ } ∧ y = { fst := a, snd := f₁ } ∧ ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
[PROOFSTEP]
constructor
[GOAL]
case mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
⊢ LiftR r x y →
    ∃ a f₀ f₁,
      x = { fst := a, snd := f₀ } ∧ y = { fst := a, snd := f₁ } ∧ ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
[PROOFSTEP]
rintro ⟨u, xeq, yeq⟩
[GOAL]
case mp.intro.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
⊢ ∃ a f₀ f₁,
    x = { fst := a, snd := f₀ } ∧ y = { fst := a, snd := f₁ } ∧ ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
[PROOFSTEP]
cases' h : u with a f
[GOAL]
case mp.intro.intro.mk
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ ∃ a f₀ f₁,
    x = { fst := a, snd := f₀ } ∧ y = { fst := a, snd := f₁ } ∧ ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
[PROOFSTEP]
use a, fun i j => (f i j).val.fst, fun i j => (f i j).val.snd
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ x = { fst := a, snd := fun i j => (↑(f i j)).fst } ∧
    y = { fst := a, snd := fun i j => (↑(f i j)).snd } ∧ ∀ (i : Fin2 n) (j : B P a i), r (↑(f i j)).fst (↑(f i j)).snd
[PROOFSTEP]
constructor
[GOAL]
case h.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ x = { fst := a, snd := fun i j => (↑(f i j)).fst }
[PROOFSTEP]
rw [← xeq, h]
[GOAL]
case h.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ (fun i t => (↑t).fst) <$$> { fst := a, snd := f } = { fst := a, snd := fun i j => (↑(f i j)).fst }
[PROOFSTEP]
rfl
[GOAL]
case h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ y = { fst := a, snd := fun i j => (↑(f i j)).snd } ∧ ∀ (i : Fin2 n) (j : B P a i), r (↑(f i j)).fst (↑(f i j)).snd
[PROOFSTEP]
constructor
[GOAL]
case h.right.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ y = { fst := a, snd := fun i j => (↑(f i j)).snd }
[PROOFSTEP]
rw [← yeq, h]
[GOAL]
case h.right.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ (fun i t => (↑t).snd) <$$> { fst := a, snd := f } = { fst := a, snd := fun i j => (↑(f i j)).snd }
[PROOFSTEP]
rfl
[GOAL]
case h.right.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
⊢ ∀ (i : Fin2 n) (j : B P a i), r (↑(f i j)).fst (↑(f i j)).snd
[PROOFSTEP]
intro i j
[GOAL]
case h.right.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
u : Obj P fun i => { p // r p.fst p.snd }
xeq : (fun i t => (↑t).fst) <$$> u = x
yeq : (fun i t => (↑t).snd) <$$> u = y
a : P.A
f : B P a ⟹ fun i => { p // r p.fst p.snd }
h : u = { fst := a, snd := f }
i : Fin2 n
j : B P a i
⊢ r (↑(f i j)).fst (↑(f i j)).snd
[PROOFSTEP]
exact (f i j).property
[GOAL]
case mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
⊢ (∃ a f₀ f₁,
      x = { fst := a, snd := f₀ } ∧ y = { fst := a, snd := f₁ } ∧ ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)) →
    LiftR r x y
[PROOFSTEP]
rintro ⟨a, f₀, f₁, xeq, yeq, h⟩
[GOAL]
case mpr.intro.intro.intro.intro.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ LiftR r x y
[PROOFSTEP]
use⟨a, fun i j => ⟨(f₀ i j, f₁ i j), h i j⟩⟩
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).fst) <$$>
        { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
      x ∧
    (fun i t => (↑t).snd) <$$>
        { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
      y
[PROOFSTEP]
dsimp
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).fst) <$$>
        { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
      x ∧
    (fun i t => (↑t).snd) <$$>
        { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
      y
[PROOFSTEP]
constructor
[GOAL]
case h.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).fst) <$$>
      { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
    x
[PROOFSTEP]
rw [xeq]
[GOAL]
case h.left
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).fst) <$$>
      { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
    { fst := a, snd := f₀ }
[PROOFSTEP]
rfl
[GOAL]
case h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).snd) <$$>
      { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
    y
[PROOFSTEP]
rw [yeq]
[GOAL]
case h.right
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
r : ⦃i : Fin2 n⦄ → α i → α i → Prop
x y : Obj P α
a : P.A
f₀ f₁ : B P a ⟹ α
xeq : x = { fst := a, snd := f₀ }
yeq : y = { fst := a, snd := f₁ }
h : ∀ (i : Fin2 n) (j : B P a i), r (f₀ i j) (f₁ i j)
⊢ (fun i t => (↑t).snd) <$$>
      { fst := a, snd := fun i j => { val := (f₀ i j, f₁ i j), property := (_ : r (f₀ i j) (f₁ i j)) } } =
    { fst := a, snd := f₁ }
[PROOFSTEP]
rfl
[GOAL]
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
⊢ supp { fst := a, snd := f } i = f i '' univ
[PROOFSTEP]
ext x
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
⊢ x ∈ supp { fst := a, snd := f } i ↔ x ∈ f i '' univ
[PROOFSTEP]
simp only [supp, image_univ, mem_range, mem_setOf_eq]
[GOAL]
case h
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
⊢ (∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x) ↔ ∃ y, f i y = x
[PROOFSTEP]
constructor
[GOAL]
case h.mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
⊢ (∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x) → ∃ y, f i y = x
[PROOFSTEP]
intro h
[GOAL]
case h.mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
⊢ (∃ y, f i y = x) → ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
[PROOFSTEP]
intro h
[GOAL]
case h.mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
⊢ ∃ y, f i y = x
[PROOFSTEP]
apply @h fun i x => ∃ y : P.B a i, f i y = x
[GOAL]
case h.mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
⊢ LiftP (fun i x => ∃ y, f i y = x) { fst := a, snd := f }
[PROOFSTEP]
rw [liftP_iff']
[GOAL]
case h.mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
⊢ ∀ (i : Fin2 n) (x : B P a i), ∃ y, f i y = f i x
[PROOFSTEP]
intros
[GOAL]
case h.mp
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
i✝ : Fin2 n
x✝ : B P a i✝
⊢ ∃ y, f i✝ y = f i✝ x✝
[PROOFSTEP]
refine' ⟨_, rfl⟩
[GOAL]
case h.mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∃ y, f i y = x
⊢ ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, LiftP P_1 { fst := a, snd := f } → P_1 i x
[PROOFSTEP]
simp only [liftP_iff']
[GOAL]
case h.mpr
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
h : ∃ y, f i y = x
⊢ ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, (∀ (i : Fin2 n) (x : B P a i), P_1 i (f i x)) → P_1 i x
[PROOFSTEP]
cases h
[GOAL]
case h.mpr.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
x : α i
w✝ : B P a i
h✝ : f i w✝ = x
⊢ ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, (∀ (i : Fin2 n) (x : B P a i), P_1 i (f i x)) → P_1 i x
[PROOFSTEP]
subst x
[GOAL]
case h.mpr.intro
n m : ℕ
P : MvPFunctor n
Q : Fin2 n → MvPFunctor m
α✝ β : TypeVec m
α : TypeVec n
a : P.A
f : B P a ⟹ α
i : Fin2 n
w✝ : B P a i
⊢ ∀ ⦃P_1 : (i : Fin2 n) → α i → Prop⦄, (∀ (i : Fin2 n) (x : B P a i), P_1 i (f i x)) → P_1 i (f i w✝)
[PROOFSTEP]
tauto
