私は関数のための数学ラムダ記法を使用してletrecを実装しようとしているが、私は困難を抱えている。私の割り当ては、私が成功した表現でfreevarsを見つけるために聞かせて、私はletrecに苦しんだ実装しましたLETがOcaml、セットを使用してフリーレックletrecを実装する
p(e1) U (p(e2) - {x})
として定義することができ、そのletrecが
(p(e1) - {f x}) U (p(e2) - {f})
として定義することができることを言います実装:
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)
誰かがこれを行う方法を私に歩いてもらえますか?私はラムダを使用する必要がありますか?私はこの時点でかなり失われています。定義に従っている実装は、私がそれを正しく動作させることができないため、私のところで間違って行われているに違いありません。