递归调用的变量是自由的还是有约束的?

Will recursively-called variable be free or bound?

提问人:Isaac 提问时间:2/10/2020 最后编辑:Will NessIsaac 更新时间:2/10/2020 访问量:236

问:

我试图更好地理解自由变量和约束变量。下面是一个示例代码:

(define (what-kind-of-var? guess x)
    (< (abs (- (square guess) x))
        0.001))

我看到这里的绑定变量是 和 ,自由变量 、 、 和 。如果我递归调用会怎样?它会是一个绑定变量,因为它本身是绑定的吗?guessx<abs-squarewhat-kind-of-var?

谢谢!

范围 方案 球拍 自由变量 边界变量

评论


答:

0赞 Atharva Shukla 2/10/2020 #1
  • guess和 是参数。当应用函数时,它们最终会绑定(到相应的参数)。x

  • <、 、 、 实际上绑定到初始环境中的过程。所以它们不是自由变量。abs-

  • square将是自由变量,但受制于其作用域中未定义的事实。(请注意,在初始环境中绑定)。what-kind-of-var?sqr

  • what-kind-of-var?也不是未绑定的,即使它以递归方式调用自身(假设递归在语言中正确实现)。 可以看作是(define (f param) body)(define f (lambda (param) body)

评论

4赞 amalloy 2/10/2020
当然,他们在这个表达方式上是自由的。他们可能被束缚在全球环境中,但在这个表达中,他们是自由的。
0赞 Atharva Shukla 2/12/2020
是的,我假设该函数将在编辑器中输入出来。但是,如果我们考虑这种表达方式,那么,是的,它们是免费的。
0赞 Will Ness 2/10/2020 #2

在动态绑定下,它会,但 Scheme 具有词法范围。

但实际上两者都不是。“Free”或“bound”来自lambda演算。 是一个顶级变量,将该 lambda 表达式命名为what-kind-of-var?

(define what-kind-of-var? 
  (lambda (guess x)                        ;; this
     (< (abs (- (square guess) x))
         0.001)))

但在 lambda 演算中,表达式不能命名。在 lambda 演算中以递归方式调用它的唯一方法是使用 Y 组合器:

((Y (lambda (what-kind-of-var?)                ;; outer
      (lambda (guess x)                            ;; inner
         (if (< (abs (- (square guess) x))
                0.001)
           guess
           (what-kind-of-var? (+ 1 guess) x)))))
  4 25)

现在当然绑定在 下的新 lambda 表达式中。它在嵌套的内部 lambda 中是自由的,但在外部 lambda 中是绑定的。what-kind-of-var?Y

评论

0赞 alinsoar 2/10/2020
R7RS 的动态绑定也 srfi.schemers.org/srfi-39/srfi-39.html
0赞 alinsoar 2/10/2020
我认为自由和束缚的思想也出现在弗雷格的作品中(大约 1880 年?Lambda 演算精确地定义了它们,但它们肯定以前出现过。
0赞 Will Ness 2/10/2020
A.不是语言本身,而是作为扩展。B. 我们在 Scheme 中,所以 LC 是相关的。当然,LC本身是“开放公式”概念(即具有自由变量的逻辑公式)的发展
0赞 alinsoar 2/10/2020
动态绑定现在是标准化的,按照我粘贴的实现请求。默认情况下,新版本的 scheme 将包含在其内核中。