可以使用 SKI 组合子表示 XOR 吗?
Posted
技术标签:
【中文标题】可以使用 SKI 组合子表示 XOR 吗?【英文标题】:Can XOR be expressed using SKI combinators? 【发布时间】:2016-09-04 07:14:11 【问题描述】:我对 SKI-Combinators 有疑问。
XOR(异或)能否仅使用 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
【问题讨论】:
I
可以表示为S K K
。所以,如果你可以用SKI
表达NOR
,你可以用SK
来表达。
它会中缀吗?括号怎么样? (p.s 试了好几种方法都没有成功)谢谢!
假设您将逻辑连接词括在括号中,即NOR = (... some expression ...)
: (1) NOR
不能表示为后缀运算符(如AND
)--看到这个观察T T NOR = T
,不管NOR
是什么(但应该是F
); (2) NOR
不能表示为中缀运算符 -- F NOR F = F
(但应该是T
)
啊,当然!实际上我犯了一个巨大的错误,问错了问题!我的意思是问XOR而不是NOR!非常抱歉!
【参考方案1】:
布尔值
你的问题在细节上有点不清楚,但似乎你的意思是你有以下布尔表示:
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 公式化为 IF
表达式:
xor x y := IF x THEN (not y) ELSE y = (IF x THEN not ELSE id) y
可以 eta 化简为
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)))
【讨论】:
以上是关于可以使用 SKI 组合子表示 XOR 吗?的主要内容,如果未能解决你的问题,请参考以下文章