【问题标题】:Lambda Calculus - Inserting Parentheses?Lambda 演算 - 插入括号?
【发布时间】:2015-12-12 18:16:39
【问题描述】:

这是我期中的一个问题,我不知道该怎么做。

插入括号以阐明它是如何解析的

x y λx.x y

答案是:((x y) (λx.(x y))))

有人能解释一下你是怎么做到的吗?

【问题讨论】:

  • 你写过这样的程序吗?您使用哪种语言?
  • 不,这只是一个期中问题。现在正在准备期末考试。我认为这与我们也做过的 OCaml 相关
  • 那么你想知道 OCaml 是如何解析这个文本的吗?
  • 不管你如何得到问题的答案

标签: parsing lambda lambda-calculus


【解决方案1】:

嗯,首先,这不是答案。 ((x y) (λx.(x y)))) 无效,它有一个额外的右括号。

( ( x y ) ( λx.( x y ) ) ) ) 注意不平衡的括号

但是,从这里开始,我将忽略这一点,假设您的意思是:((x y) (λx.(x y))),并删除了最后的括号。我并不是要在那里挑剔,我相信这可能只是一个错字,我的 IDE 一直在我的代码下放置红线,用于错误地添加或忽略添加括号,但我确实认为这应该指出来。

如果问题是以这种形式提供给你的,没有任何其他信息,我会说它可能不是很好,如果我在决赛中看到它会非常困扰我,因为有一些歧义它。这可以通过我可以看到的几种有效方式来解决,但是您提供的答案的更正版本可以说是最干净的。

所以回头看看x y λx.x y

一些语法上有效但不等效的包装变量的可能方法是:

  • ((x y) (λx.(x y)))
  • (x y)(λx.x)y - 相当于(x y)y
  • x (y ((λx.x) y) ) - 相当于x (y y)
  • x (y (λx.(x y)))

在处理问题时,请注意λx.___ 是唯一完成的抽象。因此,您知道 λ 的左侧会有一个开括号,我们有:_x_ _y_(λx._x_ _y_,一些明显的直觉,基于最终解决方案确实必须是封闭和平衡的事实,将提供:(x_ _y_ (λx.(x_ _y)_* 其中_ 指定一个或多个括号的可能性,无论是开括号还是闭括号,请参阅_*,它只能是右括号。除此之外,只要括号保持平衡,其余的空白可以用任何方式填写。

我的猜测是:

  • 这里留下的问题还有更多内容,比如您可能知道或可以确定一些示例输入和输出,或者被告知要做出最清晰的可能结果(非常主观)

  • 这是一道选择题,可以排除其他选项。也许他们没有有效地放置括号,包括过度浪费的括号,例如((((x y) (λx.(x y)))))。也许它们显然是无效的,例如(x (y λx))(.x y)。或者括号是不平衡的,就像你最初声称的((x y) (λx.(x y)))),或者更夸张、更不微妙的((x y)) (λx.(x y)))))

在我看来,这将是一个不错的多项选择题,或者提供更多信息,有点模糊和开放,但不是太糟糕,提供更多信息来填补空白。如果按原样给出,我确实有问题,但也许您的教授会接受所有以合理方式格式化的有效答案。如果您提供的答案,包括额外不平衡的右括号,实际上是他用作正确答案的答案(可能是多项选择),那么问题就更大了,因为这个答案显然是错误的。

抱歉回答得晚了,希望这个问题对你仍然有用,如果有用的话,希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多