我需要从列表中仅删除一个匹配项,无论它是第一个还是最后一个都无所谓,只需删除一个匹配项。
我不明白为什么以下代码不能按照预期工作。
deleteOne(_,[],[]).
deleteOne(Term, [Term|Tail], Result) :-
deleteOne(Term, [], [Result|Tail]), !.
deleteOne(Term, [Head|Tail], [Head|TailResult]) :-
deleteOne(Term, Tail, TailResult), !.
输出
41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 5, 2, 3, 1].
当我将term替换为空字符串或随机字符串时,它就能正常工作。
deleteOne(Term, [Term|Tail], Result) :-
deleteOne("", Tail, Result), !.
输出
41 ?- deleteOne(5,[2,3,1,5,2,3,1],X).
X = [2, 3, 1, 2, 3, 1].
但是我认为这并不是最好的解决方案,有很多原因。不仅仅是针对我的当前问题,还有例如更长的列表。或者如果一个列表包含空字符串-不知道在Prolog中是否可能。
为什么第一个例子不能工作?还有其他解决方案吗?