如何使用S,K和I组合器编写空列表?

时间:2009-08-14 10:58:02

标签: functional-programming lisp lambda lambda-calculus

我知道:

(cons [p] [q]) is ((s ((s i) (k [p]))) (k [q]))
(car [lst]) is ([lst] k)
(cdr [lst]) is ([lst] (k i))

我想写一个像这样的列表

(cons [a] (cons [b] (cons [c] [nil])))

,这将是这样的:

((s ((s i) (k [a]))) (k ((s ((s i) (k [b]))) (k ((s ((s i) (k [c]))) (k [nil]))))))

但我不知道如何将'nil'编译成S,K和I组合器。有谁知道吗?

提前致谢, 埃德温何塞帕拉辛卡尔

1 个答案:

答案 0 :(得分:8)

nil表示中唯一需要的是能够识别它 - 编写一些null?谓词,为nil返回“true”,为所有人返回“false”其他对。这意味着答案取决于您对真/假的表示。通过λxy.xλxy.y的共同选择,nil的便捷编码为λf.[true]。将其翻译成SKI现在非常简单(我不会在这里做,因为它看起来像是家庭作业......)。

(另外,如果给出null?的这种表示,实现nil谓词是一个很好的练习。)