【问题标题】:Recursive lambda calculus function递归 lambda 演算函数
【发布时间】:2016-04-18 16:19:08
【问题描述】:

我想创建一个 lambda 演算函数 P,使得 (P x y z) 给出 ((x y)(x P)(P z))。我曾尝试使用 Y-combinator/Turing 组合器的变体,即 λg.(g g) 形式的函数,因为我需要重现函数本身,但我看不到任何前进的方向。任何帮助将不胜感激。

【问题讨论】:

    标签: recursion functional-programming lambda-calculus y-combinator


    【解决方案1】:

    基本上你想解决“β-方程”P x y z = (x y) (x P) (P z)。 有一种求解M = ... M ... 形式方程的通用方法。 您只需将右侧包装在 lambda 中,形成一个术语 L,其中所有出现的 M 都将替换为 m

    L = λm. ... m ...
    

    然后使用定点组合器得到解决方案。让我用你的例子来说明。

    L = λp. (λxyz. (x y) (x p) (p z)),
        where λxyz. is a shorthand for λx. λy. λz.   
    

    然后,P = Y L,展开YL,我们得到:

    P = (λf. (λg. f (g g)) (λg. f (g g))) (λp. (λxyz. (x y) (x p) (p z)))
      ->β
    (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))
    // the previous line is our "unfolded" P
    

    让我们检查P 是否符合我们的要求:

    P x y z
        =   // unfolding definition of P
    (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) x y z
        ->β
    ((λp. (λxyz. (x y) (x p) (p z))) ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) x y z
        ->β
    (λxyz. (x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)) x y z
        ->β
    (x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
        =   // folding 1st occurrence of P
    (x y) (x P) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
        =   // folding 2nd occurrence of P
    (x y) (x P) (P z)
    

    Q.E.D.

    【讨论】:

      【解决方案2】:

      U-combinator 应该可以帮助您创建一个自引用的 lambda 抽象。

      这是 Ω,最小的非终止程序,很好地展示了 U 组合子。

      ((λf. (f f))
       (λf. (f f)))
      

      如果你能给它一个名字

      Ω := λf.(f f)
      

      这是你的抽象的样子

      ((λP. (P P x y z))
       (λP. λx. λy. λz. ((x y) (x P) (P z))))
      

      或者使用Ω

      λx. λy. λz. Ω (λP. λx. λy. λz. ((x y) (x P) (P z))) x y z
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        相关资源
        最近更新 更多