+varnames :: [VarName]
+varnames = map (:[]) ['a'..'z'] ++ [c : s | s <- varnames, c <- ['a'..'z']]
+
+alphaNorm :: Term -> Term
+alphaNorm t = alpha varnames t
+ where
+ alpha (v:vs) (Lambda x t) = Lambda v . alpha vs $ substitute x (Var v) t
+ alpha vs (App u v) = App (alpha vs u) (alpha vs v)
+ alpha vs (Var x) = Var x
+