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 , ∗)
  (⊢φ , ∗)