Lean4
/-- Traverses an expression `e` and renames bound variables named `old` to `new`. -/
def renameBVar (e : Expr) (old new : Name) : Expr :=
match e with
| app fn arg => app (fn.renameBVar old new) (arg.renameBVar old new)
| lam n ty bd bi => lam (if n == old then new else n) (ty.renameBVar old new) (bd.renameBVar old new) bi
| forallE n ty bd bi => forallE (if n == old then new else n) (ty.renameBVar old new) (bd.renameBVar old new) bi
| mdata d e' => mdata d (e'.renameBVar old new)
| e => e