{-# OPTIONS --cubical #-}
open import ContainersPlus
open import Level renaming (suc to lsuc ; zero to lzero)
open import Cubical.Foundations.Prelude hiding (_◁_) renaming (fst to π₁ ; snd to π₂)
open import Cubical.Foundations.Function
open import Cubical.Data.Sigma
record IsMndContainer (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp)
(ι : S)
(σ : (s : S) → (P s → S) → S)
(pr₁ : (s : S) (f : P s → S) → P (σ s f) → P s)
(pr₂ : (s : S) (f : P s → S) (p : P (σ s f)) → P (f (pr₁ s f p))) :
Set (lsuc (ℓs ⊔ ℓp)) where
field
unit-l : (s : S) → σ ι (const s) ≡ s
unit-r : (s : S) → σ s (const ι) ≡ s
assoc : (a : S) (b : P a → S) (c : (p : P a) → P (b p) → S) →
σ a (λ p → σ (b p) (c p)) ≡ σ (σ a b) (λ p → c (pr₁ _ _ p) (pr₂ _ _ p))
pr-unit-r : {s : S} →
PathP (λ i → (p : P (unit-r s i)) → P s)
(pr₁ _ _)
(λ p → p)
pr-unit-l : {s : S} →
PathP (λ i → (p : P (unit-l s i)) → P s)
(pr₂ _ _)
(λ p → p)
pr-mul₁ : {a : S} {b : P a → S} {c : (p : P a) → P (b p) → S} →
PathP (λ i → P (assoc a b c i) → P a)
(λ q → pr₁ a (λ p → σ (b p) (c p)) q)
(λ q → pr₁ a b (pr₁ (σ a b) ((λ r → c (pr₁ _ _ r) (pr₂ _ _ r))) q))
pr-mul₁₂ : {a : S} {b : P a → S} {c : (p : P a) → P (b p) → S} →
PathP (λ i → (p : P (assoc a b c i)) → P (b (pr-mul₁ i p)))
(λ q → pr₁ _ _ (pr₂ _ _ q))
(λ q → pr₂ _ _ (pr₁ _ _ q))
pr-mul₂₂ : {a : S} {b : P a → S} {c : (p : P a) → P (b p) → S} →
PathP (λ i → (q : P (assoc a b c i)) → P (c (pr-mul₁ i q) (pr-mul₁₂ i q)))
(λ q → pr₂ _ _ (pr₂ _ _ q))
(λ q → pr₂ _ _ q)
record MndContainer (ℓs ℓp : Level) (C : Container ℓs ℓp) : Set (lsuc (ℓs ⊔ ℓp)) where
S = Shape C
P = Position C
field
ι : S
σ : (s : S) → (P s → S) → S
pr₁ : (s : S) (f : P s → S) → P (σ s f) → P s
pr₂ : (s : S) (f : P s → S) (p : P (σ s f)) → P (f (pr₁ s f p))
isMndContainer : IsMndContainer _ _ S P ι σ pr₁ pr₂
pr : (s : S) (f : P s → S) → P (σ s f) → Σ[ p ∈ P s ] P (f p)
pr s f p = pr₁ _ _ p , pr₂ _ _ p
open MndContainer
mContBuilder : (ℓs ℓp : Level) (S : Set ℓs) (P : S → Set ℓp)
(ι : S)
(σ : (s : S) → (P s → S) → S)
(pr₁ : (s : S) (f : P s → S) → P (σ s f) → P s)
(pr₂ : (s : S) (f : P s → S) (p : P (σ s f)) → P (f (pr₁ s f p)))
(isMndCont : IsMndContainer _ _ S P ι σ pr₁ pr₂) →
MndContainer _ _ (S ◁ P)
ι (mContBuilder ℓs ℓp S P ι σ pr₁ pr₂ isMndCont) = ι
σ (mContBuilder ℓs ℓp S P ι σ pr₁ pr₂ isMndCont) = σ
pr₁ (mContBuilder ℓs ℓp S P ι σ pr₁ pr₂ isMndCont) = pr₁
pr₂ (mContBuilder ℓs ℓp S P ι σ pr₁ pr₂ isMndCont) = pr₂
isMndContainer (mContBuilder ℓs ℓp S P ι σ pr₁ pr₂ isMndCont) = isMndCont