remove 述語の定義―リスト[a:1, a:2]から[a:_ をすべて取り除いた結果は?

リストからある値の要素をすべて除去する述語 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]]).
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX