私は現在 Prolog を勉強しています。私が読んでいるメモの 1 つで、カット演算子を正しく使用する方法の例が示されています。リストから特定の値のすべての要素を削除するには、次の関数を検討してください。
rm(_,[],[]).
rm(A,[A|L],R) :- rm(A,L,R).
rm(A,[B|L],[B|R]) :- rm(A,L,R).
バックトラッキングのため、これは関数の正しい定義ではありません。関数は、特定の値のいくつかの要素を削除して取得したリストのすべてのサブリストを返しますが、必ずしもすべてではありません。私が読んでいるメモによると、これを修正する正しい方法は、2行目を次の行に置き換えることです
rm(A,[A|L],R) :- !, rm(A,L,R)
しかし、その行を
rm(A,[A|L],R) :- rm(A,L,R), !
は正しくありません。2 番目の例が関数を修正するための間違った方法である理由がわかりません。swipl では、これらの修正で第 2 項を置き換えると、私が検討するテスト ケースで常に同じ答えが返されるようです。ここで何が欠けていますか?