{-

Axiomatization of cofibrations.

-}
module axiom.cofibration where

open import basic
open import axiom.funext
open import axiom.shape

infixr 4 _∨_

postulate
  --↓ We postulate a type of cofibrations and decoding of cofibrations as types.
  --↓ The projection fst : Σ Cof [_] → Cof is the classifying map for cofibrations.

  --↓ In the motivating semantics in cartesian cubical sets, the type of cofibrations is
  --↓ the subobject classifier, or the classifier for levelwise decidable subobjects if
  --↓ working constructively.

  Cof : Type
  [_] : Cof → Type

  --↓ We postulate that each cofibration is a proposition of the ambient type theory.

  cofIsStrictProp : (φ : Cof) → isStrictProp [ φ ]

  --↓ We postulate that the type of equalities between two elements of a shape is coded by
  --↓ a cofibration.

  _∋_≈_ : (S : Shape) → ⟨ S ⟩ → ⟨ S ⟩ → Cof
  [≈] : (S : Shape) (s t : ⟨ S ⟩) → [ S ∋ s ≈ t ] ≡ (s ≡ t)

  --↓ We postulate that the empty and unit types are coded by cofibrations.
  --↓ These postulates are redundant: we have already assumed an interval shape with two
  --↓ distinct elements, so we could define ⊥ to be 𝕚 ∋ 0 ≈ 1 and ⊤ to be 𝕚 ∋ 0 ≈ 0.
  --↓ It is however convenient to take them as primitive.

  ⊥ : Cof
  [⊥] : [ ⊥ ] ≡ 𝟘

  ⊤ : Cof
  [⊤] : [ ⊤ ] ≡ 𝟙

  --↓ We postulate that the union of two cofibrations is again a cofibration.
  --↓ Rather than postulating the existence of the union of arbitrary propositions (e.g.
  --↓ via propositional truncation) and asserting a decoding equality for ∨, we axiomatize
  --↓ introduction and elimination rules for the decoding of ∨ directly.

  _∨_ : Cof → Cof → Cof

  ∨l : {φ ψ : Cof} → [ φ ] → [ φ ∨ ψ ]
  ∨r : {φ ψ : Cof} → [ ψ ] → [ φ ∨ ψ ]

  ∨-elim : ∀ {ℓ} {φ ψ : Cof} {P : [ φ ∨ ψ ] → Type ℓ}
    (f : (u : [ φ ]) → P (∨l u))
    (g : (v : [ ψ ]) → P (∨r v))
    (p : (u : [ φ ]) (v : [ ψ ]) → subst P (cofIsStrictProp (φ ∨ ψ) _ _) (f u) ≡ g v)
    (w : [ φ ∨ ψ ]) → P w

  ∨-elim-βl : ∀ ℓ φ ψ P f g p u → ∨-elim {ℓ} {φ} {ψ} {P} f g p (∨l u) ≡ f u
  ∨-elim-βr : ∀ ℓ φ ψ P f g p v → ∨-elim {ℓ} {φ} {ψ} {P} f g p (∨r v) ≡ g v

  --↓ We postulate that cofibrations are closed under universal quantification over a shape.

  all : (S : Shape) → (⟨ S ⟩ → Cof) → Cof
  [all] : ∀ S φ → [ all S φ ] ≡ ((s : ⟨ S ⟩) → [ φ s ])

  --↓ We postulate that the shape equality and universal quantification cofibrations are
  --↓ invariant under shape morphisms in the following sense. These axioms have the effect
  --↓ of forcing shape morphisms to be isomorphism-like, and are in particular
  --↓ automatically satisfied if all shape morphisms are isomorphisms and Cof is
  --↓ extensional (logically equivalent cofibrations are equal), as is the case in the
  --↓ motivating semantics.

  --↓ We postulate that shape equality is invariant under shape morphisms.
  --↓ This can be read as asserting that shape morphisms are monic.

  ≈Equivariant : {S T : Shape} (σ : Shape[ S , T ]) (r s : ⟨ S ⟩)
    → (T ∋ ⟪ σ ⟫ r ≈ ⟪ σ ⟫ s) ≡ (S ∋ r ≈ s)

  --↓ We postulate that universal quantification is invariant under shape morphisms.
  --↓ This can be read as asserting that shape morphisms are epic from the perspective of
  --↓ cofibrations.

  allEquivariant : {S T : Shape} (σ : Shape[ S , T ]) (φ : ⟨ T ⟩ → Cof)
    → all T φ ≡ all S (φ ∘ ⟪ σ ⟫)

--↓ For convenience, we make the equations decoding cofibrations into definitional
--↓ equalities using a REWRITE pragma.

{-# REWRITE [≈] [⊥] [⊤] ∨-elim-βl ∨-elim-βr [all] #-}