当我阅读 Church Rosser II 定理的时候(链接),我想知道是否存在一些加强版的定理,使其不仅表明外最约简会终止,还能告诉我们渐进时间复杂度?或者,是否可以证明按需调用策略在所有约简策略中具有最小的渐进时间复杂度?
f x y = sum [1..x] + y
g x = sum (map (f x) [1..x])
按需调用 g x
的规约将执行 O(x^2) 次加法,但实际上只需要 O(x) 次。例如,惰性 HNF 将使我们获得这种复杂度。
-- The definition f3 will get lazily refined.
let f3 y = f 3 y = sum [1,2,3] + y
g 3 = sum (map f3 [1,2,3])
= sum [f3 1, f3 2, f3 3]
-- Now let's refine f3 to HNF *before* applying it
f3 y = sum [1,2,3] + y
= 6 + y
-- And continue g 3
g 3 = sum [f3 1, f3 2, f3 3]
-- no need to compute sum [1..x] three times
= sum [6 + 1, 6 + 2, 6 + 3]
= ...
我在这里对计算顺序进行了一定程度的简化,但希望您能够理解。我们在应用函数之前将函数体规约为 HNF,从而共享不依赖于参数的任何计算。
如果您想了解更多,请参阅 Michael Jonathan Thyer 的 Lazy Specialization。
n 2 I I
其中n和2是Church整数,I是一个恒等式。我在末尾添加了两个I,否则弱规约语言会过早停止计算。
观察该项规约为
2 (2 (... (2 I))..) I
并且 (2 I) 缩减为 I。因此,通过最内层缩减,您将能够相对于 n 线性时间缩减术语。
另一方面,我邀请您在 Haskell 中执行先前的计算,您会发现缩减时间随着 n 增加呈指数增长。我留给您理解这种现象的原因。
类似的讨论已经在这个thread中进行了。