module A201605.AbelChapmanExtended2.Syntax where




data Ty : Set where
     :               Ty
  _∨_  : (a b : Ty)  Ty
  _⇒_ : (a b : Ty)  Ty
  _∧_  : (a b : Ty)  Ty
     :               Ty

infixr 5 _⇒_


data Cx : Set where
     :                      Cx
  _,_ : (Γ : Cx) (a : Ty)  Cx

data Var : Cx  Ty  Set where
  top :  {Γ a}                  Var (Γ , a) a
  pop :  {Γ a b} (x : Var Γ a)  Var (Γ , b) a


data Tm (Γ : Cx) : Ty  Set where
  boom :  {c}     (t : Tm Γ )                           Tm Γ c
  inl  :  {a b}   (t : Tm Γ a)                            Tm Γ (a  b)
  inr  :  {a b}   (t : Tm Γ b)                            Tm Γ (a  b)
  case :  {a b c} (t : Tm Γ (a  b)) (ul : Tm (Γ , a) c)
                                       (ur : Tm (Γ , b) c)  Tm Γ c
  var  :  {a}     (x : Var Γ a)                           Tm Γ a
  lam  :  {a b}   (t : Tm (Γ , a) b)                      Tm Γ (a  b)
  app  :  {a b}   (t : Tm Γ (a  b)) (u : Tm Γ a)        Tm Γ b
  pair :  {a b}   (t : Tm Γ a)        (u : Tm Γ b)        Tm Γ (a  b)
  fst  :  {a b}   (t : Tm Γ (a  b))                      Tm Γ a
  snd  :  {a b}   (t : Tm Γ (a  b))                      Tm Γ b
  unit :                                                      Tm Γ 


data Ne (Ξ : Cx  Ty  Set) (Δ : Cx) : Ty  Set where
  boom :  {c}        Ne Ξ Δ                        Ne Ξ Δ c
  case :  {a b c}  Ne Ξ Δ (a  b)  Ξ (Δ , a) c
                                       Ξ (Δ , b) c  Ne Ξ Δ c
  var  :  {a}        Var Δ a                         Ne Ξ Δ a
  app  :  {a b}      Ne Ξ Δ (a  b)  Ξ Δ a        Ne Ξ Δ b
  fst  :  {a b}      Ne Ξ Δ (a  b)                  Ne Ξ Δ a
  snd  :  {a b}      Ne Ξ Δ (a  b)                  Ne Ξ Δ b

data Nf (Δ : Cx) : Ty  Set where
  ne   :  {a}   (n : Ne Nf Δ a)            Nf Δ a
  inl  :  {a b} (n : Nf Δ a)               Nf Δ (a  b)
  inr  :  {a b} (n : Nf Δ b)               Nf Δ (a  b)
  lam  :  {a b} (n : Nf (Δ , a) b)         Nf Δ (a  b)
  pair :  {a b} (n : Nf Δ a) (m : Nf Δ b)  Nf Δ (a  b)
  unit :                                       Nf Δ 

mutual
  data Val (Δ : Cx) : Ty  Set where
    ne   :  {a}     (v : Ne Val Δ a)                  Val Δ a
    inl  :  {a b}   (v : Val Δ a)                     Val Δ (a  b)
    inr  :  {a b}   (v : Val Δ b)                     Val Δ (a  b)
    lam  :  {Γ a b} (t : Tm (Γ , a) b) (ρ : Env Δ Γ)  Val Δ (a  b)
    pair :  {a b}   (v : Val Δ a) (w : Val Δ b)       Val Δ (a  b)
    unit :                                                Val Δ 

  data Env (Δ : Cx) : Cx  Set where
       :                                         Env Δ 
    _,_ :  {Γ a} (ρ : Env Δ Γ) (w : Val Δ a)  Env Δ (Γ , a)




¬_ : Ty  Ty
¬ a = a  

_⇔_ : Ty  Ty  Ty
a  b = (a  b)  (b  a)

infix 25 ¬_
infix 5 _⇔_


v₀ :  {Γ a}  Tm (Γ , a) a
v₀ = var top

v₁ :  {Γ a b}  Tm ((Γ , a) , b) a
v₁ = var (pop top)

v₂ :  {Γ a b c}  Tm (((Γ , a) , b) , c) a
v₂ = var (pop (pop top))


nev₀ :  {Δ a}  Val (Δ , a) a
nev₀ = ne (var top)