在Agda中启用尾调用优化

时间:2013-09-21 16:16:03

标签: agda

我正在使用带有agda-mode的Emacs,并编写了这个函数:

pow : Nat → Nat → Nat
pow m n = pow' 1 m n
          where
            pow' : Nat → Nat → Nat → Nat
            pow' acc _ zero = acc
            pow' acc m (succ n) = pow' (m * acc) m n

Natsucc*定义为与Agda内部自然数定义兼容。

当我评估(pow 2 100000)时,我收到堆栈溢出错误。但是,鉴于递归调用是尾调用,我希望agda解释器将pow'优化为循环。

如何启用此优化?

1 个答案:

答案 0 :(得分:1)

当前版本的Agda中未实现此优化。替代方法包括增加堆栈的大小,或者将递归重写为指数中的对数,而不是线性。

我也被告知:

  

正在进行深入更改Agda.TypeChecking.Reduce的工作   模块(以及其他),希望会产生积极的影响   对内在自然物的递归也是如此。

问题跟踪器上的

Ticket