Rose trees

Here we define the data type of rose trees.

module rose where

open import map
open import list using (List[_] ; ⊢List ; nil[] ; cons[_,_])
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 introduce variables and contexts for the declaration of Rose’s data constructors.
α β : mix-var
α = tvar 0
β = tvar 1

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

We then define rose trees as usual, with a constructor rnil producing an empty rose tree, and a constructor rnode making a rose tree out of a label and a list of children, each of which is itself a rose tree.

Rose-id : id-TC-var
Rose-id = 3

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

rnode-id rnil-id : id-data-constructor
rnil-id = 30
rnode-id = 31

rnode rnil : data-constructor 1
rnil = rnil-id  [] ⇒ᵀ [| varᵀ α |]
rnode = rnode-id  ((varᵀ β)  (List[ appᵀ Rose-name [ [| varᵀ β |] ] ])  []) ⇒ᵀ [| varᵀ β |]

Rose : user-defined {mix-var} 1
Rose = dataᵀ Rose-name whereᵀ (rnil  rnode  [])

Rose[_] = λ x  data-typeᵀ Rose [ [| x |] ]
rnil[] = dc rnil [||]
rnode[_,_] = λ x y  dc rnode (x ¦ y ¦ [||])
Finally, we justify the application of Rose to a type expression.
⊢rnil : Γα   ⊢ᶜ rnil
⊢rnil = dcᵀ-intro {G = Rose-name}  (var-intro ∋-last , ) 

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

⊢Rose :  {Γ χ φ}  _  Γ  χ  Rose[ φ ]
⊢Rose ⊢φ =
  data-intro
  {Γcs = Γα  Γβ  []}
  {χcs =     []}
  (⊢rnil , ⊢rnode , )
  (⊢φ , )