Re: negotiation by failure- list operations




matthiasse@xxxxxxx wrote:
> even with
>
> member(X,[X|T]).
> member(X,[H|T]) :- member(X,T).
>
> delete1(X,List,List) :- member(X,List),!.

You missed out the \+ in front of member.

The following code does work:

member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

delete1(X,List,List) :-
\+ member(X,List),!.
delete1(X,List,ListWithoutX) :-
delete(X, List, ListWithoutX).

% strange version of delete that only deletes
% the first matching element...
delete(E,[E|T],T).
delete(E,[H|T],[H|DT]) :-
delete(E,T,DT).


Usually delete/3 is defined to delete all matching elements, unlike the
definition above. But I think the definition above was implied by the
first post, otherwise there would be no need to check for
not-membership beforehand. (The normal version of delete/3 needs 2
recursive clauses and one base case but no doubt I've said too much
already :-))

Regards, Brian.

.