正常顺序的步骤比应用顺序少的示例?

An example of where normal order has less steps than applicative order?

我似乎想不出这样的例子,想知道是否有这样的例子?我知道如果我有一个表达式,其中应用顺序不会终止,那么正常顺序可能仍会终止。我想知道是否有一个例子,两个订单都终止但正常订单的步骤更少。

(λ p. λ q. q) ((λ x. λ y. λ z. ((x y) z)) (λ w. λ v. w))

有一些空格:

(λ p. 
   λ q.
     q
)
(
  (λ x.
     λ y.
       λ z.
         ((x y) z)
   )
   (λ w.
      λ v.
        w
   )
)

按照正常顺序,可以先进行最外层的归约,一步直接归约到恒等组合子。应用顺序也会到达那里,但需要更长的时间,因为需要首先评估 x-y-z-w-v 表达式。

请注意,x-y-z-w-v 表达式甚至都没有使用。您可以将正常顺序视为一种惰性求值:表达式仅在使用时才求值或归约。因此,您只需构建一个不使用其中一个参数的公式,您就会立即获得这种效率取胜的示例。

在 lambda 表达式中,抽象中绑定的任何变量都可以在抽象主体中使用零次或多次。

  • 正常顺序 计算参数 n 次,其中 n 是它在正文中使用的次数。
  • 应用顺序 仅对参数求值一次,无论它在正文中使用的次数如何。

比较

  1. 如果使用参数 exactly once,正常顺序和应用顺序将具有相同的性能。
  2. 如果参数被使用多次,应用顺序会更快。
  3. 如果使用参数零次,正常顺序会更快。