Lambda微积分函数减少步骤

时间:2019-09-05 18:32:15

标签: lambda-calculus

我正在学习 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)

我的步骤做错了吗?有我不知道的规则吗?

1 个答案:

答案 0 :(得分:3)

视觉评估

仅使用文本来构建步骤的可视模型可能是一个挑战。作为其他答案,您的()的使用方式很奇怪。我希望这个答案有帮助-

fix parens:
(λa.((a λb.λc.c) λd.λe.d)) (λf.λg.f)

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