import BidirTT.Syntax

namespace BidirTT

mutual
  inductive Neutral where
    | var  : Nat → Neutral
    | app  : Neutral → Val → Neutral
    | fst  : Neutral → Neutral
    | snd  : Neutral → Neutral
    | natElim : Val → Val → Val → Neutral → Neutral
    | unitElim : Val → Val → Neutral → Neutral
    | emptyElim : Val → Neutral → Neutral
    | idElim : Val → Val → Val → Neutral → Neutral

  inductive Val where
    | neu  : Neutral → Val
    | lam  : Closure → Val
    | pi   : Val → Closure → Val
    | sig  : Val → Closure → Val
    | pair : Val → Val → Val
    | nat  : Val
    | zero : Val
    | succ : Val → Val
    | unit : Val
    | triv : Val
    | empty : Val
    | id   : Val → Val → Val → Val
    | refl : Val
    | univ : Nat → Val

  inductive Closure where
    | mk : List Val → Tm → Closure
end

abbrev Env := List Val
abbrev Lvl := Nat

instance : Inhabited Neutral := ⟨.var 0⟩
instance : Inhabited Val := ⟨.univ 0⟩
instance : Inhabited Closure := ⟨.mk [] (.univ 0)⟩

end BidirTT
