------------------------------------------------------------------------
-- Some definitions that are re-exported from Definition.Untyped but
-- do not depend on that module's module parameter
------------------------------------------------------------------------
module Definition.Untyped.NotParametrised where
open import Tools.Fin
open import Tools.Function
open import Tools.Level
open import Tools.List
open import Tools.Nat
open import Tools.PropositionalEquality
private variable
a : Level
l n : Nat
P : Nat → Set _
------------------------------------------------------------------------
-- Definitions related to terms
-- Typing contexts (length indexed snoc-lists, isomorphic to lists).
-- Terms added to the context are well scoped in the sense that it cannot
-- contain more unbound variables than can be looked up in the context.
infixl 24 _∙_
data Con (A : Nat → Set a) : Nat → Set a where
ε : Con A 0 -- Empty context.
_∙_ : {n : Nat} → Con A n → A n → Con A (1+ n) -- Context extension.
private variable
Γ : Con _ _
-- Empty-con Γ holds if Γ is empty.
data Empty-con {P : Nat → Set a} : Con P n → Set a where
ε : Empty-con ε
-- A variant of Empty-con.
infix 4 _or-empty_
data _or-empty_ {P : Nat → Set a} (A : Set a) : Con P n → Set a where
possibly-nonempty : ⦃ ok : A ⦄ → A or-empty Γ
ε : A or-empty ε
-- Representation of sub terms using a list of binding levels
infixr 5 _∷ₜ_
data GenTs (A : Nat → Set a) : Nat → List Nat → Set a where
[] : {n : Nat} → GenTs A n []
_∷ₜ_ : {n b : Nat} {bs : List Nat}
(t : A (b + n)) (ts : GenTs A n bs) → GenTs A n (b ∷ bs)
-- Sigma and Unit types have two modes, allowing either projections
-- and η-equality (strong) or elimination by prodrec/unitrec (weak).
--
-- Note that one can optionally enable η-equality for weak unit types,
-- see Definition.Typed.Variant.Type-variant.η-for-Unitʷ.
data Strength : Set where
𝕤 𝕨 : Strength
-- Π- or Σ-types.
data BinderMode : Set where
BMΠ : BinderMode
BMΣ : (s : Strength) → BinderMode
-- The function drop k removes the last k entries from contexts.
drop : ∀ k → Con P (k + n) → Con P n
drop 0 Γ = Γ
drop (1+ k) (Γ ∙ _) = drop k Γ
------------------------------------------------------------------------
-- Weakening
-- In the following we define untyped weakenings η : Wk.
-- The typed form could be written η : Γ ≤ Δ with the intention
-- that η transport a term t living in context Δ to a context Γ
-- that can bind additional variables (which cannot appear in t).
-- Thus, if Δ ⊢ t : A and η : Γ ≤ Δ then Γ ⊢ wk η t : wk η A.
--
-- Even though Γ is "larger" than Δ we write Γ ≤ Δ to be conformant
-- with subtyping A ≤ B. With subtyping, relation Γ ≤ Δ could be defined as
-- ``for all x ∈ dom(Δ) have Γ(x) ≤ Δ(x)'' (in the sense of subtyping)
-- and this would be the natural extension of weakenings.
data Wk : Nat → Nat → Set where
id : {n : Nat} → Wk n n -- η : Γ ≤ Γ.
step : {n m : Nat} → Wk m n → Wk (1+ m) n -- If η : Γ ≤ Δ then step η : Γ∙A ≤ Δ.
lift : {n m : Nat} → Wk m n → Wk (1+ m) (1+ n) -- If η : Γ ≤ Δ then lift η : Γ∙A ≤ Δ∙A.
-- Composition of weakening.
-- If η : Γ ≤ Δ and η′ : Δ ≤ Φ then η • η′ : Γ ≤ Φ.
infixl 30 _•_
_•_ : {l m n : Nat} → Wk l m → Wk m n → Wk l n
id • η′ = η′
step η • η′ = step (η • η′)
lift η • id = lift η
lift η • step η′ = step (η • η′)
lift η • lift η′ = lift (η • η′)
liftn : {k m : Nat} → Wk k m → (n : Nat) → Wk (n + k) (n + m)
liftn ρ 0 = ρ
liftn ρ (1+ n) = lift (liftn ρ n)
stepn : {k m : Nat} (ρ : Wk k m) → (n : Nat) → Wk (n + k) m
stepn ρ 0 = ρ
stepn ρ (1+ n) = step (stepn ρ n)
-- Weakening of variables.
-- If η : Γ ≤ Δ and x ∈ dom(Δ) then wkVar η x ∈ dom(Γ).
wkVar : {m n : Nat} (ρ : Wk m n) (x : Fin n) → Fin m
wkVar id x = x
wkVar (step ρ) x = (wkVar ρ x) +1
wkVar (lift ρ) x0 = x0
wkVar (lift ρ) (x +1) = (wkVar ρ x) +1
-- A weakening for closed terms.
wk₀ : Wk n 0
wk₀ {n = 0} = id
wk₀ {n = 1+ n} = step wk₀
------------------------------------------------------------------------
-- Universe levels
-- Universe levels.
Universe-level : Set
Universe-level = Nat
-- The maximum of two universe levels.
infixl 6 _⊔ᵘ_
_⊔ᵘ_ : (_ _ : Universe-level) → Universe-level
_⊔ᵘ_ = flip Tools.Nat._⊔_
-- The definition above is set up so that l ⊔ᵘ 0 is definitionally
-- equal to l, with the intention to make it a little easier to work
-- with Erased.
_ : l ⊔ᵘ 0 ≡ l
_ = refl
-- Ordering of universe levels.
infix 4 _≤ᵘ_
_≤ᵘ_ : (_ _ : Universe-level) → Set
i ≤ᵘ j = i ≤′ j
open Tools.Nat public
using ()
renaming (≤′-refl to ≤ᵘ-refl; ≤′-step to ≤ᵘ-step)
-- Strict ordering of universe levels.
infix 4 _<ᵘ_
_<ᵘ_ : (_ _ : Universe-level) → Set
i <ᵘ j = i <′ j