lambda - 将翻转 lambda 转换为 SKI 项

标签 lambda lambda-calculus combinators k-combinator s-combinator

我在将用于翻转的 lambda 转换为 SKI 组合器时遇到问题(我希望这是有道理的)。这是我的转换:

/fxy.fyx
/f./x./y.fyx
/f./x.S (/y.fy) (/y.x)
/f./x.S f (/y.x)
/f./x.S f (K x)
/f.S (/x.S f) (/x.K x)
/f.S (/x.S f) K
/f.S (S (/x.S) (/x.f)) K
/f.S (S (K S) (K f)) K
S (/f.S (S (K S) (K f))) (/f.K)
S (/f.S (S (K S) (K f))) (K K)
S (S (/f.S) (/f.S (K S) (K f))) (K K) 
S (S (K S) (/f.S (K S) (K f))) (K K)
S (S (K S) (S (/f.S (K S)) (/f.K f))) (K K)
S (S (K S) (S (/f.S (K S)) K)) (K K)
S (S (K S) (S (S (/f.S) (/f.K S)) K)) (K K)
S (S (K S) (S (S (K S) (/f.K S)) K)) (K K)
S (S (K S) (S (S (K S) (S (/f.K) (/f.S))) K)) (K K)
S (S (K S) (S (S (K S) (S (K K) (K S))) K)) (K K)

如果我在 B、C、K、W 系统中正确理解,C 是翻转,它在 SKI 术语中的定义是 S (S (K (S (K S) K)) S) (KK K)。显然我的答案与 C 组合器不同...以下是我用于转换的规则:

K y = /x.y  - K combinator
(SKK) = /x.x  -  I combinator
(S (/x.f) (/x.g)) = (/x.fg)  -  S combinator
y = (/x.yx)  -  eta reduction
/x./y.f = /xy.f  - currying
Note that the S rule can convert longer expressions - for example, λ x.abcdeg can be converted by setting f = abcde.

我错过了什么?

最佳答案

答案被接受后,我修改了它,发现它实际上是错误的。

你的最终结果是正确的,虽然它不是教科书上的“官方”答案,但有可能不同的SKI术语实际上等同于相同的lambda表达式。

S [S (K S) (S (S (K S) (S (K K) (K S))) K)] [K K] f x y
-> S (K S) (S (S (K S) (S (K K) (K S))) K) f (K K f) x y
-> K S f (S (S (K S) (S (K K) (K S))) K f) (K K f) x y
-> S [S (S (K S) (S (K K) (K S))) K f] (K K f) x y
-> S [S (K S) (S (K K) (K S))] K f x (K K f x) y
-> S [K S] [S (K K) (K S)] f (K f) x (K K f x) y
-> K S f (S (K K) (K S) f) (K f) x (K K f x) y
-> S [S (K K) (K S) f] [K f] x (K K f x) y
-> S [K K] [K S] f x (K f x) (K K f x) y
-> K K f (K S f) x (K f x) (K K f x) y
-> K (K S f) x (K f x) (K K f x) y
-> K S f (K f x) (K K f x) y
-> S [K f x] [K K f x] y
-> K f x y (K K f x y)
-> f y (K K f x y)
-> f y (K x y)
-> f y x

上面的推导基于最左归约顺序,证明您的最终项相当于 C 组合器。

关于lambda - 将翻转 lambda 转换为 SKI 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379277/

相关文章:

lambda - lambda 表达式中的 Racket 和未绑定(bind)标识符,与 r5rs 对比

Python:我可以使用 lambda 参数 n 重复 lambda 运算 (n+n) n 次吗?

lambda - 如何使用 lambda 实现 let*

javascript - 在 Javascript 中使用 lambda 演算(使用教堂数字)的递归问题

functional-programming - 对于定点组合器 Y,\x.f(xx) 是什么

scala - 用于单子(monad)的 K/Kestrel 组合器?

javascript - Angular,检查路径变量中的未定义 - Lambda 函数

使用 vector/初始化列表的任何类型的 C++11 动态多维数组

lambda-calculus - 访问 block 和 Y 组合器内的外部变量

haskell - 不确定如何使用组合器设计有用的库