我对SKI-Combinators有疑问。
可以仅使用S
和K
组合子表示异或(异或)吗?
我有
True = Cancel
False = (Swap Cancel)
其中
Cancel x y = K x y = x
Swap: ff x y = S ff x y = ff y x
答案 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表示为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 = SKK
,not
可以表示为flip
,因为flip b t e = b e t = IF b THEN e ELSE t = IF (not b) THEN t ELSE e
。 flip
it self is quite involved但可以作为
flip := S (S (K (S (KS) K)) S) (KK)
现在我们只需要找出一种方法来编写一个带x
的函数并将其应用于NOT
和ID
两个术语。为了达到目的,我们首先注意到,如果我们设置
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)))