这是lambda演算中的基本y组合子:
Y f = (\x -> f (x x)) (\x -> f (x x))
就像Clojure中的那样:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
(def fac
(fn [f]
(fn [n]
(if (zero? n) 1 (* n (f (dec n)))))))
(def fib
(fn [f]
(fn [n]
(condp = n
0 0
1 1
(+ (f (dec n))
(f (dec (dec n))))))))
这是y-Combinator的另一个表达式(论证的第2步)
我们编写了图灵完整语言(因为我们使用了y-Combinator)(论证的第3步)
我的问题是:为什么y-combinator提供图灵等价?这似乎只是对参数的假设。
答案 0 :(得分:1)
由于只有λ已足以完成图形,因此Y Combinator仅仅是库代码。它提供了简单的自我递归。
我读到的问题,询问是否可以通过消除自我应用来消除图形完整性,通过消除自我应用,问题显然不是,因为没有办法可靠地检测自我应用,缺少实际上运行微积分(停止问题)。
这个论点只是展示了如何在没有明显自我递归的情况下构建Y,并强调了Y只是整个模式族中最精简的版本。
lambda演算子集的真正答案是:总函数。
答案 1 :(得分:1)
首先关闭。要图灵等同,你不需要太多。在BrainF ** ck中,+
,-
,<
,>
,[
和]
就足够了。如果您要从LISPy语言中删除功能并首先删除所有循环和递归调用(Fortran在60中没有递归)它是否仍然是图灵等效的?
是。这是因为你有向上和向下的高阶函数。有了它,你可以使Y
得到递归。使用递归,即使实现没有直接提供任何循环,它也将是等效的。
Y组合器能够实现吗?并不是的。您可以使用call-with-current-continuation
创建循环,因此我会说它是启用它的高阶函数。如果您在没有更高阶函数的语言中执行完全相同的操作,则无法创建Y
,并且无法计算所有可计算值。