题
pred(Args).
pred(Args) :-
goalA,
goalB,
!,
pred(Args).
pred(Args) :-
goalC,
goalD,
!,
pred(Args).
通常我会写这是关注的存储器性能的东西沿上面的代码段的线的递归谓词。随着切口被用来试图迫使尾调用优化的发生。我最近一直在经历一个大的序言代码库,并已经发现了一些例子,其中切割实际上是递归调用,而不是之前之后。据推测,这具有防止尾调用优化的情况的发生,而不是辅助它的效果。
我的问题是,我可以从递归调用后移动切立即之前它不会影响程序的含义?这是假设存在谓词的每个子句相同的相对位置的切口。
现在,我一直在想这件事多一些,我想,也许答案是“不一定”,但已经重写全部代码与呼叫前的切割和发现测试套件仍是过客,我“M也想知道是否有可能写这样的谓词其他一些深奥的原因。还是仅仅是坏的编码?
解决方案
我的猜测是,这可能是坏的编码(或误会什么笔者在做什么)
我会这么说,是因为我自己,做一次同样的错误:
HTTPS://mailbox.iai .uni-bonn.de /邮差/公共/ SWI-序言/ 2009 / 001540.html
http://xonix.habrahabr.ru/blog/60430/ (警告,俄语)
但是,从SWI邮件列表的人证实,尾递归码正确的方法是
head :-
<guard goals>, !,
<deterministic stuff>,
head.
head :-
...
不隶属于 StackOverflow