# mathlibdocumentation

data.pfunctor.multivariate.basic

# Multivariate polynomial functors. #

Multivariate polynomial functors are used for defining M-types and W-types. They map a type vector α to the type Σ a : A, B a ⟹ α, with A : Type and B : A → typevec n. They interact well with Lean's inductive definitions because they guarantee that occurrences of α are positive.

structure mvpfunctor (n : ) :
Type (u+1)
• A : Type ?
• B : self.A

multivariate polynomial functors

Instances for mvpfunctor
def mvpfunctor.obj {n : } (P : mvpfunctor n) (α : typevec n) :
Type u

Applying P to an object of Type

Equations
Instances for mvpfunctor.obj
def mvpfunctor.map {n : } (P : mvpfunctor n) {α β : typevec n} (f : α.arrow β) :
P.obj αP.obj β

Applying P to a morphism of Type

Equations
• P.map f = λ (_x : P.obj α), mvpfunctor.map._match_1 P f _x
• mvpfunctor.map._match_1 P f a, g⟩ = a, g
@[protected, instance]
def mvpfunctor.inhabited {n : } :
Equations
@[protected, instance]
def mvpfunctor.obj.inhabited {n : } (P : mvpfunctor n) {α : typevec n} [inhabited P.A] [Π (i : fin2 n), inhabited (α i)] :
inhabited (P.obj α)
Equations
@[protected, instance]
def mvpfunctor.obj.mvfunctor {n : } (P : mvpfunctor n) :
Equations
theorem mvpfunctor.map_eq {n : } (P : mvpfunctor n) {α β : typevec n} (g : α.arrow β) (a : P.A) (f : (P.B a).arrow α) :
a, f⟩ = a, f
theorem mvpfunctor.id_map {n : } (P : mvpfunctor n) {α : typevec n} (x : P.obj α) :
theorem mvpfunctor.comp_map {n : } (P : mvpfunctor n) {α β γ : typevec n} (f : α.arrow β) (g : β.arrow γ) (x : P.obj α) :
x = x)
@[protected, instance]
def mvpfunctor.const (n : ) (A : Type u) :

Constant functor where the input object does not affect the output

Equations
def mvpfunctor.const.mk (n : ) {A : Type u} (x : A) {α : typevec n} :
A).obj α

Constructor for the constant functor

Equations
• = x, λ (i : fin2 n) (a : A).B x i),
def mvpfunctor.const.get {n : } {A : Type u} {α : typevec n} (x : A).obj α) :
A

Destructor for the constant functor

Equations
@[simp]
theorem mvpfunctor.const.get_map {n : } {A : Type u} {α β : typevec n} (f : α.arrow β) (x : A).obj α) :
@[simp]
theorem mvpfunctor.const.get_mk {n : } {A : Type u} {α : typevec n} (x : A) :
@[simp]
theorem mvpfunctor.const.mk_get {n : } {A : Type u} {α : typevec n} (x : A).obj α) :
def mvpfunctor.comp {n m : } (P : mvpfunctor n) (Q : fin2 n) :

Functor composition on polynomial functors

Equations
• P.comp Q = {A := Σ (a₂ : P.A), Π (i : fin2 n), P.B a₂ i(Q i).A, B := λ (a : Σ (a₂ : P.A), Π (i : fin2 n), P.B a₂ i(Q i).A) (i : fin2 m), Σ (j : fin2 n) (b : P.B a.fst j), (Q j).B (a.snd j b) i}
def mvpfunctor.comp.mk {n m : } {P : mvpfunctor n} {Q : fin2 n} {α : typevec m} (x : P.obj (λ (i : fin2 n), (Q i).obj α)) :
(P.comp Q).obj α

Constructor for functor composition

Equations
def mvpfunctor.comp.get {n m : } {P : mvpfunctor n} {Q : fin2 n} {α : typevec m} (x : (P.comp Q).obj α) :
P.obj (λ (i : fin2 n), (Q i).obj α)

Destructor for functor composition

Equations
theorem mvpfunctor.comp.get_map {n m : } {P : mvpfunctor n} {Q : fin2 n} {α β : typevec m} (f : α.arrow β) (x : (P.comp Q).obj α) :
= mvfunctor.map (λ (i : fin2 n) (x : (Q i).obj α), x)
@[simp]
theorem mvpfunctor.comp.get_mk {n m : } {P : mvpfunctor n} {Q : fin2 n} {α : typevec m} (x : P.obj (λ (i : fin2 n), (Q i).obj α)) :
@[simp]
theorem mvpfunctor.comp.mk_get {n m : } {P : mvpfunctor n} {Q : fin2 n} {α : typevec m} (x : (P.comp Q).obj α) :
theorem mvpfunctor.liftp_iff {n : } {P : mvpfunctor n} {α : typevec n} (p : Π ⦃i : fin2 n⦄, α i → Prop) (x : P.obj α) :
∃ (a : P.A) (f : (P.B a).arrow α), x = a, f⟩ ∀ (i : fin2 n) (j : P.B a i), p (f i j)
theorem mvpfunctor.liftp_iff' {n : } {P : mvpfunctor n} {α : typevec n} (p : Π ⦃i : fin2 n⦄, α i → Prop) (a : P.A) (f : (P.B a).arrow α) :
a, f⟩ ∀ (i : fin2 n) (x : P.B a i), p (f i x)
theorem mvpfunctor.liftr_iff {n : } {P : mvpfunctor n} {α : typevec n} (r : Π ⦃i : fin2 n⦄, α iα i → Prop) (x y : P.obj α) :
y ∃ (a : P.A) (f₀ f₁ : (P.B a).arrow α), x = a, f₀⟩ y = a, f₁⟩ ∀ (i : fin2 n) (j : P.B a i), r (f₀ i j) (f₁ i j)
theorem mvpfunctor.supp_eq {n : } {P : mvpfunctor n} {α : typevec n} (a : P.A) (f : (P.B a).arrow α) (i : fin2 n) :
def mvpfunctor.drop {n : } (P : mvpfunctor (n + 1)) :

Split polynomial functor, get a n-ary functor from a n+1-ary functor

Equations
def mvpfunctor.last {n : } (P : mvpfunctor (n + 1)) :

Split polynomial functor, get a univariate functor from a n+1-ary functor

Equations
@[reducible]
def mvpfunctor.append_contents {n : } (P : mvpfunctor (n + 1)) {α : typevec n} {β : Type u_1} {a : P.A} (f' : (P.drop.B a).arrow α) (f : P.last.B a → β) :
(P.B a).arrow ::: β)

append arrows of a polynomial functor application

Equations