【问题标题】:Order of parentheses in lambda calculus if paranthesis are already given?如果已经给出括号,则 lambda 演算中的括号顺序?
【发布时间】:2021-03-19 06:24:39
【问题描述】:
我知道应用程序是左关联的,而抽象是右关联的。函数也被优先考虑,但我遇到了一些问题,这些问题已经在表达式中出现了“一些”括号。这些括号是否会导致计算表达式的方式有所不同?还有第一个表达式前的括号是什么意思?
我在这两者之间做出选择时感到困惑-
-
(lambda x. xy)(lambda y. xy)z --- 在 e1.e2.z 的这种情况下,我应该从左还是右开始评估?我会做替换,这很好,但我应该先替换 lambda x 的 x 还是先替换 lambda y 的 y?
-
((((λx.λy.λz.((xy)z)(λu.λv.u))A)B) ---在这种情况下,我对括号感到困惑。我应该从哪里开始评估?先打开哪个支架?我应该从内到外还是从外到内计算?
【问题讨论】:
标签:
lambda
functional-programming
lambda-calculus
【解决方案1】:
没有为 lambda 演算指定 evaluation strategy。它由您的系统或环境定义。两种常见的策略是正常顺序和应用顺序。对于这个特定的问题,无论策略如何,答案都是相同的。如果您使用的是另一种非常规策略,您可以预期结果会有所不同。
(λx.xy)(λy.xy)z →β x [x := (λy.xy)]
((λy.xy)y)z remove unnecessary parens
(λy.xy)yz →β y [y := y]
(xy)z remove unnecessary parens
xyz
如您所知,应用程序是左关联的。所以删除不必要的括号可以更容易地阅读表达式 -
(((λx.λy.λz.((xy)z)(λu.λv.u))a)b) remove unnecessary parens
(λx.λy.λz.(xyz)(λu.λv.u))ab →β x [x := a]
(λy.λz.(ayz)(λu.λv.u))b →β y [y := b]
(λz.(abz)(λu.λv.u)) remove unnecessary parens
λz.(abz)(λu.λv.u)
在第二个例子中,我们达到了弱头范式,即我们有λz.,没有任何参数可以应用于它