我正在学习 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)
我的步骤做错了吗?有我不知道的规则吗?
答案 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)
使用true
和false
重写-
(λ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