Removing first occurrence in list - prolog

prolog

Solution

Your first one doesn't work because this doesn't make much sense:

deleteOne(Term, [Term|Tail], Result) :- 
    deleteOne(Term, [], [Result|Tail]), !.

That means the result of the next one has to have the current result as its head.

An better solution would be this:

delete_one(_, [], []).
delete_one(Term, [Term|Tail], Tail).
delete_one(Term, [Head|Tail], [Head|Result]) :-
  delete_one(Term, Tail, Result).

If you want it to be determinative, add a cut on the second clause. As is, it can do this:

?- delete_one(2, [1, 2, 3, 1, 2, 3], X).
X = [1,3,1,2,3] ? ;
X = [1,2,3,1,3] ? ;
X = [1,2,3,1,2,3] ? ;    
no

Problem

I need to remove only one occurrence in the list. Actually doesn't matter if it's first or last. One match needs to be removed. I'm having trouble understanding why the following doesn't work as intended. ``` deleteOne(_,[],[]). deleteOne(Term, [Term|Tail], Result) :- deleteOne(Term, [], [Result|Tail]), !. deleteOne(Term, [Head|Tail], [Head|TailResult]) :- deleteOne(Term, Tail, TailResult), !. ``` Output ``` 41 ?- deleteOne(5,[2,3,1,5,2,3,1],X). X = [2, 3, 1, 5, 2, 3, 1]. ``` It works when I replace term with an empty String or some random String. ``` deleteOne(Term, [Term|Tail], Result) :- deleteOne("", Tail, Result), !. ``` Output ``` 41 ?- deleteOne(5,[2,3,1,5,2,3,1],X). X = [2, 3, 1, 2, 3, 1]. ``` But I don't think this is the best solution for many reasons. Not for my current problem, but for example longer lists. Or if a list contains empty String - don't know if this is possible in Prolog. Why wont the first example work? And what other solutions are there?

Original source