Haskell - 确定函数的自由变量和有界变量集

时间:2013-05-14 19:11:03

标签: variables haskell let free-variable

我必须确定函数s1和s2的自由和有界变量的集合:

s1 := \x -> if y then \z -> (x \y -> y) else (\z -> w) x

所以,对于s1,我会写:

FV(s1):= FV (y) ∪ FV (x) ∪ FV (w)

我说错了吗?或者它应该是:

FV(s1):= FV (y) ∪ FV (x) ∪ FV (y) ∪ FV (w) ∪ FV (x)

因为y和x是两次免费的。 一旦y in If然后结果 - > ÿ 对于x:x在\ z的结果中是自由一次,在结尾是第二个。

有界变量将是:

BV(s1):= BV (x) ∪ BV (z) ∪ BV (y) ∪ BV (z)

因为z出现两次有界var。

以同样的方式我确定s2的FV和BV:

s2 := let f x1  x2 = y1  (\x -> x2) in let y1 = f w (f y2  y2), y2 = y1  in f

FV(s2):= FV (y1) ∪ FV (x2) ∪ FV (w) ∪ FV (y1)

BV(s2):= BV (f) ∪ BV (x1) ∪ BV (x2) ∪ BV (x) ∪ BV (y1)

你能告诉我我是对还是错?

提前致谢

1 个答案:

答案 0 :(得分:2)

一般想法:绑定vs自由变量

自由变量和约束变量的经验法则是,自由变量的值会影响表达式的值。

举一个简单的例子,如果我定义identity x = x并单独说x = 6,则不会改变identity 1010的事实;在identity x = x中,变量x被绑定,因为它只代表任何输入。我们可以在不改变函数含义的情况下编写identity y = y

相反,如果我们定义gimmez x = z,则z不受约束。如果我们单独说z = 6,那么gimmez会做一些与我们说z = putStrLn "zed zed zed zed can you tell I'm British?"gimmez x = zz截然不同的事情。在任何一种情况下,函数gimmez都已更改 - z未绑定。

我是否可以在不更改含义的情况下为varname查找并替换othervarname

  • 是 - varname受约束。
  • 否 - varname在表达式中显示为空闲。

让我们看看你的实际例子

示例1

s1 := \x -> if y then \z -> (x \y -> y) else (\z -> w) 

您撰写了FV(s1):= FV (y) ∪ FV (x) ∪ FV (w)FV(s1):= FV (y) ∪ FV (x) ∪ FV (y) ∪ FV (w) ∪ FV (x)

让我们依次看看所有变量

  • 初始\x ->将lambda范围的x绑定到行尾。它根本不是一个自由变量。
  • yif之后是免费的,但绑定在无效的表达式(x \y -> y)中。该括号中的第二个匹配项具有绑定y的值,而不是自由的值。对其他自由变量的删除称为阴影。 y在表达式中是免费的,但仅仅是因为它的第一次出现。
  • z绑定在最终的lambda表达式中。
  • w不受任何限制 - 它是免费的。

摘要: yz是免费的。 xz绑定,y被遮蔽 - 它也会在表达式的后面作为绑定变量出现。 FV(s1) = {y,z}BV(s1)={x,z,y}

符号

我不同意使用符号FV(s1):= FV (y) ∪ FV (w)。这表明要查找s1的自由变量,我应该查看yw的自由变量。我不同意 - yz s1的自由变量。确实,如果我想获得定义s1的模块的自由变量,我需要添加FV (y) ∪ FV (w),但这是一个不同的问题。

(符号表示设置联合。事物在集合中或集合之外,您不需要多次添加它们。)

示例2

s2 := let f x1  x2 = y1  (\x -> x2) in let y1 = f w (f y2  y2), y2 = y1  in f

let f x1 x2 =绑定fx1x2,即使f感觉不同;它们都引入了一个新变量,它会影响任何具有相同名称的外部定义,并且在表达式中查找和替换它们不会改变它的含义,因此它们受到约束。

  • fx1x2let约束。
  • y1第一次出现时是免费的 - 第二个let绑定不在此范围内。
  • x受lambda
  • 约束
  • y1现在受let约束(更多阴影)
  • w是免费的
  • y2一开始看起来自由,但实际上是在y2 = y1
  • 表达式中追溯约束
FV(s2):= {y1, w}
BV(s2):= {f, x1, x2, x, y1, y2}