Forall 而不是故障驅動的迴圈

一些經典Prolog 教科書仍然使用容易混淆且容易出錯的故障驅動迴圈語法,其中 fail 構造用於強制回溯以將目標應用於生成器的每個值。例如,要列印達到給定限制的所有數字:

fdl(X) :- between(1,X,Y), print(Y), fail.
fdl(_).

絕大多數 Modern Prolog 不再需要這種語法,而是提供更高階的謂詞來解決這個問題。

nicer(X) :- forall(between(1,X,Y), print(Y)).

這不僅更容易閱讀,而且如果使用可能失敗的目標代替列印,它的失敗將被正確檢測並傳遞 - 而失敗驅動迴圈中的目標失敗與強制失敗混淆驅動迴圈。

Visual Prolog 有這些迴圈的自定義語法糖,結合函式謂詞(見下文):

vploop(X) :- foreach Y = std::fromTo(1,X) do
                 console::write(X)
             end foreach.

雖然這看起來像一個勢在必行迴圈,它仍沿用 Prolog 的規則:尤其是每次迭代的 foreach 是它自己的範圍。