λxyz.xz(yz)是Lambda微积分中的抽象还是应用?

时间:2019-04-15 11:24:25

标签: lambda-calculus

根据lambda演算,应将λxyz.xz(yz)视为λxyz.xz(yz)的应用,或者将xz(yz)中的括号简单地表示操作应类似于{ {1}}而不是(xz)(yz),而整个((xz)y)z都在函数“ body”中吗?

我认为这是一个抽象,应用程序必须像xz(yz)那样编写,但是我的理解很差,所以我想检查一下。

1 个答案:

答案 0 :(得分:0)

正确。确切地说,这取决于lambda术语语法的确切定义,更确切地说,取决于省略括号的规则,但是这些规则有约定。特别是通常

  • application has precedence over abstraction,所以你 首先尝试将xz应用于yz,然后 在xyz上进行抽象,而不是首先形成抽象λxyz.xz,然后将结果项嵌入到yz的应用中(这就是如果抽象的优先级高于应用程序,则会得到结果);
  • 括号在应用程序中是左关联的,因此xzyz(在yz周围没有括号)将被读为((xz)y)z,并表示xz适用于yz,您需要将术语yz括起来。

因此,您怀疑λxyz.xz(yz)xz(yz)的三倍抽象,xz本身是yzx的应用,z也是{ {1}}至yzλx.(λy.(λz.(xz(yz))))

在所有方括号中,术语为λxyz.xz(yz): abstraction |- x: variable |- λyz.xz(yz): abstraction |- y: variable |- λz.xz(yz): abstraction |- z: variable |- xz(yz): application |- xz: application | |- x: variable | |- z: variable |- yz: application |- y: variable |- z: variable
因此,该术语的语法树如下所示:

λxyz.xz

您还正确地怀疑,将yz应用于(λxyz.xz)yz的应用将写为var lookUpMapping = { 0: "Available", 3: "Assigned" }; this.columnDefs = [ { filter: "agSetColumnFilter", refData: lookUpMapping } ];