你的直觉是正确的,但直觉并不能证明什么(唉……)
那么,我们如何证明你的说法呢?只需证明 SKK 和 SKS 具有相同的行为即可。“行为”是一个非正式的概念,它被“语义”正式捕获:如果 SKK 和 SKS 相等,那么根据 SKI 演算语义,它们应该始终归约为同一个术语。
现在,有一个很深的问题,那就是:什么是 SKI 演算?实际上,没有单一的方法可以回答这个问题。您在问题中隐含的做法是您用 λ 项来表达 SKI,并且您依赖于 λ 演算的语义。这是绝对正确的。另一种方法是直接定义 SKI 语义。例如,如果您查看wikipedia page,您会发现语义不是用 lambda 术语定义的(而且它对应于 lambda 术语的事实是一个(好的和预期的)副作用)。在这个答案的其余部分,我将采用与您相同的方法,并将 SKI 项转换为 λ 项。一个很好的练习是使用正确的 SKI 语义重做证明。
所以,让你的问题正式化:你的问题是,对于任何 SKI 术语t
,SKKt = SKSt
?走着瞧。
SKKt
被编码为(λx.λy.λz.(xz)(yz))(λx.λy.x)(λx.λy.x)t
λ演算。我们现在只需要将它减少到正常形式(我会详细说明每一步,每次我减少最左边的 λ,即使它不是最快的策略):
(λx.λy.λz.(xz)(yz))(λx.λy.x)(λx.λy.x)t
= (λy.λz.((λx.λy.x)z)(yz))(λx.λy.x)t
= (λz.((λx.λy.x)z)((λx.λy.x)z))t
= ((λx.λy.x)t)((λx.λy.x)t)
= (λy.t)((λx.λy.x)t)
= t
SKKt
因此, λ演算中的编码简化为t
(作为旁注,我们刚刚证明了SKK
与此处等价I
)。为了结束我们的证明,我们必须归约SKSt
,看看它是否也归约为t
。
SKSt
被编码为(λx.λy.λz.(xz)(yz))(λx.λy.x)(λx.λy.λz.(xz)(yz))t
。让我们减少它。(这次就不详细说了)
(λx.λy.λz.(xz)(yz))(λx.λy.x)(λx.λy.λz.(xz)(yz))t
= ((λx.λy.x) t)((λx.λy.λz.(xz)(yz)) t))
= (λy.t)((λx.λy.λz.(xz)(yz)) t))
= t
欢呼!它也减少到t
,确实如此,SKS
并且SKK
是等价的。似乎第三个组合子并不重要:只要你有SK?
,它就相当于I
。作为练习,您可以轻松地证明它(相同的策略,如果是这种情况,那么对于任何术语t
和s
,SKts = s
)。如上所述,另一个很好的练习是在不使用 λ 语义但使用正确的 SKI 语义的情况下重做证明。
最后,我的回答应该向你提出一个新问题:我们有两种语义,一种将 SKI 项编码为 λ 项,另一种则没有。您可能有的问题是:这两种语义是否等价?两个语义等价意味着什么?如果您才刚刚开始自学 λ 演算,那么现在尝试回答这些问题可能还为时过早,但您可以将其保留在脑海中,以便您对正式语言更加熟悉。