我正在使用带有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
Nat
,succ
和*
定义为与Agda内部自然数定义兼容。
当我评估(pow 2 100000)
时,我收到堆栈溢出错误。但是,鉴于递归调用是尾调用,我希望agda解释器将pow'
优化为循环。
如何启用此优化?
答案 0 :(得分:1)
当前版本的Agda中未实现此优化。替代方法包括增加堆栈的大小,或者将递归重写为指数中的对数,而不是线性。
我也被告知:
问题跟踪器上的正在进行深入更改Agda.TypeChecking.Reduce的工作 模块(以及其他),希望会产生积极的影响 对内在自然物的递归也是如此。