Here we define the inductive natural numbers to be used in other examples.
module nat where open import map open import Data.List using (_∷_ ; [] ; [_]) open import Data.Vec renaming ([] to [||]; [_] to [|_|]) open import Data.Unit renaming (tt to ∗) open import Data.Product using (_,_)
We define the data type of natural numbers with the usual constructors zeroNat and sucNat (we don’t use zero and suc to avoid any confusion with the type ℕ of Agda’s standard library).
Nat-id : id-TC-var
Nat-id = 2
Nat-name : TC-var 0
Nat-name = TC Nat-id 0
zero-id suc-id : id-data-constructor
zero-id = 21
suc-id = 22
zeroNat sucNat : data-constructor {mix-var} 0
zeroNat = zero-id ∷ [] ⇒ᵀ [||]
sucNat = suc-id ∷ [ appᵀ Nat-name [ [||] ] ] ⇒ᵀ [||]
Nat : user-defined {mix-var} 0
Nat = dataᵀ Nat-name whereᵀ (zeroNat ∷ sucNat ∷ [])
Nat[] = data-typeᵀ Nat [ [||] ]
Some shortcuts to use actual natural numbers in the examples.
0Nat 1Nat 2Nat 3Nat 4Nat 5Nat : term-expr 0Nat = dc zeroNat [||] 1Nat = dc sucNat [| 0Nat |] 2Nat = dc sucNat [| 1Nat |] 3Nat = dc sucNat [| 2Nat |] 4Nat = dc sucNat [| 3Nat |] 5Nat = dc sucNat [| 4Nat |]
Finally, we justify the application of Nat to the empty tuple of type expressions.
⊢zeroNat : ∅ ∥ ∅ ⊢ᶜ zeroNat
⊢zeroNat = dcᵀ-intro {G = Nat-name} ∗ ∗
⊢sucNat : ∅ ∥ ∅ ⊢ᶜ sucNat
⊢sucNat = dcᵀ-intro {G = Nat-name} (app-intro ∗ ∋-last , ∗) ∗
⊢Nat : ∅ ∥ ∅ ⊢ Nat[]
⊢Nat =
data-intro
{Γcs = ∅ ∷ ∅ ∷ []}
{χcs = ∅ ∷ ∅ ∷ []}
(⊢zeroNat , ⊢sucNat , ∗) ∗