namespace BidirTT

abbrev Name := String

inductive Raw where
  | var  : Name → Raw
  | lam  : Name → Raw → Raw
  | app  : Raw → Raw → Raw
  | pi   : Name → Raw → Raw → Raw
  | sig  : Name → Raw → Raw → Raw
  | pair : Raw → Raw → Raw
  | fst  : Raw → Raw
  | snd  : Raw → Raw
  | nat  : Raw
  | zero : Raw
  | succ : Raw → Raw
  | natElim : Name → Raw → Raw → Name → Name → Raw → Raw → Raw
  | unit : Raw
  | triv : Raw
  | unitElim : Name → Raw → Raw → Raw → Raw
  | empty : Raw
  | emptyElim : Name → Raw → Raw → Raw
  | id   : Raw → Raw → Raw → Raw
  | refl : Raw
  | idElim : Name → Name → Raw → Raw → Raw → Raw → Raw
  | univ : Nat → Raw
  | letE : Name → Raw → Raw → Raw → Raw
  | ann  : Raw → Raw → Raw
  deriving Repr, Inhabited, BEq, DecidableEq

inductive Tm where
  | var  : Nat → Tm
  | lam  : Tm → Tm
  | app  : Tm → Tm → Tm
  | pi   : Tm → Tm → Tm
  | sig  : Tm → Tm → Tm
  | pair : Tm → Tm → Tm
  | fst  : Tm → Tm
  | snd  : Tm → Tm
  | nat  : Tm
  | zero : Tm
  | succ : Tm → Tm
  | natElim : Tm → Tm → Tm → Tm → Tm
  | unit : Tm
  | triv : Tm
  | unitElim : Tm → Tm → Tm → Tm
  | empty : Tm
  | emptyElim : Tm → Tm → Tm
  | id   : Tm → Tm → Tm → Tm
  | refl : Tm
  | idElim : Tm → Tm → Tm → Tm → Tm
  | univ : Nat → Tm
  | letE : Tm → Tm → Tm → Tm
  deriving Repr, Inhabited, BEq, DecidableEq

end BidirTT
