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.
External links
- Multivariate containers by Elisabeth Stenholm, Agda formalization
Recent changes
- 2025-08-07. Fredrik Bakke. Multivariable polynomial functors (#1446).