为什么y组合子提供图灵等价?

时间:2014-09-30 12:04:54

标签: clojure lambda-calculus turing-complete y-combinator

This answer

  1. 这是lambda演算中的基本y组合子:

    Y f = (\x -> f (x x)) (\x -> f (x x))

  2. 就像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))))))))
    
    1. 这是y-Combinator的另一个表达式(论证的第2步)

    2. 我们编写了图灵完整语言(因为我们使用了y-Combinator)(论证的第3步)

    3. 我的问题是:为什么y-combinator提供图灵等价?这似乎只是对参数的假设。

2 个答案:

答案 0 :(得分:1)

由于只有λ已足以完成图形,因此Y Combinator仅仅是库代码。它提供了简单的自我递归。

我读到的问题,询问是否可以通过消除自我应用来消除图形完整性,通过消除自我应用,问题显然不是,因为没有办法可靠地检测自我应用,缺少实际上运行微积分(停止问题)。

这个论点只是展示了如何在没有明显自我递归的情况下构建Y,并强调了Y只是整个模式族中最精简的版本。

lambda演算子集的真正答案是:总函数。

答案 1 :(得分:1)

首先关闭。要图灵等同,你不需要太多。在BrainF ** ck中,+-<>[]就足够了。如果您要从LISPy语言中删除功能并首先删除所有循环和递归调用(Fortran在60中没有递归)它是否仍然是图灵等效的?

是。这是因为你有向上和向下的高阶函数。有了它,你可以使Y得到递归。使用递归,即使实现没有直接提供任何循环,它也将是等效的。

Y组合器能够实现吗?并不是的。您可以使用call-with-current-continuation创建循环,因此我会说它是启用它的高阶函数。如果您在没有更高阶函数的语言中执行完全相同的操作,则无法创建Y,并且无法计算所有可计算值。