Functional programming 关于Lambda演算中布尔函数的质疑

Functional programming 关于Lambda演算中布尔函数的质疑,functional-programming,lambda-calculus,Functional Programming,Lambda Calculus,这是AND运算符的lambda演算表示: lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b 有谁能帮我理解这个表示法吗?实际上,它不仅仅是AND运算符。这是lambda演算版本的如果m和n,那么a和b。解释如下: 在lambda演算中,true表示为一个函数,它接受两个参数*并返回第一个参数。False表示为接受两个参数*并返回第二个参数的函数 上面显示的函数包含四个参数*。从表面上看,m和n应该是布尔值,a和b应该是其他值。如果m为t

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

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

有谁能帮我理解这个表示法吗?

实际上,它不仅仅是AND运算符。这是lambda演算版本的
如果m和n,那么a和b
。解释如下:

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

上面显示的函数包含四个参数*。从表面上看,m和n应该是布尔值,a和b应该是其他值。如果m为true,它将计算到它的第一个参数,即
nab
。如果n为真,则依次计算为a,如果n为假,则计算为b。如果m为false,它将计算到第二个参数b

所以基本上,如果m和n都为真,函数返回a,否则返回b

(*)其中“接受两个参数”表示“接受一个参数并返回接受另一个参数的函数”

根据您的评论进行编辑:

wiki页面上显示的
和true-false
的工作原理如下:


第一步是简单地用其定义替换每个标识符,即
(λm.λn.m n m)(λa.λb.a)(λa.λb.b)
。现在应用函数
(λm.λn.m n m)
。这意味着
mnm
中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
)。

要理解如何在lambda演算中表示布尔值,思考IF表达式“IF a then b else c”会有所帮助。这是一个表达式,它选择第一个分支b(如果为真),第二个分支c(如果为假)。Lambda表达式可以很容易地做到这一点:

lambda(x).lambda(y).x
将给出它的第一个论点,并且

lambda(x).lambda(y).y
给你第二个。如果a是这些表达式之一,那么

a b c
给出
b
c
,这正是我们希望IF执行的操作。所以定义

 true = lambda(x).lambda(y).x
false = lambda(x).lambda(y).y
abc
的行为将类似于
如果a那么b else c

查看表达式内部的
(n a b)
,这意味着
如果n那么a else b
。 然后
m(na b)b
表示

if m then (if n then a else b) else b
如果
m
n
均为
true
,则此表达式计算为
a
,否则计算为
b
。由于
a
是函数的第一个参数,
b
是第二个参数,
true
被定义为给出两个参数中第一个参数的函数,那么如果
m
n
都是
true
,那么整个表达式也是如此。否则为
false
。这就是
的定义


所有这些都是阿隆佐·丘奇发明的,他发明了lambda演算。

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

所以我们可以说

true  = \s.\f.s
false = \s.\f.f
其中,
s
代表成功,
f
代表失败,反斜杠是ASCII lambda

现在我希望你能看到这一切的进展。我们如何编码
?在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
如果我们将成功和失败的延续重命名为
a
b
,我们将返回到您原来的状态

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

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

非常感谢!!!我发现Lambda微积分真的很难理解,这样的解释让我的生活轻松多了!!再次感谢。@Peter:如果可以的话,还需要另一个帮助:我正在维基百科上阅读教堂的布尔语:我无法理解这些例子是如何推断的,即是真是假。你能帮我理解它们吗?理解这些长表达式的方法就是记住规则,从左到右一步一步地计算它们。因此在表达式
(λm.λn.m n.m)(λa.λb.a)(λa.λb.b)
中,括号中的第一部分是函数,第二和第三部分被m和n替换:
(λa.λb.a)(λa.λb.b)(λa.λb.a)
。然后再做同样的事情,记住每个括号中的a和b是完全独立的。第一部分,
(λa.λb.a)
,返回其两个参数中的第一个。因此它返回
(λa.λb.b)
,这是false.Great Peter的教堂代表!!!非常感谢你。你在学校里学过Lambda微积分吗?或者你读过任何文档来达到这种理解水平吗?另外,我还有一个问题:(lambda(a)(lambda(b)(lambda(c)c)b)),在这种情况下,(lambda(c)c)“的外部‘c’是自由变量还是有界变量?我想我第一次看到lambda是在一本关于Lisp的书中,然后是一本关于指称语义的书中。我不记得是从哪里来的布尔人,但我确实玩得很开心