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]]).