Когда вы используете (==)/2
для сравнения, вам понадобится противоположность в третьем правиле, то есть (\==)/2
.С другой стороны, такое определение уже не является чистым отношением.Чтобы увидеть это, рассмотрим deleteall([X],Y,Zs), X = Y.
. Для чистого отношения нам понадобятся (=)/2
и dif/2
.Многие прологи, такие как SWI, YAP, B, SICStus, предлагают dif/2
.
deleteall([],X,[]).
deleteall([H|T],X,Result) :-
H=X,
deleteall(T,X,Result).
deleteall([H|T],X,[H|Result]) :-
dif(H,X),
deleteall(T,X,Result).
Посмотрите ответы на deleteall([X,Y],Z,Xs)
!
Правка (через четыре года):
Более эффективно, но в том же духе, это можно записать с помощью if_/3
и (=)/3
:
deleteall([], _X, []).
deleteall([E|Es], X, Ys0) :-
if_( E = X, Ys0 = Ys, Ys0 = [E|Ys] ),
deleteall(Es, X, Ys).