# Polynomial functors #

This file defines polynomial functors and the W-type construction as a polynomial functor. (For the M-type construction, see pfunctor/M.lean.)

A polynomial functor `P`

is given by a type `A`

and a family `B`

of types over `A`

. `P`

maps
any type `α`

to a new type `P α`

, which is defined as the sigma type `Σ x, P.B x → α`

.

An element of `P α`

is a pair `⟨a, f⟩`

, where `a`

is an element of a type `A`

and
`f : B a → α`

. Think of `a`

as the shape of the object and `f`

as an index to the relevant
elements of `α`

.

## Instances For

## Equations

- PFunctor.instInhabited = { default := { A := default, B := default } }

## Equations

- PFunctor.instCoeFunForallType = { coe := PFunctor.Obj }

Applying `P`

to a morphism of `Type`

## Instances For

## Equations

- PFunctor.Obj.inhabited P = { default := ⟨default, default⟩ }

## Equations

- P.instFunctorObj = { map := @PFunctor.map P, mapConst := fun {α β : Type ?u.14} => P.map ∘ Function.const β }

We prefer `PFunctor.map`

to `Functor.map`

because it is universe-polymorphic.

re-export existing definition of W-types and adapt it to a packaged definition of polynomial functor

## Instances For

## Equations

- PFunctor.Idx.inhabited P = { default := ⟨default, default⟩ }

`x.iget i`

takes the component of `x`

designated by `i`

if any is or returns
a default value

## Instances For

functor composition for polynomial functors

## Equations

- P₂.comp P₁ = { A := (a₂ : P₂.A) × (P₂.B a₂ → P₁.A), B := fun (a₂a₁ : (a₂ : P₂.A) × (P₂.B a₂ → P₁.A)) => (u : P₂.B a₂a₁.fst) × P₁.B (a₂a₁.snd u) }

## Instances For

constructor for composition

## Equations

- PFunctor.comp.mk P₂ P₁ x = ⟨⟨x.fst, Sigma.fst ∘ x.snd⟩, fun (a₂a₁ : (P₂.comp P₁).B ⟨x.fst, Sigma.fst ∘ x.snd⟩) => (x.snd a₂a₁.fst).snd a₂a₁.snd⟩

## Instances For

destructor for composition

## Equations

- PFunctor.comp.get P₂ P₁ x = ⟨x.fst.fst, fun (a₂ : P₂.B x.fst.fst) => ⟨x.fst.snd a₂, fun (a₁ : P₁.B (x.fst.snd a₂)) => x.snd ⟨a₂, a₁⟩⟩⟩