Multivariable polynomial functors

Content created by Fredrik Bakke.

Created on 2025-08-07.
Last modified on 2025-08-07.

module trees.multivariable-polynomial-functors where
Imports
open import foundation.binary-homotopies
open import foundation.dependent-pair-types
open import foundation.equality-dependent-function-types
open import foundation.equality-dependent-pair-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.structure-identity-principle
open import foundation.transport-along-identifications
open import foundation.type-arithmetic-unit-type
open import foundation.unit-type
open import foundation.universal-property-identity-types
open import foundation.universe-levels

open import foundation-core.commuting-squares-of-maps
open import foundation-core.commuting-triangles-of-maps
open import foundation-core.retractions
open import foundation-core.torsorial-type-families

Idea

Multivariable polynomial functors are a generalization of the notion of polynomial endofunctors to the case of families of types (variables). Given a type family A : J → Type and a type family B : I → {j : J} → A j → Type over A, we have a multivariable polynomial functor 𝑃 A B with action on type families given by

  𝑃 A B X j := Σ (a : A j), ((i : I) → B i a → X i).

Definitions

The type of multivariable polynomial functors

polynomial-functor :
  {l1 l2 : Level} (l3 l4 : Level) 
  UU l1  UU l2  UU (l1  l2  lsuc l3  lsuc l4)
polynomial-functor l3 l4 I J =
  Σ (J  UU l3)  A  (I  {j : J}  A j  UU l4))

module _
  {l1 l2 l3 l4 : Level} {I : UU l1} {J : UU l2}
  (𝑃 : polynomial-functor l3 l4 I J)
  where

  shape-polynomial-functor : J  UU l3
  shape-polynomial-functor = pr1 𝑃

  position-polynomial-functor :
    I  {j : J}  shape-polynomial-functor j  UU l4
  position-polynomial-functor = pr2 𝑃

The action on type families of a multivariable polynomial functor

module _
  {l1 l2 l3 l4 l5 : Level} {I : UU l1} {J : UU l2}
  where

  type-polynomial-functor' :
    (A : J  UU l3) (B : I  {j : J}  A j  UU l4) 
    (I  UU l5)  (J  UU (l1  l3  l4  l5))
  type-polynomial-functor' A B X j =
    Σ (A j)  a  (i : I)  B i a  X i)

  type-polynomial-functor :
    (𝑃 : polynomial-functor l3 l4 I J) 
    (I  UU l5)  (J  UU (l1  l3  l4  l5))
  type-polynomial-functor (A , B) =
    type-polynomial-functor' A B

Characterizing equality in type-polynomial-functor

module _
  {l1 l2 l3 l4 l5 : Level}
  {I : UU l1} {J : UU l2}
  {𝑃@(A , B) : polynomial-functor l3 l4 I J}
  {X : I  UU l5}
  where

  Eq-type-polynomial-functor :
    (x y : (j : J)  type-polynomial-functor 𝑃 X j) 
    UU (l1  l2  l3  l4  l5)
  Eq-type-polynomial-functor x y =
    (j : J) 
    Σ ( pr1 (x j)  pr1 (y j))
      ( λ p 
        (i : I) 
        coherence-triangle-maps (pr2 (x j) i) (pr2 (y j) i) (tr (B i {j}) p))

  refl-Eq-type-polynomial-functor :
    (x : (j : J)  type-polynomial-functor 𝑃 X j) 
    Eq-type-polynomial-functor x x
  refl-Eq-type-polynomial-functor x j = (refl ,  i  refl-htpy))

  Eq-eq-type-polynomial-functor :
    (x y : (j : J)  type-polynomial-functor 𝑃 X j) 
    x  y  Eq-type-polynomial-functor x y
  Eq-eq-type-polynomial-functor x .x refl =
    refl-Eq-type-polynomial-functor x

  abstract
    is-torsorial-Eq-type-polynomial-functor :
      (x : (j : J)  type-polynomial-functor 𝑃 X j) 
      is-torsorial (Eq-type-polynomial-functor x)
    is-torsorial-Eq-type-polynomial-functor x =
      is-torsorial-Eq-Π
        ( λ j 
          is-torsorial-Eq-structure
            { D =
              λ a y p 
              (i : I) 
              coherence-triangle-maps (pr2 (x j) i) (y i) (tr (B i {j}) p)}
            ( is-torsorial-Id (pr1 (x j)))
            ( pr1 (x j) , refl)
            ( is-torsorial-binary-htpy (pr2 (x j))))

  abstract
    is-equiv-Eq-eq-type-polynomial-functor :
      (x y : (j : J)  type-polynomial-functor 𝑃 X j) 
      is-equiv (Eq-eq-type-polynomial-functor x y)
    is-equiv-Eq-eq-type-polynomial-functor x =
      fundamental-theorem-id
        ( is-torsorial-Eq-type-polynomial-functor x)
        ( Eq-eq-type-polynomial-functor x)

  eq-Eq-type-polynomial-functor :
    (x y : (j : J)  type-polynomial-functor 𝑃 X j) 
    Eq-type-polynomial-functor x y  x  y
  eq-Eq-type-polynomial-functor x y =
    map-inv-is-equiv (is-equiv-Eq-eq-type-polynomial-functor x y)

  is-retraction-eq-Eq-type-polynomial-functor :
    (x y : (j : J)  type-polynomial-functor 𝑃 X j) 
    is-retraction
      ( Eq-eq-type-polynomial-functor x y)
      ( eq-Eq-type-polynomial-functor x y)
  is-retraction-eq-Eq-type-polynomial-functor x y =
    is-retraction-map-inv-is-equiv
      ( is-equiv-Eq-eq-type-polynomial-functor x y)

  coh-refl-eq-Eq-type-polynomial-functor :
    (x : (j : J)  type-polynomial-functor 𝑃 X j) 
    ( eq-Eq-type-polynomial-functor x x
      ( refl-Eq-type-polynomial-functor x))  refl
  coh-refl-eq-Eq-type-polynomial-functor x =
    is-retraction-eq-Eq-type-polynomial-functor x x refl

An action on dependent functions of multivariable polynomial functors

The following construction is not quite right for “the” action on dependent functions, since given a type family Y over a type family X, the construction gives only a dependent function of approximately type

  (x : 𝑃 X) → 𝑃 (Σ B Y x)

rather than

  (x : 𝑃 X) → 𝑃 (Y x).
module _
  {l1 l2 l3 l4 l5 l6 : Level} {I : UU l1} {J : UU l2}
  where

  dmap-Σ-polynomial-functor' :
    (A : J  UU l3) (B : I  {j : J}  A j  UU l4)
    {X : I  UU l5} {Y : (i : I)  X i  UU l6}
    (f : (i : I) (x : X i)  Y i x) 
    (x : (j : J)  type-polynomial-functor' A B X j) 
    (j : J) 
    type-polynomial-functor' A B
      ( λ i  Σ (B i (pr1 (x j))) (Y i  pr2 (x j) i))
      ( j)
  dmap-Σ-polynomial-functor' A B f x j =
    ( pr1 (x j) ,  i b  (b , f i (pr2 (x j) i b))))

The action on functions of multivariable polynomial functors

module _
  {l1 l2 l3 l4 l5 l6 : Level} {I : UU l1} {J : UU l2}
  where

  map-polynomial-functor' :
    (A : J  UU l3) (B : I  {j : J}  A j  UU l4)
    {X : I  UU l5} {Y : I  UU l6}
    (f : (i : I)  X i  Y i) 
    (j : J) 
    type-polynomial-functor' A B X j  type-polynomial-functor' A B Y j
  map-polynomial-functor' A B f j (a , x) = (a ,  i b  f i (x i b)))

  map-polynomial-functor :
    (𝑃 : polynomial-functor l3 l4 I J)
    {X : I  UU l5} {Y : I  UU l6}
    (f : (i : I)  X i  Y i) 
    (j : J)  type-polynomial-functor 𝑃 X j  type-polynomial-functor 𝑃 Y j
  map-polynomial-functor (A , B) = map-polynomial-functor' A B

The action on homotopies of multivariable polynomial functors

module _
  {l1 l2 l3 l4 l5 l6 : Level} {I : UU l1} {J : UU l2}
  where

  binary-htpy-polynomial-functor' :
    (A : J  UU l3) (B : I  {j : J}  A j  UU l4)
    {X : I  UU l5} {Y : I  UU l6} {f g : (i : I)  X i  Y i} 
    binary-htpy f g 
    binary-htpy (map-polynomial-functor' A B f) (map-polynomial-functor' A B g)
  binary-htpy-polynomial-functor' A B H j x =
    eq-pair-eq-fiber (eq-binary-htpy _ _  i  H i  pr2 x i))

  binary-htpy-polynomial-functor :
    (𝑃 : polynomial-functor l3 l4 I J)
    {X : I  UU l5} {Y : I  UU l6} {f g : (i : I)  X i  Y i} 
    binary-htpy f g 
    binary-htpy (map-polynomial-functor 𝑃 f) (map-polynomial-functor 𝑃 g)
  binary-htpy-polynomial-functor (A , B) = binary-htpy-polynomial-functor' A B

The identity multivariable polynomial functor

module _
  {l1 : Level} {I : UU l1}
  where

  id-polynomial-functor : polynomial-functor lzero l1 I I
  id-polynomial-functor =  i'  unit) ,  i {i'} *  (i'  i))

  compute-type-id-polynomial-functor :
    {l2 : Level} (X : I  UU l2) (i : I) 
    type-polynomial-functor id-polynomial-functor X i  X i
  compute-type-id-polynomial-functor X i =
    equivalence-reasoning
      Σ unit  *  (i' : I)  i  i'  X i')
       ((i' : I)  i  i'  X i')
        by left-unit-law-Σ  *  (i' : I)  i  i'  X i')
       X i
        by equiv-ev-refl i

  map-compute-type-id-polynomial-functor :
    {l2 : Level} (X : I  UU l2) (i : I) 
    type-polynomial-functor id-polynomial-functor X i  X i
  map-compute-type-id-polynomial-functor X i =
    map-equiv (compute-type-id-polynomial-functor X i)

  coh-map-id-polynomial-functor :
    {l2 l3 : Level} {X : I  UU l2} {Y : I  UU l3} (f : (i : I)  X i  Y i)
    (i : I) 
    coherence-square-maps
      ( map-compute-type-id-polynomial-functor X i)
      ( map-polynomial-functor id-polynomial-functor f i)
      ( f i)
      ( map-compute-type-id-polynomial-functor Y i)
  coh-map-id-polynomial-functor f i = refl-htpy

Composition of multivariable polynomial functors

Given two multivariable polynomial functors 𝑃 A B : (I → Type) → (J → Type) and 𝑃 C D : (J → Type) → (K → Type), then the composite functor 𝑃 C D ∘ 𝑃 A B is again a polynomial functor.

module _
  {l1 l2 l3 l4 l5 l6 l7 : Level}
  {I : UU l1} {J : UU l2} {K : UU l3}
  (𝑄@(C , D) : polynomial-functor l6 l7 J K)
  (𝑃@(A , B) : polynomial-functor l4 l5 I J)
  where

  shape-comp-polynomial-functor : K  UU (l2  l4  l6  l7)
  shape-comp-polynomial-functor k =
    Σ (C k)  c  (j : J)  D j {k} c  A j)

  position-comp-polynomial-functor :
    I  {k : K}  shape-comp-polynomial-functor k  UU (l2  l5  l7)
  position-comp-polynomial-functor i {k} (c , a) =
    Σ J  j  Σ (D j {k} c)  d  B i {j} (a j d)))

  comp-polynomial-functor :
    polynomial-functor (l2  l4  l6  l7) (l2  l5  l7) I K
  comp-polynomial-functor =
    ( shape-comp-polynomial-functor , position-comp-polynomial-functor)

  map-compute-type-comp-polynomial-functor :
    {l8 : Level} (X : I  UU l8) (k : K) 
    type-polynomial-functor comp-polynomial-functor X k 
    type-polynomial-functor 𝑄 (type-polynomial-functor 𝑃 X) k
  map-compute-type-comp-polynomial-functor X k ((c , a) , x) =
    (c ,  j d  (a j d ,  i b  x i (j , d , b)))))

  map-inv-compute-type-comp-polynomial-functor :
    {l8 : Level} (X : I  UU l8) (k : K) 
    type-polynomial-functor 𝑄 (type-polynomial-functor 𝑃 X) k 
    type-polynomial-functor comp-polynomial-functor X k
  map-inv-compute-type-comp-polynomial-functor X k (c , q) =
    ((c ,  j d  pr1 (q j d))) ,  i (j , d , b)  pr2 (q j d) i b))

  is-equiv-map-compute-type-comp-polynomial-functor :
    {l8 : Level} (X : I  UU l8) (k : K) 
    is-equiv (map-compute-type-comp-polynomial-functor X k)
  is-equiv-map-compute-type-comp-polynomial-functor X k =
    is-equiv-is-invertible
      ( map-inv-compute-type-comp-polynomial-functor X k)
      ( refl-htpy)
      ( refl-htpy)

  compute-type-comp-polynomial-functor :
    {l8 : Level} (X : I  UU l8) (k : K) 
    type-polynomial-functor comp-polynomial-functor X k 
    type-polynomial-functor 𝑄 (type-polynomial-functor 𝑃 X) k
  compute-type-comp-polynomial-functor X k =
    ( map-compute-type-comp-polynomial-functor X k ,
      is-equiv-map-compute-type-comp-polynomial-functor X k)

  coh-map-comp-polynomial-functor :
    {l8 l9 : Level} {X : I  UU l8} {Y : I  UU l9}
    (f : (i : I)  X i  Y i) (k : K) 
    coherence-square-maps
      ( map-compute-type-comp-polynomial-functor X k)
      ( map-polynomial-functor comp-polynomial-functor f k)
      ( map-polynomial-functor 𝑄 (map-polynomial-functor 𝑃 f) k)
      ( map-compute-type-comp-polynomial-functor Y k)
  coh-map-comp-polynomial-functor f k x = refl

  compute-map-comp-polynomial-functor :
    {l8 l9 : Level} {X : I  UU l8} {Y : I  UU l9}
    (f : (i : I)  X i  Y i) (k : K) 
    ( map-polynomial-functor comp-polynomial-functor f k) ~
    ( map-inv-compute-type-comp-polynomial-functor Y k 
      map-polynomial-functor 𝑄 (map-polynomial-functor 𝑃 f) k 
      map-compute-type-comp-polynomial-functor X k)
  compute-map-comp-polynomial-functor f k x = refl

  compute-map-comp-polynomial-functor' :
    {l8 l9 : Level} {X : I  UU l8} {Y : I  UU l9}
    (f : (i : I)  X i  Y i) (k : K) 
    ( map-polynomial-functor 𝑄 (map-polynomial-functor 𝑃 f) k) ~
    ( map-compute-type-comp-polynomial-functor Y k 
      map-polynomial-functor comp-polynomial-functor f k 
      map-inv-compute-type-comp-polynomial-functor X k)
  compute-map-comp-polynomial-functor' f k x = refl

References

Multivariable polynomial functors over locally cartesian closed categories are considered in [GK12].

[GK12]
NICOLA GAMBINO and JOACHIM KOCK. Polynomial functors and polynomial monads. Mathematical Proceedings of the Cambridge Philosophical Society, 154(1):153–192, September 2012. doi:10.1017/s0305004112000394.

Recent changes