QIITOrd.Eliminator.NonDependent

The non-dependent eliminator

When the target family T α does not actually depend on α — i.e. we are defining a function Ord → A into a fixed type A, ordered by a fixed relation _≦_ — the dependent eliminator of QIITOrd.Eliminator specialises to a much shorter checklist. This module performs that specialisation once and for all: it instantiates the dependent Targeting (λ _ → A) (λ _ → _≦_) and exposes the simplified elim/≤-elim.

This is the form used to build the order-code _≤ᵖ_ in QIITOrd.Order.Code.Base (there, A is the type of monotone hProp-valued predicates, and _≦_ is up-set inclusion).

{-# OPTIONS --cubical --safe #-}

module QIITOrd.Eliminator.NonDependent  ℓ' where
open import QIITOrd.Base
import QIITOrd.Eliminator  ℓ' as Dep

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function
open import Cubical.Foundations.HLevels
open import Cubical.Data.Nat using (; suc)
open import Cubical.Data.Sigma
open import Cubical.HITs.PropositionalTruncation using (∣_∣₁; squash₁; rec)

Fixing A and _≦_, a Supremum is just a map Mapped → A from -increasing sequences, and SupPath is the non-indexed coherence “bisimilar sequences have equal suprema” — the dependent PathP collapses to an ordinary because the codomain no longer varies along l≡l.

module Targeting
  (A : Type )
  (_≦_ : A  A  Type ℓ')
  where

  module DepTarget = Dep.Targeting  _  A)  _  _≦_)
  open Bisimulation _≦_ renaming (_≈_ to _≋_)

  module SupremumStatement (succ : A  A) where
    open MonotonicSequence succ _≦_ renaming (MonoSeq to Mapped)

    Supremum : Type _
    Supremum = Mapped  A

    SupPath : Supremum  Type _
    SupPath sup =  (F G : Mapped)  fst F  fst G  sup F  sup G

Supplying ι, succ, sup, supPath we obtain Assigning, which forwards to the dependent Assigning after repackaging bisimilarity into the dependent _≾_-form. The remaining methods (ι≦, s≦s, ≦l, l≦, ≦-trans) are then exactly the order axioms one expects, with no indexing.

  open SupremumStatement using (Supremum; SupPath)
  module Assigning
    (ι : A)
    (succ : A  A)
    (sup : Supremum succ)
    (supPath : SupPath succ sup)
    where

    module DepAssign = DepTarget.Assigning ι succ sup
       { f≈g F G (F≾G , G≾F)  supPath F G $
         n  rec squash₁  { (m , _ , H)   m , H ∣₁ }) (F≾G n)) ,
         n  rec squash₁  { (m , _ , H)   m , H ∣₁ }) (G≾F n))
      })

    module Satisfying
      (isSetA : isSet A)
      (isProp≦ :  {x y}  isProp (x  y))
      (ι≦ :  {x}  ι  x)
      (s≦s :  {x y}  x  y  succ x  succ y)
      (≦l :  {n} F x  (x  fst F n)  x  sup F)
      (l≦ :  F x  (∀ n  fst F n  x)  sup F  x)
      (≦-trans :  {x y z}  x  y  y  z  x  z)
      where

      module DepElim = DepAssign.Satisfying  _  isSetA)  _  isProp≦) ι≦ s≦s ≦l l≦ ≦-trans

      elim : Ord  A
      elim = DepElim.elim

      ≤-elim : α  β  elim α  elim β
      ≤-elim = DepElim.≤-elim