可以使用SKI组合器表达XOR吗?

时间:2016-05-09 15:14:56

标签: boolean logic lambda-calculus combinators combinatory-logic

我对SKI-Combinators有疑问。

可以仅使用SK组合子表示异或(异或)吗?

我有

True = Cancel
False = (Swap Cancel)

其中

Cancel x y = K x y = x   
Swap: ff x y = S ff x y = ff y x

1 个答案:

答案 0 :(得分:3)

<强>布尔

你的问题在细节上有点不清楚,但似乎你的意思是你有以下布尔代表:

T := K
F := S K

这是有效的,因为它意味着以下减少:

T t e => t
F t e => e
换句话说,b t e可以解释为IF b THEN t ELSE e

IF _ THEN _ ELSE _

的XOR

所以给定这个框架,我们如何实现XOR?我们可以将XOR表示为IF表达式:

xor x y := IF x THEN (not y) ELSE y = (IF x THEN not ELSE id) y

可以将其缩减为

XOR x := IF x THEN not ELSE id = x not id

某些功能组合器

我们标准id = SKKnot可以表示为flip,因为flip b t e = b e t = IF b THEN e ELSE t = IF (not b) THEN t ELSE eflip it self is quite involved但可以作为

flip := S (S (K (S (KS) K)) S) (KK)

现在我们只需要找出一种方法来编写一个带x的函数并将其应用于NOTID两个术语。为了达到目的,我们首先注意到,如果我们设置

app := id

然后

app f x = (id f) x = f x

等等,

(flip app) x f = f x

我们几乎就在那里,因为到目前为止所有内容都显示了

((flip app) id) ((flip app) not x) = ((flip app) not x) id = (x not) id = x not id

最后一步是在x上使最后一行无点。我们可以使用函数组合运算符来实现:

((flip app) id) ((flip app) not x) = compose ((flip app) id) ((flip app) not) x

compose的要求是

compose f g x = f (g x)

我们可以通过设置

获得
compose f g := S (K f) g

全部放在一起

总结一下,我们得到了

xor := compose ((flip app) id) ((flip app) not)

或者,完全展开:

xor = S (K ((flip app) id)) ((flip app) not)
    = S (K ((flip app) (SKK))) ((flip app) flip)
    = S (K ((flip SKK) (SKK))) ((flip SKK) flip)
    = S (K (((S (S (K (S (KS) K)) S) (KK)) SKK) (SKK))) (((S (S (K (S (KS) K)) S) (KK)) SKK) (S (S (K (S (KS) K)) S) (KK)))