28 lines
853 B
Text
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)
|