这是AND运算符的λ演算表示:
lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b
有人能帮我理解这个表示吗?
这是AND运算符的λ演算表示:
lambda(m).lambda(n).lambda (a).lambda (b). m(n a b) b
有人能帮我理解这个表示吗?
要理解如何在lambda演算中表示布尔值,可以考虑一个IF表达式,“如果a则为b否则为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
并且 a b c
的行为类似于 如果 a 那么 b 否则 c
。
在你的表达式中查看 (n a b)
,那意味着 如果 n 那么 a 否则 b
。
然后 m (n a b) b
意味着
if m then (if n then a else b) else b
如果m
和n
都为true
,则该表达式将评估为a
,否则为b
。由于a
是函数的第一个参数,b
是第二个参数,而true
被定义为一种给出其两个参数中的第一个参数的函数,因此如果m
和n
都为true
,则整个表达式也为true
。否则,它就是false
。这就是and
的定义!
所有这些都是由阿隆佐·邱奇发明的,他发明了lambda演算。
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 编码时,与其他计算一样,通过代数定律和等式推理来解决问题通常更容易,然后在最后将其转换为 lambda 表达式。
if m and n then a else b
。以下是解释:n a b
。这将根据n是true还是false而分别计算为a或b。如果m为false,则计算其第二个参数b。and true false
的工作原理如下:(λm.λn. m n m) (λa.λb. a) (λa.λb. b)
。现在应用函数(λm.λn. m n m)
。这意味着在m n 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
)。
(λ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的Church表示形式。 - Peter Westlake