(蛇足) can_unify/2を使って、定義3のremoveを定義1,2とよく似た形で定義する。

元:「remove 述語の定義―リスト[a:1, a:2]から「a:_」をすべて取り除いた結果は?」(http://codetter.com/?p=1077)
特にメリットはない。

元:「remove 述語の定義―リスト[a:1, a:2]から「a:_」をすべて取り除いた結果は?」(http://codetter.com/?p=1077)
特にメリットはない。

  • タグ:
  • タグはありません
% can_unify/2
% 「can_unify(X, Y) が成功する」⇔「X = Y が成功する」、ただし単一化は行われない。
can_unify(X, Y) :-
	setof(Z, (Z = X, X = Y), [_|_]).
	
?- can_unify(a:_, a:1).
?- \+ can_unify(b:_, a:_).


remove(_, [], []).
remove(E, [H|Src],    Dst ) :- can_unify(E, H), !, remove(E, Src, Dst).
remove(E, [H|Src], [H|Dst]) :- remove(E, Src, Dst).

?- remove(a:_, [a:1, a:1, a:2, b:2], [b:2]).