[英]Can XOR be expressed using SKI combinators?
我对SKI组合器有疑问。
只能使用S
和K
组合器来表示XOR(异或)吗?
我有
True = Cancel
False = (Swap Cancel)
哪里
Cancel x y = K x y = x
Swap: ff x y = S ff x y = ff y x
布尔
您的问题在细节上还不清楚,但是您的意思似乎是您具有以下布尔值表示形式:
T := K
F := S K
之所以有效,是因为它意味着以下减少适用:
T t e => t
F t e => e
换句话说, bte
可以解释为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 = SKK
作为标准,而not
表示为flip
,因为flip bte = bet = IF b THEN e ELSE t = IF (not b) THEN t ELSE e
。 flip
它本身是相当参与但可行的
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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.