Lambda calculus 用于加法的教会数字

Lambda calculus 用于加法的教会数字,lambda-calculus,church-encoding,Lambda Calculus,Church Encoding,我在接下来的步骤中遇到了麻烦。如果有人能帮我,那就太好了: 2 = λfx.f(f x) 3 = λfx.f(f(f x)) ADD = λm n f x. m f (n f x) 我的步骤是: (λm n f x. m f (n f x)) (λf x.f(f(f x))) (λf x.f(f x)) -> ((λn f x. (λf x.f(f(f x))) f (n f x))) (λf x.f(f x)) -> ((λf x. (λf' x'.f'(f'(f' x')

我在接下来的步骤中遇到了麻烦。如果有人能帮我,那就太好了:

2 = λfx.f(f x)
3 = λfx.f(f(f x))
ADD = λm n f x. m f (n f x)
我的步骤是:

   (λm n f x. m f (n f x)) (λf x.f(f(f x))) (λf x.f(f x))
-> ((λn f x. (λf x.f(f(f x))) f (n f x))) (λf x.f(f x))
-> ((λf x. (λf' x'.f'(f'(f' x'))) f ((λf" x".f"(f" x")) f x)
括号可以吗? 我真的把替换和括号弄糊涂了。有没有一种正式的、更简单的方法来解决这些问题?

试试看

以下是我在鳄鱼蛋帮助下得出的步骤:

ADD 2 3
-> (λm n f x. m f (n f x)) (λf x.f(f(f x))) (λf x.f(f x))
->   (λn f x. (λf x.f(f(f x))) f (n f x))   (λf x.f(f x))
->     (λf x. (λf x.f(f(f x))) f ((λf x.f(f x)) f x)) 
->     (λf x.   (λx.f(f(f x)))   ((λf x.f(f x)) f x)) 
->     (λf x.       f(f(f(λf x.f(f x)) f x)))))
->     (λf x.       f(f(f  (λx.f(f x)) x)))))
->     (λf x.       f(f(f     (f(f x))  )))))
有没有一种正式的、更简单的方法来解决这些问题

为lambda术语编写缩略器和预打印器要比手工缩略容易得多。但是可以给你一个腿上的削减;试着为正常的订单缩减定义规则,然后你所要做的就是担心


你可能也会学到更多。

我的建议是,从我自己有限但最近的经验中:

  • 一次只做一件事:执行alpha转换、beta减少或eta转换。在页面的页边空白处记下你为到达下一行所采取的步骤。如果你对这些词不熟悉,那么它们所做的就是——看看
  • 这些缩减步骤的快速总结:

    Alpha只是指一致地更改上下文中变量的名称:

    λfx。f(fx)=>λgx。g(Gx)

    Beta仅仅意味着将lambda应用于一个参数

    (λfx.fx)b=>λx。b x

    Eta只是“展开”一个不必要的包装函数,它不会改变它的含义

    λx.f x=>f

    然后

  • 使用大量的alpha转换来更改变量的名称,以使事情更清楚。所有那些
    f
    s,总是让人困惑。您在第二行的
    上做了类似的操作

  • 假装你是一台计算机!在计算表达式时,不要向前跳或跳过一步。只需做下一件事(而且只有一件事)。只有当你有信心慢慢移动时,才能更快地移动

  • 考虑命名一些表达式,并仅在需要计算它们时用它们替换它们的lambda表达式。我通常会在页面的页边空白处用def替换为
    ,因为这实际上不是一个缩减步骤。类似于:

    add two three 
    (λm n f x. m f (n f x)) two three | by def
    
  • 遵循上述规则,下面是我的工作示例:

    two   = λfx. f (f x)
    three = λfx. f (f (f x))
    add   = λmnfx. m f (n f x)
    
    0  | add two three 
    1  | (λm n f x. m f (n f x)) two three           | by def
    2  | (λn f x. two f (n f x)) three               | beta
    3  | (λf x. two f (three f x))                   | beta
    4  | (λf x. two f ((λfx. f (f (f x))) f x))      | by def
    5  | (λf x. two f ((λgy. g (g (g y))) f x))      | alpha
    6  | (λf x. two f ((λy. f (f (f y))) x))         | beta
    7  | (λf x. two f (f (f (f x))))                 | beta
    8  | (λf x. (λfx. f (f x)) f (f (f (f x))))      | by def
    9  | (λf x. (λgy. g (g y)) f (f (f (f x))))      | alpha
    10 | (λf x. (λy. f (f y)) (f (f (f x))))         | beta
    11 | (λf x. (λy. f (f (f (f (f x))))))           | beta
    

    非常感谢。坦率地说,我不知道如何处理鳄鱼蛋!我曾经偶然发现了这些鳄鱼,但在我看来,这似乎是某个疯子的怪胎。虽然我非常了解Lambda演算,但我不知道这些鳄鱼和它有什么关系,以及它如何帮助解释它:-P我的个人我的观点是,它对理解LC并没有多大帮助,但会带来额外的混乱。我理解设计图灵机来计算“两个数字相加”“事实上,有很多很好的YouTube短片解释了这一点,但我发现很难理解Lambda微积分模型。有什么好的建议吗?10年后同样的问题。看起来PLT Redex已被移动()。