リストからある値の要素をすべて除去する述語 removeを使って、
[a:1, a:1, a:2, b:2] から「a:_」を取り除く場合。
定義1、定義2 では a:2 が残る。(a:1 を除去する段階で _ が 1 に単一化されるため)
定義3 なら a:1, a:2 が両方消える。
リストからある値の要素をすべて除去する述語 removeを使って、
[a:1, a:1, a:2, b:2] から「a:_」を取り除く場合。
定義1、定義2 では a:2 が残る。(a:1 を除去する段階で _ が 1 に単一化されるため)
定義3 なら a:1, a:2 が両方消える。
% テストデータ ls([a:1, a:1, a:2, b:2]). % 定義1 - 等号の失敗を使って排除 remove_v1(_, [], []). remove_v1(E, [E|L1], L2 ) :- remove_v1(E, L1, L2). remove_v1(E, [H|L1], [H|L2]) :- \+(E = H), remove_v1(E, L1, L2). ?- ls(Src), setof(L, remove_v1(a:_, Src, L), [[a:2, b:2]]). % 定義2 - 単一化の失敗とカットを使って排除 remove_v2(_, [], []). remove_v2(E, [E|L1], L2) :- !, remove_v2(E, L1, L2). remove_v2(E, [H|L1], [H|L2]) :- remove_v2(E, L1, L2). ?- ls(Src), setof(L, remove_v2(a:_, Src, L), [[a:2, b:2]]). % 定義3 - 「単一化できない要素」全体を求める remove_v3(Val, Ls, Rs) :- findall(E, (member(E, Ls), E \= Val), Rs). ?- ls(Src), setof(L, remove_v3(a:_, Src, L), [[b:2]]).