gpt4 book ai didi

ocaml - lambda 表达式的自由变量列表

转载 作者:行者123 更新时间:2023-12-04 15:35:16 25 4
gpt4 key购买 nike

我只是在为即将到来的 OCaml 测试做一些功课,但遇到了一些麻烦。

考虑由以下抽象语法定义的 λ 项语言(其中 x 是变量):

t ::= x | t t | λx. t  

写一个类型项来表示 λ-项。假设变量表示为字符串。

好的,男孩。
# type t = Var of string | App of (t*t) | Abs of string*t;;
type t = Var of string | App of (t * t) | Abs of (string * t)

项 t 的自由变量 fv(t) 归纳定义如下:
fv(x) = {x}  
fv(t t') = fv(t) ∪ fv(t')
fv(λx. t) = fv(t) \ {x}

肯定的事。
# let rec fv term = match term with
Var x -> [x]
| App (t, t') -> (List.filter (fun y -> not (List.mem y (fv t'))) (fv t)) @ (fv t')
| Abs (s, t') -> List.filter (fun y -> y<>s) (fv t');;
val fv : t -> string list = <fun>

例如,
fv((λx.(x (λz.y z))) x) = {x,y}.

让我们检查一下。
# fv (App(Abs ("x", App (Abs ("z", Var "y"), Var "z")), Var "x"));;
- : string list = ["y"; "z"; "x"]

我已经检查了一百万次,我确信结果应该包括“z”变量。你能就此让我放心吗?

最佳答案

在对 OP 的评论中,@PasqualCuoq 指出 λ在 lambda 演算中与 fun 的关联相同在 OCaml 中。即术语 t in λx.t被贪婪地评估(参见 http://en.wikipedia.org/wiki/Lambda_calculus#Notation )。

这意味着 (λz.y z)实际上是 (λz.(y z)) ,并且上面的函数是正确的,但是为示例表达式 (λx.(x (λz.y z))) x 提供了翻译不是,因为它应该是

(App(Abs("x", App(Var "x", Abs("z", App(Var "y", Var "z")))), Var "x"))

代替
(App(Abs ("x", App (Abs ("z", Var "y"), Var "z")), Var "x"))

这是一个很棒的地方,叫做 Stack Overflow!

关于ocaml - lambda 表达式的自由变量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com