\begin{code}
{-# OPTIONS --safe --without-K #-}
module Slice.Family where
open import MLTT.Spartan
open import UF.Powerset-MultiUniverse
open import UF.Size
\end{code}
By `Fam_𝓤(A)`, we denote the type of families on type A with index types living in
universe `𝓤`.
\begin{code}
Fam : (𝓤 : Universe) → 𝓦 ̇ → 𝓤 ⁺ ⊔ 𝓦 ̇
Fam 𝓤 A = Σ I ꞉ 𝓤 ̇ , (I → A)
index : {A : 𝓤 ̇ } → Fam 𝓦 A → 𝓦 ̇
index (I , _) = I
\end{code}
Indexing for families.
\begin{code}
_[_] : {A : 𝓤 ̇ } → (U : Fam 𝓥 A) → index U → A
(_ , f) [ i ] = f i
infix 9 _[_]
\end{code}
Comprehension notation.
\begin{code}
compr-syntax : {A : 𝓤 ̇ } (I : 𝓦 ̇ )→ (I → A) → Fam 𝓦 A
compr-syntax I f = I , f
infix 2 compr-syntax
syntax compr-syntax I (λ x → e) = ⁅ e ∣ x ∶ I ⁆
\end{code}
Comprehension over another family.
\begin{code}
fmap-syntax : {A : 𝓤 ̇ } {B : 𝓥 ̇ }
→ (A → B) → Fam 𝓦 A → Fam 𝓦 B
fmap-syntax h (I , f) = I , h ∘ f
infix 2 fmap-syntax
syntax fmap-syntax (λ x → e) U = ⁅ e ∣ x ε U ⁆
\end{code}
Resizing of families.
\begin{code}
resize-family : {A : 𝓤 ̇ }
→ (S : Fam 𝓥 A)
→ index S is 𝓦 small
→ Fam 𝓦 A
resize-family S (A₀ , s , e) = A₀ , (λ x → S [ s x ])
\end{code}
For increased readability we will now add mechanisms for turning subsets into
families.
\begin{code}
module _
{B : 𝓥 ̇ }
{A : 𝓤 ̇ }
(m : B → A)
where
subset-to-family : 𝓟 {𝓣} B → Fam (𝓣 ⊔ 𝓥) A
subset-to-family S = (𝕋 S , m ∘ 𝕋-to-carrier S)
syntax subset-to-family m S = 【 m , S 】
module _ {A : 𝓤 ̇ } where
subset-to-family' : 𝓟 {𝓣} A → Fam (𝓣 ⊔ 𝓤) A
subset-to-family' S = subset-to-family id S
\end{code}