如何解释lambda演算表达式?

时间:2013-02-03 18:15:08

标签: lambda-calculus

说我得到了表达式(我将l称为lambda):

lx.f1 f2 x

其中f1和f2是函数,x假设为某个数字。

你怎么解释这个表达?是lx。(f1 f2)x与lx.f1(f2 x)相同?

作为一个例子,lx。(不是eq0)x和lx.not(eq0 x)的结果会有什么差异? (eq0是一个函数,如果parm等于0则返回true,而不是众所周知的not函数)

更正式地说T = lx.ly.x,F = lx.ly.y,not = lx.xFT和eq0 = lx.x(ly.F)T

1 个答案:

答案 0 :(得分:2)

f1 f2 x(f1 f2) x相同。函数应用程序是左关联的。

  

是ln。(f1 f2)x与ln.f1(f2 x)相同?

不,一点也不。 (f1 f2) xf1为参数调用f2,然后以x为参数调用生成的函数。 f1 (f2 x)f2为参数调用x,然后调用f1,其结果为f2 x

  

ln。(不是eq0)x和ln.not(eq0 x)?

如果我们讨论的是类型化的lambda演算,not期望布尔值作为参数,前者只会导致类型错误(因为eq0是函数而不是布尔值)。如果我们讨论的是无类型的lambda演算,truefalse表示为函数,则取决于not的定义方式以及true和{{1}的方式代表。

如果falsetrue是教会布尔值,即false是一个双参数函数,它返回其第一个参数,而true是一个双参数函数,它返回它的第二个参数,然后false等同于not函数,即它采用双参数函数并返回一个双参数函数,其参数已被反转。因此,flip将返回一个函数,当应用于其他两个参数(not eq0) xy时,它将评估为z。因此,如果((eq0 y) x) z为0,则会返回y,否则为x