We define the data type of lists to be used in other examples.
module list where open import map open import Data.List using (_∷_ ; [] ) open import Data.Vec renaming (_∷_ to _¦_ ; [] to [||] ; [_] to [|_|]) open import Data.Unit renaming (tt to ∗) open import Data.Product using (_,_)
We first define the type variables and contexts we will use later on.
α β : mix-var α = tvar 0 β = tvar 1 Γα Γβ : type-context {mix-var} Γα = ⟦ [| α |] ⟧ Γβ = ⟦ [| β |] ⟧
We define now the data type of lists, with the usual constructors nil
and cons
.
List-id : id-TC-var List-id = 0 nil-id cons-id : id-data-constructor nil-id = 0 cons-id = 1 List-name : TC-var 1 List-name = TC List-id 1 nil cons : data-constructor 1 nil = nil-id ∷ [] ⇒ᵀ [| varᵀ α |] cons = cons-id ∷ (varᵀ β ∷ (appᵀ List-name [ [| varᵀ β |] ]) ∷ []) ⇒ᵀ [| (varᵀ β) |] List : user-defined {mix-var} 1 List = dataᵀ List-name whereᵀ (nil ∷ cons ∷ []) List[_] = λ x → data-typeᵀ List [ [| x |] ] cons[_,_] = λ x y → dc cons (x ¦ y ¦ [||]) nil[] = dc nil [||]
Finally, we justify the application of List
to type expressions.
⊢nil : Γα ∥ ∅ ⊢ᶜ nil ⊢nil = dcᵀ-intro {G = List-name} ∗ (var-intro ∋-last , ∗) ⊢cons : Γβ ∥ ∅ ⊢ᶜ cons ⊢cons = dcᵀ-intro {G = List-name} (var-intro ∋-last , app-intro (var-intro ∋-last , ∗) ∋-last , ∗) (var-intro ∋-last , ∗) ⊢List : ∀ {Γ χ φ} → _ → Γ ∥ χ ⊢ List[ φ ] ⊢List ⊢φ = data-intro {k = 1} {G = List-name} {Γcs = Γα ∷ Γβ ∷ []} {χcs = ∅ ∷ ∅ ∷ []} (⊢nil , ⊢cons , ∗) (⊢φ , ∗)