查询Lambda微积分中的布尔值

时间:2010-03-07 23:45:46

标签: functional-programming lambda-calculus

这是AND运算符的lambda演算表示:

lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b

任何人都可以帮助我理解这种表现形式吗?

3 个答案:

答案 0 :(得分:12)

要理解如何在lambda演算中表示布尔值,有助于考虑一个IF表达式,“如果a b,那么c”。这是一个选择第一个分支的表达式,如果是真,则选择b,如果是,则选择第二个c,c。 Lambda表达式可以很容易地做到这一点:

lambda(x).lambda(y).x

会给你第一个参数,

lambda(x).lambda(y).y

给你第二个。因此,如果a是其中一个表达式,那么

a b c

提供bc,这正是我们希望IF做的事情。所以定义

 true = lambda(x).lambda(y).x
false = lambda(x).lambda(y).y

a b c的行为类似if a then b else c

(n a b)处查看您的表达,这意味着if n then a else b。 然后m (n a b) b表示

if m then (if n then a else b) else b

如果am都是n,则此表达式的评估结果为true,否则评估为b。由于a是函数的第一个参数,b是第二个参数,true已被定义为给出其两个参数中的第一个的函数,因此{{1} }和m都是n,整个表达式也是如此。否则为true。这就是false

的定义

这一切都是由Alonzo Church发明的,他发明了lambda演算。

答案 1 :(得分:7)

在lambda演算中,布尔值由一个函数表示,该函数接受两个参数,一个用于成功,一个用于失败。这些参数称为 continuations ,因为它们继续进行其余的计算;布尔值True调用成功延续,布尔值False调用失败延续。这种编码称为Church编码,其思想是布尔非常像“if-then-else函数”。

所以我们可以说

true  = \s.\f.s
false = \s.\f.f

其中s代表成功,f代表失败,反斜杠是ASCII lambda。

现在我希望你能看到它的发展方向。我们如何编码and?好吧,在C中我们可以将它扩展到

n && m = n ? m : false

只有这些是功能,所以

(n && m) s f = (n ? m : false) s f = n ? (m s f) : (false s f) = n ? (m s f) : f

但是,三元构造在lambda演算中编码时,只是函数应用,所以我们有

(n && m) s f = (n m false) s f = n (m s f) (false s f) = n (m s f) f

最后我们到达

&& = \n . \m . \s . \f . n (m s f) f

如果我们将成功和失败延续重命名为ab,我们会返回原来的

&& = \n . \m . \a . \b . n (m a b) b

与lambda演算中的其他计算一样,特别是在使用Church编码时,通常使用代数定律和等式推理更容易处理,然后在最后转换为lambdas。

答案 2 :(得分:4)

实际上它不仅仅是AND运算符。这是if m and n then a else b的lambda演算版本。这是解释:

在lambda演算中,true表示为一个带有两个参数*并返回第一个参数的函数。 False表示为带两个参数*并返回第二个参数的函数。

上面显示的函数有四个参数*。从它的外观来看,m和n应该是布尔值,而a和b则是其他一些值。如果m为真,它将评估其第一个参数n a b。这反过来将评估为if n为真,如果n为假则为b。如果m为假,它将评估其第二个参数b。

因此,如果m和n都为真,则函数返回a,否则为b。

(*)“带两个参数”的意思是“接受一个论证并返回一个带有另一个论点的函数”。

根据您的评论进行修改:

在维基页面上看到的

and true false的工作原理如下:

第一步是简单地用其定义替换每个标识符,即(λm.λn. m n m) (λa.λb. a) (λa.λb. b)。现在应用函数(λm.λn. m n m)。这意味着m n m中每次出现的m都将替换为第一个参数((λa.λb. a)),并且每次出现的n都将替换为第二个参数((λa.λb. b))。所以我们得到(λa.λb. a) (λa.λb. b) (λa.λb. a)。现在我们只需应用函数(λa.λb. a)。由于此函数的主体只是a,即第一个参数,因此评估为(λa.λb. b),即false(因为λx.λy. y表示false)。