------------------------------------------------------------------------
-- INCREMENTAL λ-CALCULUS
--
-- The syntax of function types (Fig. 1a).
------------------------------------------------------------------------
module Parametric.Syntax.Type where
-- This is a module in the Parametric.* hierarchy, so it defines
-- an extension point for plugins. In this case, the plugin can
-- choose the syntax for data types. We always provide a binding
-- called "Structure" that defines the type of the value that has
-- to be provided by the plugin. In this case, the plugin has to
-- provide a type, so we say "Structure = Set".
Structure : Set₁
Structure = Set
-- Here is the parametric module that defines the syntax of
-- simply types in terms of the syntax of base types. In the
-- Parametric.* hierarchy, we always call these parametric
-- modules "Structure". Note that in Agda, there is a separate
-- namespace for module names and for other bindings, so this
-- doesn't clash with the "Structure" above.
--
-- The idea behind all these structures is that the parametric
-- module lifts some structure of the plugin to the corresponding
-- structure in the full language. In this case, we lift the
-- structure of base types to the structure of simple types.
-- Maybe not the best choice of names, but it seemed clever at
-- the time.
module Structure (Base : Structure) where
infixr 5 _⇒_
-- A simple type is either a base type or a function types.
-- Note that we can use our module parameter "Base" here just
-- like any other type.
data Type : Set where
base : (ι : Base) → Type
_⇒_ : (σ : Type) → (τ : Type) → Type
-- We also provide the definitions of contexts of the newly
-- defined simple types, variables as de Bruijn indices
-- pointing into such a context, and sets of bound variables.
open import Base.Syntax.Context Type public
open import Base.Syntax.Vars Type public
-- Internalize a context to a type.
--
-- Is there a better name for this function?
internalizeContext : (Σ : Context) (τ′ : Type) → Type
internalizeContext ∅ τ′ = τ′
internalizeContext (τ • Σ) τ′ = τ ⇒ internalizeContext Σ τ′