我正在尝试使用函数的数学 lambda 表示法来实现 letrec,但我遇到了困难。我的任务说 let 可以定义为
p(e1) U (p(e2) - {x})
并且 letrec 可以定义为
(p(e1) - {f x}) U (p(e2) - {f})
我已经成功实现了 let 以在表达式中查找 freevars,但我正在努力实现 letrec:
let rec fv (e:expr) : S.t = match e with
| Id name -> S.singleton name
| Value x -> S.empty
| Lambda(name, body) -> S.remove name (fv body)
| Let(name, def, body) -> S.union (fv def) (S.diff (fv body) (S.singleton name))
| App (e1, e2) | Add (e1, e2) | Sub (e1, e2) | Mul (e1, e2) | Div (e1, e2) | Lt (e1, e2) | Eq (e1, e2) | And (e1, e2) -> S.union (fv e1) (fv e2)
有人可以指导我如何做到这一点吗?我必须使用 Lambda 吗?在这一点上我很迷茫,只是试图遵循定义的实现对我来说一定是错误的,因为我不能让它工作。