lean4-htt/tests/lean/run/renaming.lean
2020-11-19 19:10:49 -08:00

28 lines
853 B
Text

-- Renaming for intrinsically typed lambda calculus
inductive Ty
| base
| arr (a b : Ty)
def Cxt := List Ty
inductive Var : (g : Cxt) → (a : Ty) → Type
| vz {g a} : Var (a :: g) a
| vs {g a b} : Var g a → Var (b :: g) a
inductive Term : Cxt → Ty → Type
| var {g a} : Var g a → Term g a
| app {g a b} : Term g (Ty.arr a b) → Term g a → Term g b
| abs {g a b} : Term (a :: g) b → Term g (Ty.arr a b)
def Ren (g d : Cxt) :=
(a : Ty) → Var d a → Var g a
def liftr {g d a} (r : Ren g d) : Ren (a :: g) (a :: d)
| _, Var.vz => Var.vz
| _, Var.vs x => Var.vs (r _ x)
def rename {g d : Cxt} : (r : Ren g d) → {a : Ty} → Term d a → Term g a
| r, _, Term.var x => Term.var (r _ x)
| r, _, Term.app t u => Term.app (rename r t) (rename r u)
| r, _, Term.abs t => Term.abs (rename (liftr r) t)