我有一些关于按值lambda演算调用的问题。
1)λx。(λy.y)x是卡滞项还是应该评估为λx.x?
2)λx。(λy.y)(λz.z),这个怎么样?
3)如何控制实施中的评估顺序?
我感到很困惑,任何人都可以解释这些价值,卡住期限,评价顺序,如何控制?
提前致谢!
答案 0 :(得分:1)
1)λx。(λy.y)x是卡滞项还是应该评估为λx.x?
根据术语和子条款进行思考可能会有所帮助。在这里,我们有:
应用程序可以转换,因此我们得到:
λx。(λy.y)x是不一个卡住的术语:如果一个术语无法转换,则该术语被卡住。
2)λx。(λy.y)(λz.z),这个怎么样?
理想情况下,您现在尝试自己动手。
我们有:
我们可以使用y =(λz.z)变换应用程序并得到:λx。(λz.z),可以缩短为λxz.z或 K * 。
3)如何控制实施中的评估顺序?
你做不到。 Lambda演算没有定义它。它是一种计算模型,而不是一种编程语言。由于lambda演算是confluent,如果一个术语的任何评估产生正常形式,它将产生相同的正常形式。换句话说,每个术语最多只有一个普通形式,但可能存在无限的评估路径。
例如,术语KIΩ具有无限减小路径,因为它减少到自身(通过将Ω≡ωω≡(λz.zz)(λz.zz)减少到自身),同时它也可以减少到I应用K≡λxy.x。
因此,基于lambda演算的语言中的技巧是选择一种评估策略,如果存在,将产生正常形式。最基本的策略是"leftmost outermost"策略,也称为正常顺序评估,它总是选择可以应用的最左边的λ抽象。它是低效的,但保证在存在时产生正常形式。
在编程语言中,必须应用技巧才能提高评估效率。最常见的是,这包括strictness analysis和graph rewriting。