如何控制按值调用的评估顺序?

时间:2016-09-19 12:22:39

标签: lambda functional-programming lambda-calculus

我有一些关于按值lambda演算调用的问题。

1)λx。(λy.y)x是卡滞项还是应该评估为λx.x?

2)λx。(λy.y)(λz.z),这个怎么样?

3)如何控制实施中的评估顺序?

我感到很困惑,任何人都可以解释这些价值,卡住期限,评价顺序,如何控制?

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

1)λx。(λy.y)x是卡滞项还是应该评估为λx.x?

根据术语和子条款进行思考可能会有所帮助。在这里,我们有:

  • 抽象,λx。(λy.y)x,带:
    • 适用的应用程序(λy.y)x
      • λy.y(抽象,用简单的术语y)到
      • X

应用程序可以转换,因此我们得到:

  • 抽象,λx。 x,因为应用程序重写为x。这也写为组合器 I

λx。(λy.y)x是一个卡住的术语:如果一个术语无法转换,则该术语被卡住。

  

2)λx。(λy.y)(λz.z),这个怎么样?

理想情况下,您现在尝试自己动手。

我们有:

  • 抽象,λx。(λy.y)(λz.z),包含:
    • 适用的应用程序
      • 抽象λ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 analysisgraph rewriting