例を参考にしてみましょう。 2
を[1,2,3]
から削除するとします。プロローグは、最初の答えを見つけた後2
はそれ尾T=[3]
(のメンバーであれば、それは、チェックをバックトラック
remove1(2,[1,2,3],R):
fail. % clause 1
fail. % clause 2
2 \= 1, remove1(2,[2,3],R'): % clause 3
fail. % clause 1
R = [1,3] % clause 2
2 \= 2... fail. % clause 3
\+member(2,[3]),R=[1,2,3] % clause 4
\+member(2,[2,3])... fail. % clause 4
(太字に入れ答え)
:そして、Prologは、このようにそれを評価します。そうではありません)。したがって、[1,2,3]
も答えであると回答します(最後の節に基づいて)。
なぜ私が最後の節を追加したのか不思議です。 2
が見つからない場合、Prologはリストに回答していました。したがって、プログラム:
remove1(X,[],[]).
remove1(X,[X|T],T).
remove1(X,[H|T],[H|R]):-
X \= H,
remove1(X,T,R).
でも十分でしょう。
ただし、1つのオカレンス「」が削除された場合にのみ、照会には「」が続くようにするには、最初の照会も削除する必要があります。だから、:
remove1_force(X,[X|T],T).
remove1_force(X,[H|T],[H|R]):-
X \= H,
remove1(X,T,R).
両方の述部のみがリストにX
の最初の発生を削除します。だからremove1_force(1,[1,2,3,1,2,3],R)
。回答は1つだけです:R = [2,3,1,2,3]
。
Prologは最後のブランチをバックトラックして取ります。とにかく最後のブランチを使うのはなぜですか? –