【问题标题】:Order of parentheses in lambda calculus if paranthesis are already given?如果已经给出括号,则 lambda 演算中的括号顺序?
【发布时间】:2021-03-19 06:24:39
【问题描述】:

我知道应用程序是左关联的,而抽象是右关联的。函数也被优先考虑,但我遇到了一些问题,这些问题已经在表达式中出现了“一些”括号。这些括号是否会导致计算表达式的方式有所不同?还有第一个表达式前的括号是什么意思?

我在这两者之间做出选择时感到困惑-

  1. (lambda x. xy)(lambda y. xy)z --- 在 e1.e2.z 的这种情况下,我应该从左还是右开始评估?我会做替换,这很好,但我应该先替换 lambda x 的 x 还是先替换 lambda y 的 y?

  2. ((((λ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.,没有任何参数可以应用于它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2019-12-17
      • 2021-10-22
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多