Bushes

We define the data type of bushes to be used in other examples.

module bush 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 the type variables and contexts we will use later on.

α β : mix-var
α = tvar 0
β = tvar 1

Γα Γβ : type-context {mix-var}
Γα =  [| α |] 
Γβ =  [| β |] 

We define the data type of bushes, with the usual constructors bnil and bcons.

Bush-id : id-TC-var
Bush-id = 11

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

bnil-id bcons-id : id-data-constructor
bnil-id = 111
bcons-id = 112

bnil bcons : data-constructor 1
bnil = bnil-id  [] ⇒ᵀ [| varᵀ α |]
bcons =
  bcons-id
   (varᵀ β  appᵀ Bush-name [ [| appᵀ Bush-name [ [| varᵀ β |] ] |] ]  [])
  ⇒ᵀ [| varᵀ β |]
  
Bush : user-defined 1  
Bush = dataᵀ Bush-name whereᵀ (bnil  bcons  [])

Bush[_] = λ x  data-typeᵀ Bush [ [| x |] ]
bnil[] = dc bnil [||]
bcons[_,_] = λ x y  dc bcons (x ¦ y ¦ [||])

Finally, we justify the application of Bush to a type expression.

⊢bnil : Γα   ⊢ᶜ bnil
⊢bnil = dcᵀ-intro {G = Bush-name}  (var-intro ∋-last , )

⊢bcons : Γβ   ⊢ᶜ bcons
⊢bcons =
  dcᵀ-intro {G = Bush-name}
  (
    var-intro ∋-last ,
    app-intro (app-intro (var-intro ∋-last , ) ∋-last , ) ∋-last ,
    
  )
  (var-intro ∋-last , )

⊢Bush :  {Γ χ x} _  Γ  χ  Bush[ x ] 
⊢Bush ⊢x = data-intro {Γcs = Γα  Γβ  []} {χcs =     []} (⊢bnil , ⊢bcons , ) (⊢x , )