{- Axiomatization of shapes. Postulates a type of shapes, types of homomorphisms between shapes, and the interval shape. -} module axiom.shape where open import basic open import axiom.funext private variable ℓ : Level infixl 3 _▷⟨_⟩ _^_ ------------------------------------------------------------------------------------------ -- Shapes. ------------------------------------------------------------------------------------------ postulate --↓ We postulate a universe of shapes. --↓ For the equivariant model in cartesian cubical sets, we take Shape to be ℕ and --↓ ⟨ n ⟩ to be the n-cube 𝕀ⁿ. Shape : Type ⟨_⟩ : Shape → Type --↓ We postulate a type of homomorphisms between each pair of shapes. --↓ For the equivariant model in cartesian cubical sets, the shape homomorphisms are the --↓ automorphisms of cubes. --↓ For the formalization we do not need that the shape morphisms are closed under --↓ composition and identities, but closing under these does not affect the --↓ construction. We also do not need that shape morphisms are isomorphisms as in the --↓ case of the equivariant model structure on cartesian cubes, but they are constrained --↓ to be isomorphism-like by the axioms on cofibrations. Shape[_,_] : Shape → Shape → Type ⟪_⟫ : {I J : Shape} → Shape[ I , J ] → ⟨ I ⟩ → ⟨ J ⟩ --↓ Interval shape. --↓ The interval shape is used to define path types and thus equivalences and anything --↓ that depends on equivalences. --↓ In the equivariant model in cartesian cubical sets, this is the shape encoding the --↓ 1-cube. In that case every shape is a power of the interval, but the construction --↓ does not require that the shapes are generated in this way (nor that shapes are --↓ closed under products). 𝕚 : Shape --↓ Notation for the interval type. 𝕀 : Type 𝕀 = ⟨ 𝕚 ⟩ postulate --↓ We postulate that the interval has two distinct elements (the *endpoints*). 𝕚0 : 𝕀 𝕚1 : 𝕀 0≠1 : {A : Type ℓ} → 𝕚0 ≡ 𝕚1 → A --↓ Notation for context extension by a shape. _▷⟨_⟩ : ∀ {ℓ} → Type ℓ → Shape → Type ℓ Γ ▷⟨ S ⟩ = Γ × ⟨ S ⟩ --↓ Notation for context extension by a copy of the interval. _▷𝕀 : ∀ {ℓ} → Type ℓ → Type ℓ Γ ▷𝕀 = Γ ▷⟨ 𝕚 ⟩ postulate --↓ We postulate that the type of shapes and the type of homomorphisms between any two --↓ shapes are flat-modal, i.e. "discrete". --↓ In the motivating cartesian cubical set semantics, this means they are discrete --↓ cubical sets, which is indeed the case for the equivariant model: the type of shapes --↓ is the *set* ℕ and Shape[ m , n ] is the *set* of automorphisms from the m-cube to the --↓ n-cube. ShapeIsDiscrete : {A : Shape → Type ℓ} → ((@♭ S : Shape) → A S) → ((S : Shape) → A S) ShapeIsDiscrete-β : {A : Shape → Type ℓ} (f : (@♭ S : Shape) → A S) (@♭ S : Shape) → ShapeIsDiscrete f S ≡ f S {-# REWRITE ShapeIsDiscrete-β #-} ShapeHomIsDiscrete : {@♭ S T : Shape} {A : Shape[ S , T ] → Type ℓ} → ((@♭ σ : Shape[ S , T ]) → A σ) → ((σ : Shape[ S , T ]) → A σ) ShapeHomIsDiscrete-β : {@♭ S T : Shape} {A : Shape[ S , T ] → Type ℓ} (f : (@♭ σ : Shape[ S , T ]) → A σ) (@♭ σ : Shape[ S , T ]) → ShapeHomIsDiscrete f σ ≡ f σ {-# REWRITE ShapeHomIsDiscrete-β #-} ------------------------------------------------------------------------------------------ -- Convenient notation for exponentiation by a shape. ------------------------------------------------------------------------------------------ --↓ Exponentiation by a shape. _^_ : ∀ {ℓ} (Γ : Type ℓ) (S : Shape) → Type ℓ Γ ^ S = ⟨ S ⟩ → Γ --↓ Functorial action of exponentiation by a shape. _`^_ : ∀ {ℓ ℓ'} {Γ : Type ℓ} {Γ' : Type ℓ'} (ρ : Γ → Γ') (S : Shape) → (Γ ^ S → Γ' ^ S) (ρ `^ S) = ρ ∘_ --↓ Unit and counit transformations for the adjunction between product with (_▷ S) and --↓ exponentation by (_^ S) a shape. ^-unit : ∀ {ℓ} (S : Shape) {Γ : Type ℓ} → Γ → Γ ▷⟨ S ⟩ ^ S ^-unit S = curry id ^-counit : ∀ {ℓ} (S : Shape) {Γ : Type ℓ} → Γ ^ S ▷⟨ S ⟩ → Γ ^-counit S = uncurry _$_ ------------------------------------------------------------------------------------------ -- Notation for interval endpoints. -- Using Agda's support for natural number literal overloading, we can write 0 and 1 for -- the endpoints of the interval shape. ------------------------------------------------------------------------------------------ private isEndpoint : (m : ℕ) → Type isEndpoint 0 = 𝟙 isEndpoint 1 = 𝟙 isEndpoint (suc (suc _)) = 𝟘 𝕀fromℕ : (n : ℕ) → {{_ : isEndpoint n}} → 𝕀 𝕀fromℕ 0 = 𝕚0 𝕀fromℕ 1 = 𝕚1 instance Num𝕀 : Number 𝕀 Num𝕀 .Number.Constraint = isEndpoint Num𝕀 .Number.fromNat = 𝕀fromℕ