module Exp where
open import Prelude
BaseTy = String
data Ty : Type where
`_ : (α : BaseTy) → Ty
_⇒_ : (t₁ t₂ : Ty) → Ty
infixr 10 `_
infixr 9 _⇒_
Ident = String
data Bind : Type where
uBind : (x : Ident) → Bind
tBind : (x : Ident) (t : Ty) → Bind
data Exp : Type where
var : (x : Ident) → Exp
app : (e₁ e₂ : Exp) → Exp
abs : (b : Bind) (e : Exp) → Exp
apps : Exp → List Exp → Exp
apps = List.foldl app
mkTy : Ty → List Ty → Ty
mkTy a [] = a
mkTy a (b ∷ bs) = mkTy (a ⇒ b) bs
inj` : ∀{α β} → (` α) ≡ (` β) → α ≡ β
inj` refl = refl
inj⇒l : ∀{a b c d : Ty} → (a ⇒ b) ≡ (c ⇒ d) → a ≡ c
inj⇒l refl = refl
inj⇒r : ∀{a b c d : Ty} → (a ⇒ b) ≡ (c ⇒ d) → b ≡ d
inj⇒r refl = refl
eqType : (a b : Ty) → Dec (a ≡ b)
eqType (` α) (` β) =
case α String.≟ β of λ where
(yes refl) → yes refl
(no p) → no λ q → p (inj` q)
eqType (a ⇒ a₁) (b ⇒ b₁) =
case eqType a b of λ where
(yes refl) →
case eqType a₁ b₁ of λ where
(yes refl) → yes refl
(no p) → no λ q → p (inj⇒r q)
(no p) → no λ q → p (inj⇒l q)
eqType (` α) (b ⇒ b₁) = no λ()
eqType (a ⇒ a₁) (` α) = no λ()