3

そのため、Prolog インタープリターは Last Call Optimization を実装しています。

length([], Acc, Acc).
length([_|T], Acc, X) :- NewAcc is Acc+1, length(T, NewAcc, X).

O(1)空間で呼び出すことができます。

ただし、デバッグモードに入ると、これは無効になります。

私の質問はただ「なぜ?」です。確かにこれはデバッグのポイント全体を壊しますか? プログラムが正常に動作していることを確認できなくなりました...?

4

1 に答える 1

1

最後の呼び出しの最適化よりもむしろ選択ポイントの除去。デバッガーが Byrds ボックス モデルのすべてのポートを提供したい場合、つまり:

          +--------+
   Call ->|        |-> Exit
          |        |
   Fail <-|        |<- Redo
          +--------+

彼には追加の選択ポイントが必要です。したがって、デバッグ中に無駄になるのは、最後の呼び出しの最適化だけでなく、選択ポイントの最適化でもあると思います。

length/2 の例では、インスタンス化された最初の引数で length/2 を呼び出すと、インデックス付けによって選択ポイントを削除できます。

SWI-Prologs デバッガーなど、通常のインタープリターの選択ポイントの除去にある程度従うデバッガーがいくつかあります。そのため、SWI-Prolog では常にすべてのポートが表示されるわけではありません。

さよなら

于 2015-08-18T09:15:19.620 に答える