{-# OPTIONS --safe --sized-types #-} module Generic.Syntax.STLC where open import Size open import Data.Bool open import Data.Product open import Agda.Builtin.Equality open import Agda.Builtin.List open import Generic.Syntax open import Data.Var open import StateOfTheArt.ACMM using (Type ; α ; _`→_) open import Function private variable σ : Type data `STLC : Set where App Lam : Type → Type → `STLC STLC : Desc Type STLC = `σ `STLC $ λ where (App σ τ) → `X [] (σ `→ τ) (`X [] σ (`∎ τ)) (Lam σ τ) → `X (σ ∷ []) τ (`∎ (σ `→ τ)) pattern `app f t = `con (App _ _ , f , t , refl) pattern `lam b = `con (Lam _ _ , b , refl) _ : Tm STLC ∞ ((α `→ α) `→ (α `→ α)) [] _ = `lam (`lam (`app (`var (s z)) (`var z))) id^S : Tm STLC ∞ (σ `→ σ) [] id^S = `lam (`var z)