这是AND运算符的lambda演算表示:
lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b
任何人都可以帮助我理解这种表现形式吗?
答案 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
提供b
或c
,这正是我们希望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
如果a
和m
都是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
如果我们将成功和失败延续重命名为a
和b
,我们会返回原来的
&& = \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
)。