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 是它自己的範圍。