Lambda 微积分函数约简步骤

Lambda Calculus Function Reduction steps

我正在学习Lambda 微积分。有人可以帮忙减少吗?

(λa.((aλb.λc.c)λd.λe.d))(λf.λg.f)

实际结果为λb.λc.c。但我需要解决它的步骤

我已经完成了这些步骤,但我卡住了:

(λa.((aλb.λc.c)λd.λe.d))(λf.λg.f)
(λa.(aλb.λd.λe.d))(λf.λg.f)
(λf.λg.f)(λb.λd.λe.d)
(λg.λb.λd.λe.d)

我是不是步骤错了?有什么规则我不知道吗?

视觉评价

仅使用文本构建步骤的可视化模型可能具有挑战性。正如另一个答案所指出的,您的 () 以一种奇怪的方式使用。我希望这个答案有帮助 -

fix parens:
<del>(λa.((a λb.λc.c) λd.λe.d)) (λf.λg.f)</del>

eval:
(λa.a (λb.λc.c) (λd.λe.d)) (λf.λg.f)
                           =========
    __________________________/
   /
(λa.a (λb.λc.c) (λd.λe.d))
    =    \         \
    |     \         \ 
    |      \         \
(λf.λg.f) (λb.λc.c) (λd.λe.d)
          =========    /
    _________/  ______/
   /           /
(λf.λg.f) (λd.λe.d)
       =     \__
       |        \
(λg.(λb.λc.c)) (λd.λe.d)
               =========
   _______________/
  /
(λg.λb.λc.c)
    =======
     /
    /
λb.λc.c

更高的直觉

顺便说一下,λb.λc.c 等同于 Church's FALSEλa.λb.b。回到你原来的程序,给定 Church 的布尔值 -

true := λa.λb.a
false := λa.λb.b

取原表达式-

(λa.a (λb.λc.c) (λd.λe.d)) (λf.λg.f)

使用 truefalse 重写 -

(λa.a false true) true

计算为 -

true false true

计算为 -

false

我们了解到 (λa.a false true) 为我们提供了布尔值的倒数。我们可以将其命名为 not -

true := λa.λb.a
false := λa.λb.b
not := λp.p false true

它是这样工作的-

not true //=> false
not false //=> true