Phantom types for natural numbers

Definition of phantom types simulating the inductive definition of the data constructors of Nat at the type level.

module phantomNat 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 define now the data types phantomZero and phantomSuc as data types of arity 0 with no constructors.

phantomZero-id phantomSuc-id : id-TC-var
phantomZero-id = 6
phantomSuc-id = 7

phantomZero-name : TC-var 0
phantomZero-name = TC phantomZero-id 0

phantomSuc-name : TC-var 1
phantomSuc-name = TC phantomSuc-id 1

phantomZero : user-defined {mix-var} 0
phantomZero = dataᵀ phantomZero-name whereᵀ []

phantomSuc : user-defined {mix-var} 1
phantomSuc = dataᵀ phantomSuc-name whereᵀ []

phantomZero[] = data-typeᵀ phantomZero [ [||] ]
phantomSuc[_] = λ n   data-typeᵀ phantomSuc [ [| n |] ]

The justification of these types are pretty easy, since no justifications need to be provided for the data constructors.

⊢phantomZero :  {Γ χ}  Γ  χ  phantomZero[] 
⊢phantomZero = data-intro {Γcs = []} {χcs = []}  

⊢phantomSuc :  {Γ χ x}  _  Γ  χ  phantomSuc[ x ]
⊢phantomSuc = data-intro {Γcs = []} {χcs = []}